python 调用SumatraPDF 静默打印PDF

本文介绍了如何利用SumatraPDF的命令行选项对PDF文件进行方向调整、缩放处理,确保打印时不出现内容超出,并通过pypdf库编辑PDF添加边框。还演示了如何根据页面尺寸自动选择打印方向并设置打印机参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SumatraPDF 文档
https://www.sumatrapdfreader.org/docs/Command-line-arguments
⽆边框 noscale/缩⼩到合适⼤⼩(默认)shrink/合适⼤⼩ fit/compat 兼容
# 分为 Portrait (纵向)和 Landscape (横向)两类
https://github.com/sumatrapdfreader/sumatrapdf

# 如果打印的内容超出了打印纸,可以先用 pypdf 库 编辑pdf文件,给每一页四周加长,相当于加了一个边框,再打印时,自适应就不会内容超出

def SumatraPDF():
    from pypdf import PdfReader
    import subprocess
    bit_number = platform.architecture()[0] # 判断电脑是32位还是64位
    if bit_number == '64bit':# 不用安装
        other_printer = './SumatraPDF64.exe'
    else:
        other_printer = './SumatraPDF32.exe'
    pdf_file1 = './81160747558912_1.pdf'
    cprinter = 'xxxx'  # 打印机名称
    # 判断打印方向
    reader = PdfReader(pdf_file1)
    page0 = reader.pages[0]
    width = page0.mediabox.width
    height = page0.mediabox.height
    if int(width) > int(height):
        scale = 'landscape'  # 横向
    elif int(width) <= int(height):
        scale = 'portrait'

    writer = PdfWriter()
    for page_idx in range(len(reader.pages)):
        page = reader.pages[page_idx]
        mb = page.mediabox
        if (mb.upper_right[0] > mb.upper_right[1]) and (page.get('/Rotate') is None):
            print('需要旋转')
            scale = 'portrait'
            page.rotate(90)
        page.mediabox = RectangleObject((page.mediabox.left - 16, page.mediabox.bottom - 20, page.mediabox.right + 16, page.mediabox.top + 18))
        page.cropbox = RectangleObject((page.cropbox.left - 16, page.cropbox.bottom - 20, page.cropbox.right + 16, page.cropbox.top + 18))
        writer.add_page(page)
    out_file = pdffile.replace('.pdf', '') + '_1.pdf'
    with open(out_file, "wb") as f:
        writer.write(f)

    # "fit,{scale},1-,1x"
    #print-settings指定打印机参数,fit适合页面,scale 方向,1-从第一页到最后一页,lx 打印一份,2x打印2份
    args1 = [f"{other_printer}",
             "-silent", # 静默打印
             "-print-to", #指定下一行为打印机名称
             f'{cprinter}',
             "-print-settings", 
             f"fit,{scale},1-,paper=A5,1x"
             "-exit-on-print", # 打印结束自动退出
             f"{out_file}" #PDF路径
             ]
    subprocess.run(args1, encoding="utf-8", shell=True)
    print(f"\t|已发送至打印机:{cprinter}")

 # PDFtoPrinter for Windows 调用PDFtoPrinter打印

    def PDFtoPrinter(printer_name, pdf_file, scale=, printer_number):
        # 使用 PDFtoPrinter.exe 命令行打印 PDF
        other_printer = '' # PDFtoPrinter.exe路径
        param = f'FoxitReader打印参数:打印机:{printer_name},方向:{scale},数量:{printer_number},pdf文件:{pdf_file}'
        dic = {}
        args1 = [f"{other_printer}",
                 f"{pdf_file}",
                 f"{printer_name}",
                 "pages=1-",  # 从第一页到最后一页
                 "copies=1",  # 份数
                 "/s"  # 静默方式打印
                 ]
        try:
            subprocess.run(args1, encoding="utf-8", shell=True)
            print(f"\t|PDFtoPrinter 已发送至打印机:{printer_name}")
            dic['success'] = True
        except:
            dic['success'] = False
        return dic

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值