Python silent print PDF to specific printer

前端 未结 5 1022
花落未央
花落未央 2020-12-08 06:02

I have a PDF document and I want to print it with my python app.

I have tried the solution in here (Print PDF document with python\'s win32print module?) but when I

相关标签:
5条回答
  • 2020-12-08 06:14

    Finally after hours and hours of searching for the right files, i have found the answer to my problem.

    You can download the GSPRINT in HERE

    You can download the Ghostscript GPL in HERE

    With this extracted files in your PC (Windows) you can print your PDF with this command

    GHOSTSCRIPT_PATH = "C:\\path\\to\\GHOSTSCRIPT\\bin\\gswin32.exe"
    GSPRINT_PATH = "C:\\path\\to\\GSPRINT\\gsprint.exe"
    
    # YOU CAN PUT HERE THE NAME OF YOUR SPECIFIC PRINTER INSTEAD OF DEFAULT
    currentprinter = win32print.GetDefaultPrinter()
    
    win32api.ShellExecute(0, 'open', GSPRINT_PATH, '-ghostscript "'+GHOSTSCRIPT_PATH+'" -printer "'+currentprinter+'" "PDFFile.pdf"', '.', 0)
    

    The GhostScript can also be found in the Official page HERE

    I found the gsprint.exe for 64bits HERE

    I hope this helps.

    0 讨论(0)
  • 2020-12-08 06:14

    Here's a way to silently print a pdf in the same directory as your python script without gsprint and without win32api. It allows for more GhostScript customization like choosing width/height, etc.

    import os
    import subprocess
    import sys
    
    if sys.platform == 'win32':
        args = '"C:\\\\Program Files\\\\gs\\\\gs9.23\\\\bin\\\\gswin64c" ' \
               '-sDEVICE=mswinpr2 ' \
               '-dBATCH ' \
               '-dNOPAUSE ' \
               '-dFitPage ' \
               '-sOutputFile="%printer%myPrinterName" '
        ghostscript = args + os.path.join(os.getcwd(), 'myFile.pdf').replace('\\', '\\\\')
        subprocess.call(ghostscript, shell=True)
    

    If you're using the 32 bit version of GhostScript then you would use gswin32c

    0 讨论(0)
  • 2020-12-08 06:22

    I know this is an old question, but in case someone is looking for it here is how I fixed it.

    I am using python 3.8 and gs9.52 on windows 10 64-bit and python3-ghostscript library which you can install using pip install python3-ghostscript I am also using pypiwin32 to get the default printer name, you can install it with pip pip install pypiwin32

    This is the working script

    import tempfile
    import win32print
    import locale
    import ghostscript
    import render_to_pdf
    
    pdf = render_to_pdf('print/slip.html', context)
    temp1 = tempfile.mktemp('.pdf')
    f1 = open(temp1, 'ab')
    f1.write(pdf)
    f1.close()
    
    args = [
            "-dPrinted", "-dBATCH", "-dNOSAFER", "-dNOPAUSE", "-dNOPROMPT"
            "-q",
            "-dNumCopies#1",
            "-sDEVICE#mswinpr2",
            f'-sOutputFile#"%printer%{win32print.GetDefaultPrinter()}"',
            f'"{temp1}"'
        ]
    
    encoding = locale.getpreferredencoding()
    args = [a.encode(encoding) for a in args]
    ghostscript.Ghostscript(*args)
    

    Few things to note here I am using '#' instead of '=' because for some reason it was not working with '='.

    If this is not working for you try changing -sDEVICE switch to your printer type for example when I was using HP LaserJet it was giving me prompt so I changed my -sDEVICE to laserjet and it worked, you can get the list of device by running gs -h in terminal

    0 讨论(0)
  • 2020-12-08 06:30

    If you want to print specific pages and some other parameters, you should specify them in the parameters of gsprint as follows:

    import win32print
    import win32api
    
    GHOSTSCRIPT_PATH = "C:\\path\\to\\GHOSTSCRIPT\\bin\\gswin32.exe"
    GSPRINT_PATH = "C:\\path\\to\\GSPRINT\\gsprint.exe"
    
    params = '-ghostscript "'+ GHOSTSCRIPT_PATH  +'" -printer "'+currentprinter+'" -from 1 -to 3 -landscape -copies 1 "1.pdf "'
    print(params)
    
    win32api.ShellExecute(0, 'open', GSPRINT_PATH, params, '.',0)
    
    0 讨论(0)
  • 2020-12-08 06:36

    The following code will block the current task

    for i in range(10):
        currentprinter = win32print.GetDefaultPrinter()
        win32api.ShellExecute(0, "print", 'PDFfile.pdf', '/d:"%s"' % currentprinter, ".", 0)
    

    and killing the reader after printing help won't block the current task

    os.system("TASKKILL /F /IM AcroRD32.exe") 
    

    but it will close other pdf files too.

    If you can't use gsprint, use the acrobat command

    import win32print
    import subprocess
    import time
    pdf_file  = 'D:\d1\d1.pdf'
    acrobat = 'C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe'
    name = win32print.GetDefaultPrinter()
    cmd = '"{}" /n /o /t "{}" "{}"'.format(acrobat, pdf_file, name)
    for i in range(10)):
        proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    

    It won't block the current task and close the other pdf files.

    0 讨论(0)
提交回复
热议问题