我在iframe中查看PDF。它工作正常。但是一些客户端无法在IE中看到它。他们将其作为下载选项。
如何判断浏览器是否有pdf查看器,并提示用户他没有pdf查看器?
注意:我使用的是asp.net mvc 5(c#)。
我试过了this,但没有帮助我。我的一些客户端的问题有Adobe PDF,因此下面的答案没有问题。但那些有nitropdf或chrome pdf查看器的人,下面的回答并没有帮助我。我想识别所有pdf查看器。否则,如果客户端有某种pdf查看器,那么还会显示没有安装pdf查看器的警报。这是错误的。
我通过获取عبد النور التومي's answer的帮助来应用此代码,它适用于chrome和mozilla。 Here is the js I modified
但 IE仍然没有回复。我不知道如何在IE中检查它是否有pdf查看器。 对于IE,虽然有pdf查看器,但我得到了以下错误:
答案 0 :(得分:7)
有一个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()
};
};
答案 1 :(得分:5)
我在عبد النور التومي的帮助下尝试了以下解决方案,这有助于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 viewer:
然后我通过this link解决了它。
然后我为IE 11 trident
添加新条件,现在它工作正常。我还添加了检查foxit reader
的选项。您也可以在条件中添加另一个pdf阅读器名称。
答案 2 :(得分:4)
作为替代方案,您可以使用像viewer.js这样的库在容器中显示您的pdf。
答案 3 :(得分:0)
PDF格式是一种许可的adobe格式,根据我的理解,如果您还需要考虑所有非许可的PDF阅读器,它可能并不总是可靠的检测。
但是,有这个资源:http://www.pinlady.net/PluginDetect/PDFReader/
基本理念是:
"application/pdf"
阵列navigator.mimeTypes
navigator.mimeTypes
数组测试失败,则在后台运行第二个测试(即前端的用户没有显示任何内容),这会向浏览器发送一个轻量级的#34;空的" pdf文件以查看是否可以解释当然,在后台运行测试pdf的想法可能是一个代价高昂的解决方案(即3G上的移动用户等),但它可能是一个非常可靠的方法,而且好的部分是你只需在用户访问您的域时对其进行一次测试,然后设置cookie
或localStorage
项目并保存其pdf配置,这样您就不必继续测试其pdf功能。
答案 4 :(得分:0)
我认为可以从导航器 MimeType 中检查
function isSupportPDF() {
var hasPDFViewer = false;
try {
var pdf =
navigator.mimeTypes &&
navigator.mimeTypes["application/pdf"]
? navigator.mimeTypes["application/pdf"].enabledPlugin
: 0;
if (pdf) hasPDFViewer = true;
} catch (e) {
if (navigator.mimeTypes["application/pdf"] != undefined)
hasPDFViewer = true;
}
return hasPDFViewer;
}