如何以编程方式知道 Adob​​e Reader 已完成文件加载?

Posted

技术标签:

【中文标题】如何以编程方式知道 Adob​​e Reader 已完成文件加载?【英文标题】:How to know programmatically that Adobe Reader finished loading a file? 【发布时间】:2016-12-11 18:36:37 【问题描述】:

我正在编写一个应用程序,它可以加载 pdf 文件并获取有关 Adob​​e Reader 进程的信息。

我的问题是我不知道 Adob​​e Reader 何时完成加载文件。目前我作为调试器连接到该进程,因此该进程显然运行速度较慢,我不想只是 Sleep() 几秒钟。我不在乎解决方案是 C++ 还是 C#,因为我可以向我的程序发出事件信号。

我正在为 Adob​​e Reader 和其他 Adob​​e 阅读器(例如 Acrobat Reader DC)寻找特定的解决方案。

我尝试了一些解决方案:

我尝试用 C++ 编写一个 Adob​​e 插件,它可以在 adobe 完成加载时引发一个事件。这是一个简单的解决方案,但问题是 Adob​​e 希望 Adob​​e Reader 的所有插件都由他们签名,这可能会花费很多。这就是我放弃这个想法的原因。 我尝试根据他们的手册使用 IAC(应用程序间通信),但它对我不起作用,老实说,它写得非常糟糕。他们公开了一个 COM 接口,但我似乎无法让它工作。

对我来说,一个解决方案甚至是一个我可以每秒调用一次的 didFinishLoading() 函数,并且一旦它发生我就可以引发一个事件。

我已经苦苦挣扎了几天,非常感谢任何帮助。

谢谢!

【问题讨论】:

我不认为,您要求的事件甚至不存在。 Adobe Acrobat Reader 按需加载和显示页面。它不会加载整个文档。 如果你看这里:help.adobe.com/livedocs/pdfl_sdk/9/PDFL_SDK9_htmlHelp/…,你会看到有一个 PDDocDidOpen() 函数,这就是我需要的。问题是它只能通过插件访问... 如果这是您要查找的事件,为什么不使用它?尽管如此,当文档完成加载时,没有迹象表明此事件已引发。更像是一个回调,在验证了文档的初步完整性并创建了内部对象表示之后。 你的实际目标是什么? 我无法使用该活动,因为我无法使用我在 Adob​​e Reader 上编写的插件。 Adobe有这个烦人的政策,插件需要签名,而且要花很多钱。我只是在寻找其他一些简单的解决方案来知道 Adob​​e 已完成加载文件。例如,我为 Word 做的,使用 VSTO 插件并在 Word 完成加载 doc 文件时注册到一个事件 【参考方案1】:

因为 PDF 是随机访问的,所以整个文件可能永远不会加载,除非您强制加载它。您可以通过 IAC 将一些 javascript 注入文件,这将导致整个文件被读取。诸如“this.syncAnnotScan()”之类的东西,它保证在方法返回时将扫描所有注释......即使没有任何注释。这意味着每个页面都需要在它可以运行之前被加载。这并不理想,但确实有效。

【讨论】:

以上是关于如何以编程方式知道 Adob​​e Reader 已完成文件加载?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 DLL 注入 Adob​​e Reader X

如何在保存 PDF 表单时阻止 Adob​​e Reader 询问“另存为”(即只允许“保存”)?

在 ActionScript 3.0 中以编程方式检测 Adob​​e Air 和 Adob​​e Flex

是否可以在 Adob​​e Reader 中以预定义的放大倍率打开 PDF 文件?

以编程方式读取 Adob​​e 游戏变量/与游戏/游戏机器人交互

使用 Node.js(和 NPM 包“psd”)解析 Adob​​e PSD 文件,以编程方式替换图像层,然后保存/渲染为 PNG