我使用 AxAcroPDFLib 在 C# Winform 中嵌入了一个 PDF 查看器。
但是,工具栏中的注释按钮(注释...)被禁用。
我搜索并发现默认情况下它们是禁用的,但有些人报告使用 Javascript 启用它们:
Collab.showAnnotToolsWhenNoCollab = True
这里有办法做到这一点吗?
编辑: 是否可以在 WebBrowser 控件中使用浏览器插件?如果可以,如何实现?
最佳答案
更新 - 第一部分仅与 Acrobat Reader 相关。有关何时使用完整版 Acrobat 的信息,请参阅第二部分。
Acrobat 阅读器
我将通过声明这可能不是您正在寻找的答案来作为所有这些的序言,但我觉得这需要更多的解释,而不仅仅是评论。
在 SO ( here ) 上提出了一个类似的 self 回答的问题,OP 得出的结论是这种行为是设计使然的,对此我无能为力,我几乎同意这一点。
虽然我确定您已经看到 Reader 本身可以添加注释,但使用 Reader 插件 (AcroPDFLib) 完成此操作的唯一直接方法是将正在加载的文档设置为“Reader Enabled”,此时注释就像它们在 Reader 中一样可用。如果您可以控制希望插件加载的文档,这可能是适合您的解决方案。
关于可能将 Collab.showAnnotToolsWhenNoCollab = True 设置为解决方法的问题,我的搜索仅显示对于使用完整版 Acrobat 而非 Reader 的人来说,这是一个可行的解决方法。更具体地说,在 Adobe 论坛 ( here ) 上,Adobe 工作人员直接评论了此属性的使用:
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 仍然有效。
最后一点。我不知道你的应用程序的范围,所以这可能完全无关紧要,但如果这是一个商业应用程序,即使你找到了一个功能性的解决方法,我也会犹豫是否使用它,因为它可能违反了 Adobe读者许可协议(protocol) (here);特别是第 4.3.3 节,禁用的功能。简而言之,与大多数公司一样,他们不希望您规避他们的保护措施。
Acrobat 的完整版本
以下代码将创建一个 PDF 查看器(使用 Form 的绘图窗口),打开一个 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。
关于c# - 在 Adobe AxAcroPDFLib 中启用注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30019736/
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
在启用Rack::Deflater来gzip我的响应主体时偶然发现了一些奇怪的东西。也许我遗漏了一些东西,但启用此功能后,响应被压缩,但是资源的ETag在每个请求上都会发生变化。这会强制应用程序每次都响应,而不是发送304。这在没有启用Rack::Deflater的情况下有效,我已经验证页面源没有改变。我正在运行一个使用thin作为Web服务器的Rails应用程序。Gemfile.lockhttps://gist.github.com/2510816有没有什么方法可以让我从Rack中间件获得更多的输出,这样我就可以看到发生了什么?提前致谢。 最佳答案
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭5年前。Improvethisquestion我审查了一些用Ruby编写的专业代码,没有发现任何评论。代码读起来相当清晰,但没有self记录。我应该期望专业编写的Ruby代码有注释吗?或者,是否有一些Ruby原则认为注释不是必需的?
我如何做Ruby方法"Flatten"RubyMethod在C#中。此方法将锯齿状数组展平为一维数组。例如:s=[1,2,3]#=>[1,2,3]t=[4,5,6,[7,8]]#=>[4,5,6,[7,8]]a=[s,t,9,10]#=>[[1,2,3],[4,5,6,[7,8]],9,10]a.flatten#=>[1,2,3,4,5,6,7,8,9,10 最佳答案 递归解决方案:IEnumerableFlatten(IEnumerablearray){foreach(variteminarray){if(itemisIEnume
我最近从C#转向了Ruby,我发现自己无法制作可折叠的标记代码区域。我只是想到做这种事情应该没问题:classExamplebegin#agroupofmethodsdefmethod1..enddefmethod2..endenddefmethod3..endend...但是这样做真的可以吗?method1和method2最终与method3是同一种东西吗?还是有一些我还没有见过的用于执行此操作的Ruby惯用语? 最佳答案 正如其他人所说,这不会改变方法定义。但是,如果要标记方法组,为什么不使用Ruby语义来标记它们呢?您可以使用
什么是Linq聚合方法的ruby等价物。它的工作原理是这样的varfactorial=new[]{1,2,3,4,5}.Aggregate((acc,i)=>acc*i);每次将数组序列中的值传递给lambda时,变量acc都会累积。 最佳答案 这在数学以及几乎所有编程语言中通常称为折叠。它是更普遍的变形概念的一个实例。Ruby从Smalltalk中继承了这个特性的名称,它被称为inject:into:(像aCollectioninject:aStartValueinto:aBlock一样使用。)所以,在Ruby中,它称为inj
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭8年前。Improvethisquestion几年前我去学校学习编程,毕业后我找到了一份系统管理方面的工作,这就是我职业生涯的方向。我想重新开始某种开发,并且一直在“玩”C#和ASP.NET,但我已经听到很多关于其他"new"语言的讨论(新的意思是它们是新的)我)喜欢Ruby和F#。我想我想知道我是否在浪费时间学习主要的MS语言,而不是成为一名通才。很长一段时间没有离开开发社区(如果我曾经离开过的话)让我在潮流中挣扎,我不想落在时代的
我有一个简单的Ruby脚本,我用它在某些HTTPheader上执行private_encrypt以签署要发送到rubyRESTAPI的Web请求,该API会根据Base64编码字符串测试Base64编码字符串生成而不是解码Base64和解密数据然后测试原始字符串。我使用的脚本是require"openssl"require"base64"path_to_cert=ARGV[0].dupplain_text=Base64.decode64(ARGV[1].dup)private_key=OpenSSL::PKey::RSA.new(File.read(path_to_cert))pu