在 Adobe AxAcroPDFLib 中启用注释
Posted
技术标签:
【中文标题】在 Adobe AxAcroPDFLib 中启用注释【英文标题】:Enabling annotation in Adobe AxAcroPDFLib 【发布时间】:2015-07-13 05:24:21 【问题描述】:我使用AxAcroPDFLib
在 C# Winform 中嵌入了一个 PDF 查看器。
但是,工具栏中的注释按钮 (cmets...) 被禁用。
我搜索并发现默认情况下它们是禁用的,但有些报告使用 javascript 启用它们:
Collab.showAnnotToolsWhenNoCollab = True
这里有办法吗?
编辑: 是否可以在 WebBrowser 控件中使用浏览器插件?如果是这样,如何做到这一点?
【问题讨论】:
有没有办法从插件中使用javascript? 我希望有人能找到一种方法或解决方法。 是否可以在 WebBrowser 控件中使用浏览器插件?如果是这样,如何做到这一点? 【参考方案1】:更新 - 第一部分仅与 Acrobat Reader 相关。有关何时使用完整版 Acrobat 的信息,请参阅第二部分。
Acrobat 阅读器
我会先声明这可能不是您要寻找的答案,但我觉得这需要更多的解释,而不仅仅是评论。
在 SO (here) 上提出了一个类似的自我回答问题,OP 得出的结论是,这种行为是设计使然,对此无能为力,我几乎同意这一点。
虽然我确信您已经看到 Reader 本身可以添加注释,但使用 Reader 插件 (AcroPDFLib) 完成此操作的唯一直接方法是让正在加载的文档“启用 Reader”,此时注释就像在 Reader 中一样可用。如果您可以控制希望插件加载的文档,这可能是您的解决方案。
对于您关于可能将Collab.showAnnotToolsWhenNoCollab = True
设置为解决方法的问题,我的搜索仅表明这对于使用完整版 Acrobat 而不是 Reader 的用户来说是一种可行的解决方法。更具体地说,在 Adobe 论坛 (here) 上,Adobe 工作人员直接评论了该属性的使用:
不,这不是[关于允许在 Adobe Reader 中发表评论]。它是 关于在 Acrobat Standard 的浏览器中启用评论或 专业的。如果您希望在 Reader 中启用评论,那么您 需要使用 Acrobat Professional 自己“启用阅读器”PDF 或 Adobe Livecycle Reader 扩展服务器。
当然,这条评论是针对 Acrobat 9 的,它似乎对 Acrobat XI 仍然有效。
最后一点。我不知道你的应用程序的范围,所以这可能完全不相关,但如果这是一个商业应用程序,即使你找到一个功能性的解决方法,我也会犹豫使用它,因为它可能违反 Adobe读者许可协议(here);特别是第 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 (here) 并查看 ActiveViewVB 示例项目,这是我用来构建此示例的一些内容。作为参考,我使用了 Acrobat XI SDK。
【讨论】:
谢谢,但我有完整版的 Acrobat,但仍然无法使用。可能只有网页插件版才有,不知道怎么用。 非常感谢。这非常有用。我现在可以使用注释了。但是还是有几个问题: 1. 工具栏中的保存按钮被禁用,即使添加了注释。 2. 工具栏按钮(以及其他所有内容)的大小比 Adobe Acrobat 中的大很多(看起来与桌面的分辨率不同)。这两个问题都显示在附图中:oi57.tinypic.com/2vxfzvb.jpg。我使用 Adobe Acrobat DC。 我可以复制保存按钮问题,但不能复制工具栏按钮大小问题。对于 Save 按钮,SDK 中的 ActiveViewVB 示例也有同样的问题;它永远不会启用。我最初的想法是这可能是 Adobe 的一个错误。作为对此的“确认”,如果您手动保存PDF,实际保存带有注释的PDF确实有效。此外,如果您调用 _acroExchAVDoc.GetPDDoc().GetFlags(),文档包含 PDDocIsModified 位。 很高兴能为您提供帮助。 调用 OpenInWindowEx 后只需执行“_acroExchAVDoc.GetPDDoc().GetJSObject().collab.showAnnotToolsWhenNoCollab = True”,代码看起来应该与此答案中的 C# 代码非常相似,但您可以调用方法和属性直接使用反射中的“InvokeMember”。以上是关于在 Adobe AxAcroPDFLib 中启用注释的主要内容,如果未能解决你的问题,请参考以下文章
在 Adobe 和浏览器都将结束 Adobe Flash 之后,有啥方法可以运行 Web 应用程序
如何在 Adobe Animate 中悬停时反向播放动画?
在哪里可以找到当前的 Adobe 图像格式规范? “剪切路径”