【问题标题】:How to know programmatically that Adobe Reader finished loading a file?如何以编程方式知道 Adob​​e Reader 已完成文件加载?
【发布时间】: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 文件时注册到一个事件

标签: c# c++ pdf winapi adobe


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 2011-01-15
    相关资源
    最近更新 更多