能否用C#读取或保存Adobe Reader中已打开的PDF文件
解决方案:处理Adobe中打开的未保存PDF以便iText 7处理
一、读取Adobe已打开的PDF
1. 利用Adobe Acrobat SDK(推荐)
如果员工使用的是完整版Adobe Acrobat(而非Reader),可通过其COM接口获取当前打开的文档,导出为临时文件后用iText 7处理。以C#为例:
// 需先在项目中引用Adobe Acrobat的COM组件 AcroApp acroApp = new AcroApp(); AcroAVDoc activeDoc = acroApp.GetActiveDoc(); if (activeDoc != null) { AcroPDDoc pdDoc = activeDoc.GetPDDoc(); string tempFilePath = Path.Combine(Path.GetTempPath(), $"temp_{Guid.NewGuid()}.pdf"); // 将当前打开的PDF保存到临时路径 pdDoc.Save(1, tempFilePath); // 参数1表示以PDF格式保存 // 用iText 7读取并处理临时文件 using (PdfReader reader = new PdfReader(tempFilePath)) using (PdfDocument pdfDoc = new PdfDocument(reader)) { // 在此编写PDF处理逻辑(如读取内容、添加标识等) } // 处理完成后删除临时文件 File.Delete(tempFilePath); }
注意:需确保客户端安装完整版Adobe Acrobat,且引用对应版本的COM组件。
2. 不推荐的内存读取方式
通过Windows API读取Adobe进程内存提取PDF内容的方法稳定性极差,版本更新、权限限制都可能导致失效,不建议生产环境使用。
二、自动保存PDF到硬盘
从源头解决问题是更可靠的方案,以下两种思路可选:
1. 修改PDF生成逻辑(最优)
如果行程PDF由内部系统生成,直接在生成环节加入自动保存步骤,再打开给员工。以Java为例:
// 用iText 7生成并保存PDF到指定目录 String savePath = "D:/物流行程PDF/" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + ".pdf"; PdfWriter writer = new PdfWriter(savePath); PdfDocument pdfDoc = new PdfDocument(writer); // 生成PDF内容(如添加行程信息、表格等) Document doc = new Document(pdfDoc); doc.add(new Paragraph("XX物流行程单")); // ...其他内容生成代码 doc.close(); pdfDoc.close(); // 启动Adobe Acrobat打开已保存的PDF Runtime.getRuntime().exec("acrobat.exe " + savePath);
这种方法从根源避免后续读取问题,生成的PDF直接存盘,方便iText 7批量处理。
2. 自动化工具监控保存
若无法修改生成系统,可使用AutoHotkey或PowerShell实现自动化保存:
- AutoHotkey脚本示例(监控Adobe激活状态,自动触发保存):
; 当Adobe Acrobat窗口激活时,按下Ctrl+S自动保存到指定目录 #IfWinActive ahk_exe Acrobat.exe ^s:: Send ^s Sleep 600 ; 用时间戳命名避免文件重复 FormatTime, timestamp,, yyyyMMddHHmmss Send "D:/物流行程PDF/行程单_%timestamp%.pdf" Send {Enter} return #IfWinActive
员工打开PDF后按Ctrl+S即可自动保存到指定目录,后续iText 7可直接读取该目录下的文件。
内容的提问来源于stack exchange,提问作者Daniel Gilliland
相关产品推荐
相关产品推荐

