在 Adob​​e AxAcroPDFLib 中启用注释

Enabling annotation in Adobe AxAcroPDFLib

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

启用它们
Collab.showAnnotToolsWhenNoCollab = True

这里有办法做到这一点吗?

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

更新 - 第一部分仅与 Acrobat Reader 相关。有关何时使用完整版 Acrobat 的信息,请参阅第二部分。

杂技演员Reader

我将通过声明这 可能 不是您正在寻找的答案来作为所有这些的序言,但我觉得这需要更多的解释,而不仅仅是评论。

有人在 SO (here) 上提出了一个类似的自我回答的问题,OP 得出的​​结论是这种行为是设计使然的,对此我无能为力,我同意这一点,差不多。

虽然我确定您已经看到 Reader 本身可以添加注释,但使用 Reader 插件 (AcroPDFLib) 完成此操作的唯一直接方法是将文档加载到成为 "Reader Enabled,",此时注释变得可用,就像它们在 Reader 中一样。如果您可以控制希望插件加载的文档,这可能是适合您的解决方案。

对于您关于可能将 Collab.showAnnotToolsWhenNoCollab = True 设置为解决方法的问题,我的搜索仅显示这对于使用完整版 Acrobat 的用户来说是一个可行的解决方法,而不是 Reader。更具体地说,在 Adob​​e 论坛 (here) 上,一位 Adob​​e 工作人员直接评论了此 属性 的使用:

No, it is not [about allowing commenting in Adobe Reader]. It is about enabling commenting in a browser for Acrobat Standard or Professional. If you wish to enable commenting in Reader, then you need to "Reader Enable" the PDFs themselves using Acrobat professional or Adobe Livecycle Reader Extension Server.

当然,此评论是针对 Acrobat 9 的,它似乎对 Acrobat XI 仍然有效。

最后一点。我不知道你的应用程序的范围,所以这可能完全无关紧要,但如果这是一个商业应用程序,即使你找到了一个功能性的解决方法,我也会犹豫是否使用它,因为它可能违反了 Adob​​e Reader 许可协议 (here);特别是第 4.3.3 节,禁用的功能。简而言之,与大多数公司一样,他们不希望您规避他们的保护措施。

完整版 Acrobat

以下代码将创建一个 PDF 查看器(使用表单的 window 进行绘图),打开一个 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);

请记住,此示例中遗漏了很多 "normal" 功能,例如表单调整大小处理等,但它应该可以帮助您入门。由于此示例不处理调整大小,您可能希望在调用该方法之前最大化窗体,以便查看器足够大以供使用。有关如何以这种方式使用查看器的更多信息,请下载 Acrobat SDK (here) 并查看 ActiveViewVB 示例项目,这是我用来构建此示例的一些项目。作为参考,我使用了 Acrobat XI SDK。