我已经建立了跟踪系统
- 凌晨 5 点到 7 点之间,会有 12 封电子邮件中的一封以随机顺序送达
- Outlook 规则获取电子邮件,并运行 VBA 脚本,该脚本会自动修改并打印部分附加电子表格(并非全部)
- 我早上把所有的打印件拿来,手动把它们分组并装订在一起
在打印之前对打印件进行分组以便打印和装订的最佳方法是什么?
答案1
你没有说你想要它们按照什么顺序排列......
试试这个。转到打印机属性并单击高级按钮。单击“在最后一页后台打印后开始打印”,并确保勾选了“首先打印后台打印的文档”。
然后,电子邮件将按照 Outlook 打印的顺序打印。要测试 Outlook 的功能,您可以尝试打印到文件,并检查文件的创建顺序。如果顺序不正确,请尝试更改 Outlook 中的设置,使顺序符合您的要求;然后重新连接到打印机。
答案2
我解决了我的问题并最终做了以下事情:
每个文档都打印为 *.xps 文件,并
Z:\Print
使用 VBA 中的 XPS 打印机(工作机器上不提供 PDF 打印)将其放入文件夹中,使用以下代码:Application.ActivePrinter = XPSPrinter ActivePrinterName = Application.ActivePrinter If (InStr(ActivePrinterName, "XPS")) Then Dim Filename As String Filename = ActiveWorkbook.name rngPrint.PrintOut Copies:=1, _ printtofile:=True, prtofilename:=FilePath & File & ".xps" End If
在 7.00 批处理脚本中(使用ghostscript) 计划将所有 *.xps 文件转换为 *.pdf 文件。可能我们不需要两个文件名变量,这是调试时遗留下来的。
@echo off setlocal enabledelayedexpansion FOR /R Z:\Overnight\Print %%F in (*.xps) DO ( Set filename=%%~nF%%~xF Set outputFilename=%%~nF%.pdf Set filename2=Z:\Print\%!filename! Set outputFilename2=Z:\PrintPDF\%!outputFilename! C:\ghostxps\gxps.exe -sDEVICE=pdfwrite -sOutputFile=!outputFilename2! -dNOPAUSE !filename2! ) exit exit
然后运行我编写的 Java 程序,它将单独的 PDF 文件合并到所需的组中(使用pdfbox)
public void combine(String outputName, String[] filenames) throws IOException, PrinterException { try { PDFMergerUtility mergePdf = new PDFMergerUtility(); for (String filename : filenames){ mergePdf.addSource(getFileByName(filename)); } mergePdf.setDestinationFileName(outputPath+outputName+".pdf"); mergePdf.mergeDocuments(); System.out.println("Combined "+outputName); } catch (Exception e) { e.printStackTrace(); } }
最后,运行一个打印所有合并的 pdf 文件的批处理。需要延迟进程终止,如果您尝试在调用进程后终止进程,它只会告诉您未找到该进程(即使它就在任务管理器中)
@echo off setlocal enabledelayedexpansion RUNDLL32 PRINTUI.DLL,PrintUIEntry /y /n "\\SITE\PRINTER-BATCH" FOR /R Z:\CombinedPDF %%F in (*.pdf) DO ( Set filename=%%~nF%%~xF Set filename2=Z:\CombinedPDF\%!filename! start cmd /c "timeout 15 & taskkill /f /im acrord32.exe" call "C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe" /t !filename2! ) RUNDLL32 PRINTUI.DLL,PrintUIEntry /y /n "\\SITE\PRINTER-DEFAULT" exit exit