Bild an Drucker senden

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
cool_zero
User
Beiträge: 23
Registriert: Mittwoch 14. Juni 2006, 14:33

Hey @all,

ich bin noch sehr neu in Python und wollte mal Fragen wie ich es bewerkstelligen kann ein BMP oder GIF Bild über die Konsole zu einem Drucker zu senden.

Kann mir diesbezüglich bitte jemand helfen

Vielen dank im Voraus

Lg cool_zero
BlackJack

Die Antwort ist auf jeden Fall abhängig vom Betriebssystem. Welches verwendest Du denn?
cool_zero
User
Beiträge: 23
Registriert: Mittwoch 14. Juni 2006, 14:33

Hallo,

ich verwende Linux und sonstige Unix-like systems

Lg
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Also wenn du einfach nur aus der Kommandozeile drucken willst und ImageMagick installliert hast (ist meistens schon da), tut's ein einfaches Shell-Script. Ungetestet und ausbaufaehig:

Code: Alles auswählen

#!/bin/sh

convert $1 /tmp/blablabla.eps
lpr /tmp/blablabla.eps
rm /tmp/blablabla.eps
Das nimmt eine Bilddatei als Argument.
cool_zero
User
Beiträge: 23
Registriert: Mittwoch 14. Juni 2006, 14:33

Naja so einfach ist es leider nicht, ich muss dies mit Python erledigen und habe diesbezüglich nur die Dokumentation vom Druck und die enthaltenen Steuercodes. Aber da ich mit sowas noch nie was zu tun gehabt habe stehe ich momentan absolut am Schlauch :-(

Ich muss das Bild quasi per Python und den Druckersteuercodes ausdrucken, nur weiß ich eben nicht wie. Also Bilder können BMP und GIF Dateien gewählt werden. Soll aber nicht heißen das es später nicht auch für anderen Dateitypen gehen soll. Nur denke ich mal das diese 2 am einfachsten für den Anfang sind.

Der Drucker ist ein Thermodrucker und hängt an USB.

Lg
BlackJack

Glaub mir, das willst Du nicht selbst erledigen. Du müsstest einen Dekoder für die Bildformate und einen Druckertreiber für Deinen Drucker in Python programmieren wenn Du keine zusätzliche Software benutzen willst.

ImageMagick's ``convert`` ist schon eine gute Wahl. Man könnte sicher auch etwas mit den NetPBM Tools basteln, das ist aber auf jeden Fall aufwändiger.
cool_zero
User
Beiträge: 23
Registriert: Mittwoch 14. Juni 2006, 14:33

Ja, aber die Frage ob "ich" das will stellt sich hier nicht. Ich habe hier mit dieser Spezifikation eine Abgabe in ein paar Tagen, und so wird es eben verlangt. Deswegen hätte ich hier gerne unterstützende Hände, die mir helfen das Problem zu lösen.

Lg
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi cool_zero!

http://www.imagemagick.org/script/api.php#python
http://www.reportlab.org/
http://wiki.wxpython.org/index.cgi/Printing
http://wiki.wxpython.org/index.cgi/More ... OnPrinting

Du hast uns so gut wie keine Informationen gegeben. :evil: Wir wissen nicht einmal ob es ein Drucker ist, der nur Drucken kann oder ob er Sonderfunktionen hat, die extra angesteuert werden müssen. Z.B. Kassenladen öffnen oder Ticket abschneiden oder RFID-Chip auslesen,...

Was für ein Drucker? Gibt es eine Anleitung oder ein Programmbeispiel in einer anderen Programmiersprache? Gibt es so eine Art Linux-Treiber für das Ding? Alles Fragen, die offen blieben.

Um einfach nur ein Bild auf dem Drucker auszudrucken ist Rebecca's Beispiel ideal. Und dass es unbedingt eine Python-Lösung sein muss ist gequirlte Scheiße, wenn es nur darum geht, ein Bild auszudrucken. Wenn es denn sein muss, dann führe doch die Befehle mit "os.system()" aus.

Wenn aber auch noch Text dazu kommen soll, wird es schon schwieriger. Wenn dann auch noch mit einem Kommando an den Drucker z.B. eine Kassenlade geöffnet werden soll, dann ist das für einen Anfänger in ein paar Tagen wahrscheinlich nicht schaffbar. Du musst nämlich testen, welche Art, dem Drucker Daten zu schicken, auch wirklich die Sonderkommandos weiter gibt. Ich kenne Bondrucker, die lassen sich definitiv nur unter Windows einsetzen, da die Sonderkommandos vom Windowstreiber ausgewertet werden und nicht vom Drucker.

Ansonsten, hier ein paar der Möglichkeiten, die mir auf die Schnelle eingefallen sind. Welche dieser Methoden auch spezielle Druckersteuercodes an den Drucker weitergibt, muss man ausprobieren.

- Bringe den Drucker unter Cups zum Laufen. Schaffe es, dass du
einen Text und ein Bild z.B. mit OpenOffice ausdrucken kannst.

Variante 1:
- Erstelle z.B. mit Reportlab eine PDF-Datei
- Drucke diese PDF-Datei mit "lpr" aus.

Variante 2:
- Erstelle eine HTML-Datei mit dem Bild und drucke diese mit wxPython (wx.html.HtmlEasyPrinting()) aus.

Variante 3:
- Erstelle eine HTML-Datei mit dem Bild und drucke diese mit wxPython (wx.html.HtmlPrintout() und wx.Printer()) aus.

Variante 4:
- Zeichne mit wxPython in einen wx.PrinterDC() den gewünschten Text und das gewünschte Bild und drucke es aus.

Variante 5:
- Verwende PIL und drucke mit "lpr" das erstellte Bild aus. (garantiert keine Weitergabe von Druckercodes möglich)

mfg
Gerold
:-)

