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

时间:2014-06-05 08:54:17

标签: c# javascript html5 internet-explorer pdf

我在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查看器,但我得到了以下错误:

enter image description here

5 个答案:

答案 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: enter image description here

然后我通过this link解决了它。

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

答案 2 :(得分:4)

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

请参阅http://viewerjs.org/

答案 3 :(得分:0)

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

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

基本理念是:

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

当然,在后台运行测试pdf的想法可能是一个代价高昂的解决方案(即3G上的移动用户等),但它可能是一个非常可靠的方法,而且好的部分是你只需在用户访问您的域时对其进行一次测试,然后设置cookielocalStorage项目并保存其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;
}