如何将不同VFP9报表通过Microsoft Print to PDF输出为单份多页PDF文件?
解决FoxPro VFP9多报表合并为单PDF的方案
ShellExecute的局限性
ShellExecute无法实现「累加式打印到PDF」的需求,它仅能调用外部程序,无法控制Microsoft Print to PDF的追加打印逻辑,且微软自带的这个虚拟打印机默认每次打印都会弹窗要求指定文件名,没法实现静默追加。
可行替代方案
1. 第三方虚拟PDF打印机(推荐)
选择支持「追加打印」的虚拟PDF工具,无需弹窗即可将多个报表连续打印到同一个PDF文件:
- CutePDF Writer:安装后设置默认输出路径,VFP代码中使用
APPEND参数实现追加打印:SET PRINTER TO NAME "CutePDF Writer" REPORT FORM Report1.frx TO PRINTER NOCONSOLE REPORT FORM Report2.frx TO PRINTER NOCONSOLE APPEND REPORT FORM Report3.frx TO PRINTER NOCONSOLE APPEND REPORT FORM Report4.frx TO PRINTER NOCONSOLE APPEND REPORT FORM Report5.frx TO PRINTER NOCONSOLE APPEND SET PRINTER TO - PDFCreator:预先在工具设置中配置好输出路径和追加模式,VFP打印逻辑同上,全程无弹窗。
2. 先生成单PDF再批量合并
如果不想更换打印机,可先静默生成多个独立PDF,再用命令行工具合并:
- 使用
pdftk(PDF Toolkit):VFP中通过RUN调用命令行合并:RUN /N pdftk report1.pdf report2.pdf report3.pdf report4.pdf report5.pdf cat output combined.pdf - 使用Ghostscript:命令行合并示例:
注:静默生成单PDF需修改注册表,给Microsoft Print to PDF设置默认输出文件名,路径为RUN /N gswin64c.exe -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=combined.pdf report1.pdf report2.pdf report3.pdf report4.pdf report5.pdfHKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Devices,但兼容性不如第三方工具。
3. VFP直接生成并合并PDF
通过COM组件在VFP内部完成PDF生成与合并,无需依赖打印机:
LOCAL oAcroApp, oAcroPDDoc, oJso, i oAcroApp = CREATEOBJECT("AcroExch.App") oAcroPDDoc = CREATEOBJECT("AcroExch.PDDoc") * 生成第一个报表PDF并打开 REPORT FORM Report1.frx TO FILE "temp1.pdf" AS PDF NOCONSOLE oAcroPDDoc.Open("temp1.pdf") * 循环追加剩余报表 FOR i = 2 TO 5 REPORT FORM ("Report"+ALLTRIM(STR(i))+".frx") TO FILE ("temp"+ALLTRIM(STR(i))+".pdf") AS PDF NOCONSOLE oJso = oAcroPDDoc.GetJSObject() oJso.InsertPages(oAcroPDDoc.GetNumPages()-1, "temp"+ALLTRIM(STR(i))+".pdf", 0, oJso.GetNumPages(), 0) ENDFOR * 保存合并文件并清理 oAcroPDDoc.Save(1, "combined.pdf") oAcroPDDoc.Close() oAcroApp.Exit() RELEASE oJso, oAcroPDDoc, oAcroApp FOR i = 1 TO 5 DELETE FILE ("temp"+ALLTRIM(STR(i))+".pdf") ENDFOR
内容的提问来源于stack exchange,提问作者SteveB
相关产品推荐
相关产品推荐

