11

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

Collab.showAnnotToolsWhenNoCollab = True

有没有办法在这里做到这一点?

编辑:是否可以在 WebBrowser 控件中使用浏览器插件?如果是这样,如何做到这一点?

4

1 回答 1

6

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

爱看阅读器

我将首先说明这可能不是您要寻找的答案,但我觉得这需要更多的解释,而不仅仅是评论。

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

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

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

不,这不是[关于允许在 Adob​​e Reader 中发表评论]。它是关于在 Acrobat Standard 或 Professional 的浏览器中启用评论。如果您希望在 Reader 中启用评论,那么您需要使用 Acrobat Professional 或 Adob​​e Livecycle Reader Extension Server 来“启用”PDF 本身。

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

最后一点。我不知道你的应用程序的范围,所以这可能完全无关,但如果这是一个商业应用程序,即使你找到一个功能性的解决方法,我也会犹豫使用它,因为它可能违反 Adob​​e读者许可协议(此处);特别是第 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。

于 2015-05-11T04:01:15.090 回答