J'ai essayé de trouver un moyen d'imprimer un PDF en utilisant Python sur Windows.
Cette fois, nous appellerons une application externe pour imprimer.
Addendum: 03/07/2015: L'exemple de code peut être fait avec
python [filename]
. Certains sont différents et aucune exception n'est incluse. Veuillez vérifier le code pour plus de détails.
Options de ligne de commande Acrobat et Adobe Reader
Adobe Reader et Adobe Acrobat ont des options de ligne de commande. Vous pouvez le démarrer dans un autre processus (instance) ou lancer l'impression telle quelle.
L'exemple ici utilise Adobe Acrobat. (ʻAcrobat.exe) Adobe Reader utilise ʻAcroRd32.exe
. Le chemin d'installation dépend également de la version. L'inconvénient est-il que le jugement est gênant?
Référence: Imprimer des PDF avec Python? | 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)
Cette méthode nécessite un nom d'imprimante. (Je n'ai pas vérifié s'il n'y en a pas. Veuillez commenter quelqu'un)
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)
Utilisez ShellExecute dans l'API Windows disponible dans Pywin32.
Avec ShellExecute, vous pouvez utiliser open pour ouvrir dans l'application associée et imprimer pour imprimer.
Cela semble fonctionner avec ce script, mais dans mon environnement, il y avait des moments où je pouvais imprimer et des moments où je ne pouvais pas.
référence:
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)
Imprimez à l'aide d'une application de ligne de commande appelée GSPrint (incluse avec GSView) qui utilise Ghostscript.
Tout d'abord, installez Ghostscript et GSView. (Celle utilisée au moment de la vérification est la version originale, mais je pense que la version japonaise est probablement la même)
Ghostscript 9.16 and GSview 5.0 J (Official Site)
Utilisez ensuite le module de sous-processus pour exécuter la commande.
Si vous ne spécifiez pas l'option -query, elle sera imprimée telle quelle.
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"
# -Appelez la liste des imprimantes avec l'option quert
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)
Remarque importante, étant donné que le réglage du format de papier au moment de l'impression ne peut pas être utilisé, il semble qu'il n'y ait pas d'autre choix que de régler l'agrandissement / la réduction côté imprimante après l'affichage de la boîte de dialogue d'impression avec -query. Cependant, le PX-1700F que j'utilise ne fonctionne pas pour une raison quelconque, même s'il est agrandi et imprimé. Est-ce un problème côté imprimante?
(Je l'ai essayé plus tard, mais si le format de papier de l'imprimante et le format de papier défini dans le fichier correspondent, il s'imprime magnifiquement.)
Au moment de l'impression, la couleur était monochrome, il peut donc être nécessaire de la spécifier à l'avance côté GSPrint. (Je ne l'ai pas vérifié en détail, mais si vous regardez les options, vous devez le définir.)
référence:
Il semble y avoir une autre façon de faire cela en utilisant la boîte à outils GUI disponible en Python. J'ai trouvé quelque chose comme ça dans wxpython et pyqt (pyside), mais je ne l'ai pas encore vérifié. Si je peux le vérifier, j'écrirai la suite.
De plus, si vous connaissez une bonne méthode d'impression, je vous serais reconnaissant de bien vouloir l'écrire dans les commentaires.
Recommended Posts