检测 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 文件,问题是如果客户端计算机上没有安装 Adobe 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 的回复,请您在确定是否安装了 Adobe 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)
环境变量。最后,用户始终可以选择将 Adobe 安装在完全不同的位置。而是使用注册表,这就是它的目的。以上是关于检测 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-