PS: Für Windows habe ich dafür simplewinprint entwickelt. http://www.python-forum.de/topic-3155.html Damit können Sonderkommandos an z.B. Bondrucker weitergegeben werden. Mit Spezialdruckern unter Linux habe ich keine Erfahrung.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
cool_zero
User
Beiträge: 23
Registriert: Mittwoch 14. Juni 2006, 14:33

Danke vielmals und Sorry

Also das ganze ist ein Kassadrucker, dazu kommt das das Logo von der jeweiligen Firma mit ausgedruckt werden soll. Der Drucker ist ein SRP-350.

Laut der Angabe ist es ein "NV bit image" ich habe jedoch nur die Python schnittstelle dafür zur verfügung, da die kassa minimal ausgestattet ist.

Ich weiß damit jedoch nichts anzufangen.

Trotzdem Danke
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

http://quad.de/ftp/index.php

Suche nach "Linux". Vielleicht ist dieser Treiber brauchbar.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
cool_zero
User
Beiträge: 23
Registriert: Mittwoch 14. Juni 2006, 14:33

Danke,

wie gesagt habe ich bereits die Druckersteuercodes,
mir geht es nur mehr darum mit diesen Druckersteuercodes
ein Bild auszudrucken.

Lg cool_zero
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Ich würde einfach mal versuchen, nach dem Steuercode das Bild als die entsprechende Bitfolge zu senden. Z.B.
Schwarz-Weiss-Weiss-Schwarz-Weiss-Weiss-Schwarz-Schwarz wäre 10010011b = 0x93
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Ich hab mal ein bisschen gegooglet, und es scheint, dass mit "NV" "non-volatile" (also Speicher, der auch ohne Strom die Daten behält) gemeint ist.

Schau nochmal in der Druckerspezifikation nach, du müsstest auch einen Befehl "Store/Define NV bit image" finden. Diesen musst du aufrufen, um das Bitmap in den NV-Speicher schreiben zu können (dann als normales 1-bit bitmap)

Später brauchst du dann nur noch den Print NV bit image Befehl abzusetzen, und der Drucker druckt das gespeicherte Bild.

Mehr Infos, zum Beispiel welchen Drucker du hast, wären sicherlich von Vorteil.

(Zum Testen würde ich als Bitmapdaten einfach mal eine Folge von 01010101b = 0x55 nehmen. Auf dem Ausdruck müssten dann linien zu sehen sein; Vorteil gegenüber 11111111b = 0xff ist, dass so aus was gedruckt wird, wenn der Drucker seltsamerweise eine 1 als Weiss und 0 als Schwarz definiert hat)
Zuletzt geändert von Joghurt am Montag 19. Juni 2006, 09:35, insgesamt 1-mal geändert.
cool_zero
User
Beiträge: 23
Registriert: Mittwoch 14. Juni 2006, 14:33

Also ich habe es nun mal so probiert:

Code: Alles auswählen

            # Define NV bit image
            # Command = 1C 71 n [xL xH yL yH d1...dk]1...[xL xH yL yH d1...dk]n
            cmd = ''.join(map(chr, (0x1c, 0x71, 1, 2, 0, 2, 0, 0x93)))
            prn.add(cmd)

            # Print NV bit image    
            # Command = 1C 70 n m
            # FS = 1C
            # p   = 70
            # n   = n
            # m  = m

            cmd = ''.join(map(chr, (0x1c, 0x70, 1, 0)))
            prn.add(cmd)
