欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Python的无声模式:静默包与静默打印

最编程 2024-08-04 07:20:50
...


由于工作需求,需要按照固定顺序打印大量的PDF文件.

第一时间想到的就是用Python的模块来解决.查阅了大量的文章之后,开始了我的测试之旅…

一.第一种方案.ghostscript与gsprint打印.代码如下:

def print_pdf(x):
    GHOSTSCRIPT_PATH = r'C:\workC\gs9.54.0\bin\gswin64c.exe'
    GSPRINT_PATH = r'C:\workC\Ghostgum\gsview\gsprint.exe'
    # YOU CAN PUT HERE THE NAME OF YOUR SPECIFIC PRINTER INSTEAD OF DEFAULT
    currentprinter = win32print.GetDefaultPrinter()
    print(x)
    win32api.ShellExecute(
        0, \
        'open', \
        GSPRINT_PATH, \
        '-ghostscript \
        "' + GHOSTSCRIPT_PATH + '"  \
        -printer \
        "' + currentprinter + '" \
        "'+ x +'" ', \
        '.', \
        0
    )
'''
x:是需要打印PDF的绝对路径
需要安装ghostscript以及gsprint.
查找了很多个地方才发现gsprint原来是gsview的一个组件.特此说明,大家避免被坑.
''''

下载链接:
ghostscript:
gsview(gsprint):
这个第一种方案是我抱希望最大的方法,所以浪费了我大量的时间.大部分浪费到寻找下载ghostscript与gsprint(也就是gsview)与安装调试了.
最后结果就是,没有成功.代码端没有太多问题.还是软件版本太老了,gsview官网已经不更新了.执行打印任务,打印机也会产生打印任务但不实际打印.感觉应该就是gsprint没有工作,或者是兼容性问题吧.
如果有用这个方法实现的高手,还请留言指教一下,感激不尽.

二.第二种方案.使用ghostscript;不用gsprint.
脚本与PDF放到一个目录下.

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)

最终这个方案也没有实现.依然是只能生成打印任务,但是打印机不打印.

三.第三种方案.(我最终实现了的方式)
代码如下:

def print_pdf(x):
    filename = str(x)
    open (filename,'r')
    win32api.ShellExecute(
        0,
        "print",
        filename,
         #
         # If this is None, the default printer will
         # be used anyway.
         # 使用默认打印机
        '/d:"%s"' % win32print.GetDefaultPrinter(),
        ".",
        0
    )
# 传入函数的x需要是PDF文件的绝对路径

这个方案会调用当前主机的PDF默认阅读器,最初我用得是Aober Reader 因为它不支持静默,后来改为福昕PDF阅读器为默认阅读器.福昕PDF支持静默打印.(它不会弹窗,只是会显示一个最小化后的窗口,算是一点点小遗憾吧).但最终实现了顺利打印.
下面是我的完整代码:

import os 
import win32api
import win32print
import win32ui
import win32con
import xlrd              #导入读模块

allname=[]
os.chdir(os.getcwd()) #指定当前目录为工作目录
fdir=os.path.abspath('.')  #获取当前工作目录路径,并赋值
mdir=os.path.join(fdir, 'file') #子目录路径重组赋值
allname=os.listdir(mdir)   #指定目录下的全部文件名存入列表
filename =fdir+'\data.xlsx'   #数据目录
print(allname)
#单号加后缀
def ADDMAWB(x):
    str2= str(x)+'MAWB.pdf'
    return(str2)

#单号加后缀带空格
def ADD2MAWB(x):
    str2= str(x)+' MAWB.pdf'
    return(str2)

#打印PDF
def print_pdf(x):
    filename = str(x)
    open (filename,'r')
    win32api.ShellExecute(
        0,
        "print",
        filename,
         #
         # If this is None, the default printer will
         # be used anyway.
         # 使用默认打印机
        '/d:"%s"' % win32print.GetDefaultPrinter(),
        ".",
        0
    )

#直接打印内容
def print_context(x):
        INCH = 1440

        hDC = win32ui.CreateDC ()
        hDC.CreatePrinterDC (win32print.GetDefaultPrinter ())
        hDC.StartDoc ("Test doc")
        hDC.StartPage ()
        hDC.SetMapMode (win32con.MM_TWIPS)
        hDC.DrawText ("This NO. <" + x + "> does not exist !",(0, INCH * -1, INCH * 8, INCH * -2), win32con.DT_CENTER)
        hDC.EndPage ()
        hDC.EndDoc ()



data = xlrd.open_workbook(filename) #读取Excel
table = data.sheets()[0]       #读取第一个(0)表单,即sheet1
hnrows=table.nrows               #总行数保存到变量,


#for j in table.row_values(0): #遍历每行
for j in table.col_values(0): #遍历0列
     if ADD2MAWB(j) in allname:
        pdfname = ADD2MAWB(j)
        MAWB=os.path.join(mdir,pdfname)
        print_pdf(MAWB)
        
    elif ADDMAWB(j) in allname:
        pdf1name= ADDMAWB(j)
        MAWB1=os.path.join(mdir,pdf1name)
        print_pdf(MAWB1)
    else:
        context=str(ADDMAWB(j))
        print_context(context)
        #对应单号的PDF文件如果不存在,打印出该单号.

文中涉及xlrd模块读取excel文件的内容不在这里详述,如果有时间我会在另一篇文章内详细叙述.

PS:下面三个文件需要在一个目录内:
1.脚本文件本身(名字自定义)
2.名字为:file的文件夹(其名字需要与程序中保持一致),存放待打印的PDF文件.
3.名字为:data的excel文件.表格第一个sheet的第一列存放文件名字.这也是打印PDF文件顺序的根源.


推荐阅读