如何知道浏览器是否有PDF查看器?

我正在将PDF视为iframe。 它工作正常。 但是一些客户端无法在IE中看到它。 他们将其作为下载选项。

如何识别浏览器是否具有pdf查看器并提示用户他没有pdf查看器?

注意:我使用的是asp.net mvc 5(c#)。

我试过这个 ,但是没有帮助我。 我的一些客户端的问题有Adobe PDF,所以下面的答案没有问题。 但那些有nitropdf或chrome pdf查看器的人,下面的回答并没有帮助我。 我想识别所有的pdf查看器。 否则如果客户端有某种pdf查看器,那么还会显示没有安装pdf查看器的警报。 那是错的。

我通过获得عبدالنورالتومي的答案来应用此代码,它适用于chrome和mozilla。 这是我修改过的js 。

IE仍然没有回应它。 我不知道如何在IE中检查它是否有pdf查看器。 对于IE,虽然有pdf查看器,但我得到了以下错误:

在此处输入图像描述

有一个JS解决方案:

var hasPdfViewer = getAcrobatInfo().acrobat ==="installed"; 

已知API getAcrobatInfo是:

 // http://thecodeabode.blogspot.com // @author: Ben Kitzelman // @license: FreeBSD: (http://opensource.org/licenses/BSD-2-Clause) Do whatever you like with it // @updated: 03-03-2013 var getAcrobatInfo = function() { var getBrowserName = function() { return this.name = this.name || function() { var userAgent = navigator ? navigator.userAgent.toLowerCase() : "other"; if(userAgent.indexOf("chrome") > -1) return "chrome"; else if(userAgent.indexOf("safari") > -1) return "safari"; else if(userAgent.indexOf("msie") > -1) return "ie"; else if(userAgent.indexOf("firefox") > -1) return "firefox"; return userAgent; }(); }; var getActiveXObject = function(name) { try { return new ActiveXObject(name); } catch(e) {} }; var getNavigatorPlugin = function(name) { for(key in navigator.plugins) { var plugin = navigator.plugins[key]; if(plugin.name == name) return plugin; } }; var getPDFPlugin = function() { return this.plugin = this.plugin || function() { if(getBrowserName() == 'ie') { // // load the activeX control // AcroPDF.PDF is used by version 7 and later // PDF.PdfCtrl is used by version 6 and earlier return getActiveXObject('AcroPDF.PDF') || getActiveXObject('PDF.PdfCtrl'); } else { return getNavigatorPlugin('Adobe Acrobat') || getNavigatorPlugin('Chrome PDF Viewer') || getNavigatorPlugin('WebKit built-in PDF'); } }(); }; var isAcrobatInstalled = function() { return !!getPDFPlugin(); }; var getAcrobatVersion = function() { try { var plugin = getPDFPlugin(); if(getBrowserName() == 'ie') { var versions = plugin.GetVersions().split(','); var latest = versions[0].split('='); return parseFloat(latest[1]); } if(plugin.version) return parseInt(plugin.version); return plugin.name } catch(e) { return null; } } // The returned object return { browser: getBrowserName(), acrobat: isAcrobatInstalled() ? 'installed' : false, acrobatVersion: getAcrobatVersion() }; }; 

我通过عبدالنورالتومي的帮助尝试了以下解决方案,这有助于chrome和mozilla中的任何pdf查看器

  var getAcrobatInfo = function () { var getBrowserName = function () { return this.name = this.name || function () { var userAgent = navigator ? navigator.userAgent.toLowerCase() : "other"; if (userAgent.indexOf("chrome") > -1) { return "chrome"; } else if (userAgent.indexOf("safari") > -1) { return "safari"; } else if (userAgent.indexOf("msie") > -1 || userAgent.indexOf("trident") > -1) { return "ie"; } else if (userAgent.indexOf("firefox") > -1) { return "firefox";} return userAgent; }(); }; var getActiveXObject = function (name) { try { return new ActiveXObject(name); } catch (e) { } }; var getNavigatorPlugin = function (name) { try { for (key in navigator.plugins) { var plugin = navigator.plugins[key]; if (plugin.name.toLowerCase().indexOf(name) > -1) { return plugin; } } } catch (e) { } }; var getPDFPlugin = function () { return this.plugin = this.plugin || function () { if (getBrowserName() == 'ie') { return getActiveXObject('AcroPDF.PDF') || getActiveXObject('PDF.PdfCtrl'); } else { return getNavigatorPlugin('adobe acrobat') || getNavigatorPlugin('pdf') || getNavigatorPlugin('foxit reader'); // works for all plugins which has word like 'adobe acrobat', 'pdf' and 'foxit reader'. } }(); }; var isAcrobatInstalled = function () { return !!getPDFPlugin(); }; var getAcrobatVersion = function () { try { var plugin = getPDFPlugin(); if (getBrowserName() == 'ie') { var versions = plugin.GetVersions().split(','); var latest = versions[0].split('='); return parseFloat(latest[1]); } if (plugin.version) return parseInt(plugin.version); return plugin.name } catch (e) { return null; } }; return { browser: getBrowserName(), // Return browser name acrobat: isAcrobatInstalled() ? true : false, // return pdf viewer is enabled or not acrobatVersion: getAcrobatVersion() // reurn acrobat version for browser }; } 

我有IE的跟随错误,虽然我在我的浏览器中安装了pdf查看器: 在此处输入图像描述

然后我通过这个链接解决了它。

然后我为IE 11 trident添加新条件,现在它工作正常。 我还添加了检查foxit reader选项。 您还可以在条件中添加另一个pdf阅读器名称。

作为替代方案,您可以使用像viewer.js这样的库在容器中显示您的pdf。

见http://viewerjs.org/

PDF格式是一种许可的adobe格式,根据我的理解,如果您还需要考虑所有非许可的PDF阅读器,它可能并不总是可靠的检测。

但是,有这个资源: http : //www.pinlady.net/PluginDetect/PDFReader/

基本思路是:

  • 检测浏览器中运行的所有插件
  • 在浏览器的navigator.mimeTypes数组中搜索"application/pdf"
  • 如果navigator.mimeTypes数组测试失败,则在后台运行第二个测试(即前端的用户没有显示任何内容),该测试向浏览器发送一个轻量级的“空”pdf文件,以查看是否可以解释它

当然,在后台运行测试pdf的想法可能是一个昂贵的解决方案(即3G上的移动用户等),但它可能是一个非常可靠的方法,而且好的部分是你只需要测试你的用户一次当他们到达您的域,然后设置一个cookielocalStorage项目并保存他们的pdf配置,这样您就不必继续测试他们的pdffunction。