Jedoch mit wenig Erfolg, hierbei leuchtet nur die Error LED auf

Lg cool_zero
cool_zero
User
Beiträge: 23
Registriert: Mittwoch 14. Juni 2006, 14:33

Hello,
Joghurt hat geschrieben:Ich hab mal ein bisschen gegooglet, und es scheint, dass mit "NV" "non-volatile" (also Speicher, der auch ohne Strom die Daten behält) gemeint ist.

Schau nochmal in der Druckerspezifikation nach, du müsstest auch einen Befehl "Store/Define NV bit image" finden. Diesen musst du aufrufen, um das Bitmap in den NV-Speicher schreiben zu können (dann als normales 1-bit bitmap)

Später brauchst du dann nur noch den Print NV bit image Befehl abzusetzen, und der Drucker druckt das gespeicherte Bild.

Mehr Infos, zum Beispiel welchen Drucker du hast, wären sicherlich von Vorteil.
Das habe ich schon probiert, in meinem vorherigen Post definiere ich diesen mit dem Befehl und dem Bitmuster 0x93 von Dir
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

cool_zero hat geschrieben:

Code: Alles auswählen

            # Define NV bit image
            # Command = 1C 71 n [xL xH yL yH d1...dk]1...[xL xH yL yH d1...dk]n
            cmd = ''.join(map(chr, (0x1c, 0x71, 1, 2, 0, 2, 0, 0x93)))
Was ist xL? Was ist n? was ist d?

Verrate uns doch, WAS für einen Drucker du hast, am besten, du verlinkst zur Anleitung
Mad-Marty
User
Beiträge: 317
Registriert: Mittwoch 18. Januar 2006, 19:46

Hmmm das ganze riecht nach
"jetzt ist in einer woche studienabgabe und ich muss anfangen was zu machen"


Auch das du absolut nicht weisst wie du ihn ansteuern sollst ist problematisch.

Da muss es doch wenigstens mal ein beispiel gegeben haben ?
Poste das mal.

Tja so ohne alles wirst du das wohl nicht mehr schaffen.
cool_zero
User
Beiträge: 23
Registriert: Mittwoch 14. Juni 2006, 14:33

Also es handelt sich um einen Thermodrucker (SRP-350) die Anleitung der Steuercodes befindet sich hier: http://www.tauris.com/support/bondrucke ... nglish.pdf

@Mad-Marty... Nein es handelt sich nicht um eine Studienabgabe, da ich kein Student bin studiere ich somit auch nicht ;-)

Das ganze ist ein "Firmen" - Projekt, und da ich neu in Python bin und ich mit solcher Thematik noch nie was zu tun gehabt habe ist es für mich eben schwieriger dieses Problem zu lösen.
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Ähm... Wenn du ein 16x16 Image erzeugen willst, musst du auch 4 Bytes angeben.Oh, und anscheinend kann der Drucker doch 8-bit Graustufen. Dass heisst, statt einer 1 musst du 255 verwenden

Code: Alles auswählen

cmd = ''.join(map(chr, (0x1c, 0x71, 1, 1, 0, 1, 0,   0,255,0,255,0,255,0,255))) /code]

Das musst du übrigens nur ein einziges mal machen.

Wenn du das Bitmap eh jedesmal übertragen willst (z.B, weil es sich oft ändert), kannst du auch ein "downloaded image" nehmen: (Seite 21 in dem PDF) Allerdings kannst du da nur kleinere Bilder nehmen.

Ich wollte jetzt noch Code posten, wie du [url=http://de.wikipedia.org/Tux]Tux
als Bitmap in den Speicher bekommst, der Code wäre aber zu lang geworden.
cool_zero
User
Beiträge: 23
Registriert: Mittwoch 14. Juni 2006, 14:33

Also ich habe jetzt mal deinen code probiert

Code: Alles auswählen

cmd = ''.join(map(chr, (0x1c, 0x71, 1, 1, 0, 1, 0,   0,255,0,255,0,255,0,255))) /code] 
Jedoch leuchtet da nur die ERROR-led und sonst tut sich gar nichts bis auf das, das ich den Durcker aus und wieder einschalten muss.

Verstehst du den Syntax Befehl? Kannst Du mir den ev. erklären?

Lg
Antworten