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
Bild an Drucker senden
Die Antwort ist auf jeden Fall abhängig vom Betriebssystem. Welches verwendest Du denn?
- 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:
Das nimmt eine Bilddatei als Argument.
Code: Alles auswählen
#!/bin/sh
convert $1 /tmp/blablabla.eps
lpr /tmp/blablabla.eps
rm /tmp/blablabla.eps
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

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
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.
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.
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
Lg
- 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.
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://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.

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.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
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
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
- 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

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.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
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)
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.
Also ich habe es nun mal so probiert:
Jedoch mit wenig Erfolg, hierbei leuchtet nur die Error LED auf
Lg cool_zero
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)
Lg cool_zero
Hello,
Das habe ich schon probiert, in meinem vorherigen Post definiere ich diesen mit dem Befehl und dem Bitmuster 0x93 von DirJoghurt 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.
Was ist xL? Was ist n? was ist d?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)))
Verrate uns doch, WAS für einen Drucker du hast, am besten, du verlinkst zur Anleitung
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.
"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.
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.
@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.
Ä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
als Bitmap in den Speicher bekommst, der Code wäre aber zu lang geworden.
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
Also ich habe jetzt mal deinen code probiert
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
Code: Alles auswählen
cmd = ''.join(map(chr, (0x1c, 0x71, 1, 1, 0, 1, 0, 0,255,0,255,0,255,0,255))) /code]
Verstehst du den Syntax Befehl? Kannst Du mir den ev. erklären?
Lg