在Adobe AxAcroPDFLib中启用注释

11

我在一个C#的Winform中使用AxAcroPDFLib嵌入了一个PDF查看器。 然而,工具栏中的注释按钮(评论...)是禁用的。 我搜索并发现它们默认情况下是禁用的,但有些人报告使用JavaScript启用了它们:

Collab.showAnnotToolsWhenNoCollab = True

这里有没有做这件事的方法?

编辑:在WebBrowser控件中是否可以使用浏览器插件?如果可以,如何实现?


有没有办法从插件中使用JavaScript? - Jerry
我希望有人能找到一种方法或解决方法。 - Jerry
1
能否在WebBrowser控件中使用浏览器插件?如果可以,如何实现? - Jerry
1个回答

6

更新 - 第一部分仅适用于Acrobat Reader。有关使用完整版本的Acrobat的信息,请参见第二部分。

Acrobat Reader

我首先要说明的是,这可能不是您要寻找的答案,但我认为这需要更详细的解释而不仅仅是一个评论。

在SO上有一个类似的自问自答问题(此处),其中OP得出结论,这种行为是设计上的,无法做任何事情,我基本同意。

虽然我相信您已经看到了Reader本身可以添加注释,但使用Reader插件(AcroPDFLib)实现这一点的唯一简单方法是加载的文档被“启用阅读器”,此时注释就像在Reader中一样可用。如果您控制所需插件加载的文档,则这可能是您的解决方案。

关于您提到的可能将Collab.showAnnotToolsWhenNoCollab = True设置为解决方法,我的搜索结果只显示这适用于使用完整版Acrobat而不是Reader的用户。更具体地,在Adobe论坛(here)上,一位Adobe员工对直接使用此属性发表了评论:

不,这与允许在Adobe Reader中进行评论无关。它是关于在Acrobat标准版或专业版中启用浏览器中的评论。如果您希望在Reader中启用评论,则需要使用Acrobat Professional或Adobe Livecycle Reader Extension Server“启用Reader”PDF本身。

尽管此评论是针对Acrobat 9的,但似乎对Acrobat XI仍然有效。

最后一点。我不知道您的应用程序范围,因此这可能完全无关紧要,但如果这是商业应用程序,即使您找到了一个功能性解决方法,我也会犹豫使用它,因为它可能会违反Adobe Reader许可协议(此处);具体而言,是第4.3.3节“禁用功能”。简而言之,与大多数公司一样,他们不希望您绕过其保护。

Acrobat的完整版本

以下代码将创建一个PDF查看器(使用表单窗口进行绘制),打开PDF,然后设置collab.showAnnotToolsWhenNoCollab = true以允许在打开的PDF上进行注释。这需要参考Acrobat类型库。

void CreatePdfViewerAndOpenFile(string pdfFile)
{
    short AV_DOC_VIEW = 2;
    short PDUseBookmarks = 3;
    short AVZoomFitWidth = 2;

    Type AcroExch_AVDoc = Type.GetTypeFromProgID("AcroExch.AVDoc");
    _acroExchAVDoc = (Acrobat.CAcroAVDoc)Activator.CreateInstance(AcroExch_AVDoc);
    bool ok = _acroExchAVDoc.OpenInWindowEx(pdfFile, this.Handle.ToInt32(), AV_DOC_VIEW, -1, 0, PDUseBookmarks, AVZoomFitWidth, 0, 0, 0);

    if (ok)
    {
        CAcroPDDoc pdDoc = (CAcroPDDoc)_acroExchAVDoc.GetPDDoc();
        object jsObj = pdDoc.GetJSObject();
        Type jsObjType = jsObj.GetType();
        object collab = jsObjType.InvokeMember("collab",
            BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance,
            null, jsObj, null);

        jsObjType.InvokeMember("showAnnotToolsWhenNoCollab",
            BindingFlags.SetProperty | BindingFlags.Public | BindingFlags.Instance,
            null, collab, new object[] { true });
    }
}

无论您想在哪里显示PDF,都可以调用此方法。完成后,请务必调用Close方法,否则PDF文件将在Acrobat进程中保持打开状态。

_acroExchAVDoc.Close(-1);

请记住,此示例中省略了许多“正常”的功能,例如表单调整大小处理等,但它应该能够帮助您入门。由于此示例未处理调整大小,因此您可能需要在调用该方法之前最大化表单,以便查看器足够大而有用。有关如何以这种方式使用查看器的更多信息,请下载Acrobat SDK(此处),并查看ActiveViewVB示例项目,这是我用来构建一些此示例的内容。作为参考,我使用了Acrobat XI SDK。

非常感谢。这非常有用。我现在可以使用注释了。但仍然存在一些问题:1. 工具栏中的保存按钮被禁用,即使添加了注释也是如此。2. 工具栏按钮(以及其他所有内容)的大小比Adobe Acrobat大得多(看起来像桌面的不同分辨率)。这两个问题都显示在附加的图像中:http://oi57.tinypic.com/2vxfzvb.jpg。我使用的是Adobe Acrobat DC。 - Jerry
我在另一台安装了Adobe Acrobat Pro 9的机器上尝试了一下。最后一个InvokeMember调用崩溃并显示错误信息"System.Runtime.InteropServices.COMException (0x80010105): The server threw an exception. (Exception from HRESULT: 0x80010105 (RPC_E_SERVERFAULT))",事件查看器中显示了annots.api和escript.api模块的故障。 - Jerry
1
我可以复制“保存”按钮问题,但无法复制工具栏按钮大小问题。对于“保存”按钮,在SDK中的ActiveViewVB示例也存在相同的问题;它从未启用。我的初步想法是这可能是Adobe的一个错误。作为对此的“确认”,如果您手动保存PDF并带注释,则确实可以正常工作。此外,如果调用_acroExchAVDoc.GetPDDoc().GetFlags(),则文档包含PDDocIsModified位。 - cokeman19
1
很高兴能提供帮助。 - cokeman19
1
在调用OpenInWindowEx之后,只需执行“_acroExchAVDoc.GetPDDoc().GetJSObject().collab.showAnnotToolsWhenNoCollab = True”,代码应该与此答案中的C#代码非常相似,但是您可以直接调用方法和属性,而无需使用反射中的“InvokeMember”。 - yms
显示剩余11条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接