如何以编程方式知道 Adobe Reader 已完成文件加载?
Posted
技术标签:
【中文标题】如何以编程方式知道 Adobe Reader 已完成文件加载?【英文标题】:How to know programmatically that Adobe Reader finished loading a file? 【发布时间】:2016-12-11 18:36:37 【问题描述】:我正在编写一个应用程序,它可以加载 pdf 文件并获取有关 Adobe Reader 进程的信息。
我的问题是我不知道 Adobe Reader 何时完成加载文件。目前我作为调试器连接到该进程,因此该进程显然运行速度较慢,我不想只是 Sleep() 几秒钟。我不在乎解决方案是 C++ 还是 C#,因为我可以向我的程序发出事件信号。
我正在为 Adobe Reader 和其他 Adobe 阅读器(例如 Acrobat Reader DC)寻找特定的解决方案。
我尝试了一些解决方案:
我尝试用 C++ 编写一个 Adobe 插件,它可以在 adobe 完成加载时引发一个事件。这是一个简单的解决方案,但问题是 Adobe 希望 Adobe Reader 的所有插件都由他们签名,这可能会花费很多。这就是我放弃这个想法的原因。 我尝试根据他们的手册使用 IAC(应用程序间通信),但它对我不起作用,老实说,它写得非常糟糕。他们公开了一个 COM 接口,但我似乎无法让它工作。对我来说,一个解决方案甚至是一个我可以每秒调用一次的 didFinishLoading() 函数,并且一旦它发生我就可以引发一个事件。
我已经苦苦挣扎了几天,非常感谢任何帮助。
谢谢!
【问题讨论】:
我不认为,您要求的事件甚至不存在。 Adobe Acrobat Reader 按需加载和显示页面。它不会加载整个文档。 如果你看这里:help.adobe.com/livedocs/pdfl_sdk/9/PDFL_SDK9_htmlHelp/…,你会看到有一个 PDDocDidOpen() 函数,这就是我需要的。问题是它只能通过插件访问... 如果这是您要查找的事件,为什么不使用它?尽管如此,当文档完成加载时,没有迹象表明此事件已引发。更像是一个回调,在验证了文档的初步完整性并创建了内部对象表示之后。 你的实际目标是什么? 我无法使用该活动,因为我无法使用我在 Adobe Reader 上编写的插件。 Adobe有这个烦人的政策,插件需要签名,而且要花很多钱。我只是在寻找其他一些简单的解决方案来知道 Adobe 已完成加载文件。例如,我为 Word 做的,使用 VSTO 插件并在 Word 完成加载 doc 文件时注册到一个事件 【参考方案1】:因为 PDF 是随机访问的,所以整个文件可能永远不会加载,除非您强制加载它。您可以通过 IAC 将一些 javascript 注入文件,这将导致整个文件被读取。诸如“this.syncAnnotScan()”之类的东西,它保证在方法返回时将扫描所有注释......即使没有任何注释。这意味着每个页面都需要在它可以运行之前被加载。这并不理想,但确实有效。
【讨论】:
以上是关于如何以编程方式知道 Adobe Reader 已完成文件加载?的主要内容,如果未能解决你的问题,请参考以下文章
如何在保存 PDF 表单时阻止 Adobe Reader 询问“另存为”(即只允许“保存”)?
在 ActionScript 3.0 中以编程方式检测 Adobe Air 和 Adobe Flex
是否可以在 Adobe Reader 中以预定义的放大倍率打开 PDF 文件?
以编程方式读取 Adobe 游戏变量/与游戏/游戏机器人交互
使用 Node.js(和 NPM 包“psd”)解析 Adobe PSD 文件,以编程方式替换图像层,然后保存/渲染为 PNG