Ich habe versucht, eine Möglichkeit zu finden, eine PDF-Datei mit Python unter Windows zu drucken.
Dieses Mal rufen wir eine externe Anwendung zum Drucken auf.
Nachtrag: 03.07.2015: Der Beispielcode kann mit
python [Dateiname]
erstellt werden. Einige sind unterschiedlich und es sind keine Ausnahmen enthalten. Bitte überprüfen Sie den Code für Details.
Befehlszeilenoptionen für Acrobat und Adobe Reader
Adobe Reader und Adobe Acrobat verfügen über Befehlszeilenoptionen. Sie können es in einem anderen Prozess (Instanz) starten oder den Druckvorgang so ausführen, wie er ist.
Das Beispiel hier verwendet Adobe Acrobat. (Acrobat.exe
) Adobe Reader verwendet AcroRd32.exe
. Der Installationspfad hängt auch von der Version ab. Ist der Nachteil, dass das Urteil problematisch ist?
Referenz: PDFs mit Python drucken? | GeoNet
https://gist.github.com/hrsano645/ddd5c111204338576404
# coding: utf-8
from __future__ import division, print_function, absolute_import, unicode_literals
import subprocess
import sys
# ref: https://geonet.esri.com/thread/59446
# ref: https://helpx.adobe.com/jp/acrobat/kb/510705.html
def main(pdffile):
# acroread = r'C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe'
acrobat = r'C:\Program Files (x86)\Adobe\Acrobat 11.0\Acrobat\Acrobat.exe'
# '"%s"'is to wrap double quotes around paths
# as subprocess will use list2cmdline internally if we pass it a list
# which escapes double quotes and Adobe Reader doesn't like that
cmd = '"{}" /P "{}"'.format(acrobat, pdffile)
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = proc.communicate()
exit_code = proc.wait()
if __name__ == '__main__':
pdffile = sys.argv[1]
main(pdffile)
Diese Methode erfordert einen Druckernamen. (Ich habe nicht überprüft, ob es keine gibt. Bitte kommentieren Sie jemanden)
https://gist.github.com/hrsano645/a16c3f35deac04b2b4d9
# coding: utf-8
from __future__ import division, print_function, absolute_import, unicode_literals
import subprocess
import sys
# ref: https://geonet.esri.com/thread/59446
# ref: https://helpx.adobe.com/jp/acrobat/kb/510705.html
def main(pdffile, printer_name):
# acroread = r'C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe'
acrobat = r'C:\Program Files (x86)\Adobe\Acrobat 11.0\Acrobat\Acrobat.exe'
# '"%s"'is to wrap double quotes around paths
# as subprocess will use list2cmdline internally if we pass it a list
# which escapes double quotes and Adobe Reader doesn't like that
cmd = '"{}" /N /T "{}" "{}"'.format(acrobat, pdffile, printer_name)
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = proc.communicate()
exit_code = proc.wait()
if __name__ == '__main__':
pdffile = sys.argv[1]
printer_name = sys.argv[2]
main(pdffile, printer_name)
Verwenden Sie ShellExecute in der in Pywin32 verfügbaren Windows-API.
Mit ShellExecute können Sie open zum Öffnen in der zugehörigen Anwendung und print to print verwenden.
Es scheint mit diesem Skript zu funktionieren, aber in meiner Umgebung gab es Zeiten, in denen ich drucken konnte und Zeiten, in denen ich nicht konnte.
Referenz:
https://gist.github.com/hrsano645/b69b071de4b8cb59cbe9
# coding: utf-8
from __future__ import division, print_function, absolute_import, unicode_literals
# ref: http://timgolden.me.uk/python/win32_how_do_i/print.html
# ref: http://docs.activestate.com/activepython/2.7/pywin32/win32api__ShellExecute_meth.html
import win32api
import sys
if __name__ == '__main__':
pdf_file_name = sys.argv[1]
win32api.ShellExecute(0, "print", pdf_file_name, None, ".", 0)
Drucken Sie mit einer Befehlszeilenanwendung namens GSPrint (im Lieferumfang von GSView enthalten), die Ghostscript verwendet.
Installieren Sie zuerst Ghostscript und GSView. (Die zum Zeitpunkt der Überprüfung verwendete Version ist die Originalversion, aber ich denke, die japanische Version ist wahrscheinlich dieselbe.)
Ghostscript 9.16 and GSview 5.0 J (Official Site)
Verwenden Sie dann das Unterprozessmodul, um den Befehl auszuführen.
Wenn Sie die Option -query nicht angeben, wird sie unverändert gedruckt.
https://gist.github.com/hrsano645/fe73570d0d5d8df4863a
# coding: utf-8
from __future__ import division, print_function, absolute_import, unicode_literals
import subprocess
import sys
# ref: http://stackoverflow.com/questions/4498099/silent-printing-of-a-pdf-in-python
# ref: http://stackoverflow.com/questions/1462842/print-pdf-document-with-pythons-win32print-module
def main(pdffile):
gsprint = r"C:\Program Files\Ghostgum\gsview\gsprint.exe"
# -Rufen Sie die Druckerliste mit der Option quert auf
cmd = '"{}" -query "{}"'.format(gsprint, pdffile)
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = proc.communicate()
exit_code = proc.wait()
if __name__ == '__main__':
pdffile = sys.argv[1]
main(pdffile)
Da die Einstellung des Papierformats zum Zeitpunkt des Drucks nicht aktiviert werden kann, scheint es keine andere Wahl zu geben, als die Vergrößerung / Verkleinerung auf der Druckerseite einzustellen, nachdem der Druckdialog mit -query angezeigt wurde. Der von mir verwendete PX-1700F funktioniert jedoch aus irgendeinem Grund nicht, selbst wenn er vergrößert und gedruckt ist. Ist dies ein Problem auf der Druckerseite?
(Ich habe es später versucht, aber wenn das Papierformat des Druckers und das in der Datei festgelegte Papierformat übereinstimmen, wird es wunderbar gedruckt.)
Zum Zeitpunkt des Drucks war die Farbe monochrom, daher kann es erforderlich sein, sie auf der GSPrint-Seite im Voraus anzugeben. (Ich habe es nicht im Detail überprüft, aber wenn Sie sich die Optionen ansehen, müssen Sie es festlegen.)
Referenz:
Es scheint eine andere Möglichkeit zu geben, dies mit dem in Python verfügbaren GUI-Toolkit zu tun. Ich habe so etwas in wxpython und pyqt (pyside) gefunden, aber ich habe es noch nicht überprüft. Wenn ich es überprüfen kann, werde ich die Fortsetzung schreiben.
Wenn Sie eine gute Druckmethode kennen, würde ich mich freuen, wenn Sie sie in die Kommentare schreiben könnten.
Recommended Posts