检测 Acrobat 安装或任何其他打开 PDF 的方式

Posted

技术标签:

【中文标题】检测 Acrobat 安装或任何其他打开 PDF 的方式【英文标题】:Detect the Acrobat installation or any alternate way to open PDF 【发布时间】:2011-10-08 04:42:59 【问题描述】:

我已经构建了一个 WPF 应用程序来使用 Interop.AcroPDFLib.dll 查看 PDF 文件,问题是如果客户端计算机上没有安装 Adob​​e Acrobat 阅读器,则应用程序 stops working 会崩溃。

有没有办法我可以事先检测 Acrobat Reader 安装,然后在运行时包含对 Interop.AcroPDFLib.dll 的引用,否则会显示错误消息?

有没有更好的开源解决方案可用于在 WPF 中显示 pdf 文件?

问候。

【问题讨论】:

有什么建议和想法吗?请分享... 我对 COM 互操作不太熟悉,但您的应用程序不应该只在您真正调用来自Interop.AcroPDFLib.dll 的方法之一时崩溃吗? P/Invoke 方法当然就是这种情况。 【参考方案1】:

如果任何支持 PDF 的应用程序已正确安装,则 System.Diagnostics.Process.Start(@"C:\MyPDF.pdf"); 使用您的 PDF 文件启动它...

至于检测,您可以在HKLM\SOFTWARE\Adobe... 的注册表中检查 Reader 和/或 Acrobat。

另一种选择是检查已注册的文件关联 - 关于如何检查此 SO 答案 Script to associate an extension to a program

编辑 - 根据评论:

对于需要“动态”使用 Interop 的场景,静态添加引用并不是一个好主意...另一种方法是使用类似于以下内容的“老式方式”来执行 COM:

object A = Activator.CreateInstance (Type.GetTypeFromProgId (""));
object R = Type.GetTypeFromProgId ("").InvokeMember ("MyMethodName", BindingFlags.InvokeMethod, null, A, new object[] myParam1, myParam2);
Marshal.FinalReleaseComObject (A);

相关链接:

http://msdn.microsoft.com/en-us/library/wccyzw83.aspx http://msdn.microsoft.com/en-us/library/hss5hw09.aspx http://msdn.microsoft.com/en-us/library/66btctbe.aspx http://msdn.microsoft.com/en-us/library/system.reflection.bindingflags.aspx http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.finalreleasecomobject.aspx

【讨论】:

tnx 的回复,请您在确定是否安装了 Adob​​e Acrobat 后告诉我如何在我的项目中添加对Interop.AcroPDFLib.dll 的引用【参考方案2】:

如果有任何应用程序/软件。使用安装程序安装在 Windows 中,它通常会在控制面板中看到的已安装程序中创建一个条目(即在注册表中)。所以你可以搜索它,因为Adobe Reader 主要来自安装程序并检查验证Adobe reader 的安装。

参考见artice1article2

【讨论】:

【参考方案3】:

检查组件服务中的 GUID。通常 adobe reader 具有相同的 COM GUID。 检查安装。它是否在 c:\Program Files\Adobe .... 或 c:\Program Files x86\Adobe.... 上可用。这是假设 adobe 安装在该文件夹中。这是一种轻松的方式。 我使用以下方法搜索文件名 AcroRd32.exe:

Directory.GetFiles(@"C:\", AcroRd32.exe", SearchOption.AllDirectories)

如果找到了,则可以检查adobe reader的安装是否正常。

您可以使用 Process.Start 调用 adobe pdf I 并捕获其异常,然后终止其进程。 如果是抛出异常,则 adobe reader 未安装或损坏。否则会安装

例如:

try

Process.Start(@"c:\your program files\Adobe\Adobe.exe");
 catch

   throw new Exception ("adobe is not installed or error");

您可以通过搜索adobe reader文件自定义上述代码,然后将其传递给Process.Start参数。

我不知道使用 wpf 显示 pdf 的开源解决方案。对不起

【讨论】:

-1 抱歉,这可能是最糟糕的做法。在 3+TB 硬盘驱动器的时代,搜索整个磁盘以查找可执行文件可能需要几分钟时间。此外,您应该使用 %ProgramFiles%ProgramFiles(x86) 环境变量。最后,用户始终可以选择将 Adob​​e 安装在完全不同的位置。而是使用注册表,这就是它的目的。

以上是关于检测 Acrobat 安装或任何其他打开 PDF 的方式的主要内容,如果未能解决你的问题,请参考以下文章

如何用Adobe Acrobat Pro 制作成PDF格式,并设置有效期加密?

Adobe Acrobat 7.0 Professional 当Word转化PDF时出现PDFMaker文件丢失 怎么办?急

在没有 acrobat 阅读器的情况下从 android 应用程序打开 pdf extern

C# Acrobat打开pdf出错,提示Acrobat.AcroPDDocClass不能强制转换为Acrobat.CAcroPDDoc,使用com组件{9B4CD3E7-4981-101B-9CA8-

打开PDF修改文字的时候,显示本页面存在错误,Acrobat 可能无法正确显示页面,请联系PDF文档创建者

在 Adob​​e Acrobat Reader DS 中打开 PhantomJS 生成的 PDF 时出错