【问题标题】:How to know if browser has PDF viewer or not?如何知道浏览器是否有 PDF 查看器?
【发布时间】:2014-07-26 04:24:32
【问题描述】:

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

如何判断浏览器是否有pdf查看器并提示用户没有pdf查看器?

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

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

我通过从عبد النور التومي's answer 获得帮助应用了此代码,它适用于 chrome 和 mozilla。 Here is the js I modified.

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

【问题讨论】:

  • 这个解决方案是检查是否安装了pdf阅读器:Webbrowser, detect if there is a PDF reader installed?
  • 这怎么不是重复的? (重新开始投票)
  • @VDesign,它对所有浏览器和所有客户端都没有帮助
  • @bjb568,它对所有浏览器和所有客户端都没有帮助
  • @DKS 好的,哪个客户端?更详细地编辑以使您的问题与众不同。

标签: c# javascript html internet-explorer pdf


【解决方案1】:

有一个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()
  };
};

【讨论】:

  • 我在上面尝试过,但它并不总是有效。我的客户在他的浏览器中具有 pdf 查看功能,但它仍然提醒未安装 pdf 查看器。我不认为这个解决方案适用于所有浏览器的所有类型的 pdf 查看器
  • 我的问题有些客户有 Adob​​e PDF,所以下面的答案没有问题。但是那些有nitropdf或chrome pdf查看器的人,下面的答案对我没有帮助。我想识别所有 pdf 查看器。否则,如果客户端有某种 pdf 查看器,则还会显示未安装 pdf 查看器的警报。
  • 我试过 IE,虽然我有 pdf 查看器,但它显示没有 PDF 查看器。所以我,警告错误消息,我收到消息:Automation server can't create object。我不知道该怎么办。
【解决方案2】:

我通过عبد النور التومي 的帮助尝试了以下解决方案,这对 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


   };
}

虽然我在浏览器中安装了 pdf 查看器,但 IE 出现以下错误:

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

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

【讨论】:

    【解决方案3】:

    作为替代方案,您可以使用诸如 viewer.js 之类的库在容器中显示您的 pdf。

    http://viewerjs.org/

    【讨论】:

      【解决方案4】:

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

      不过有这个资源:http://www.pinlady.net/PluginDetect/PDFReader/

      基本思路是:

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

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

      【讨论】:

        【解决方案5】:

        我认为可以通过导航器 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;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-05-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-26
          • 2011-04-17
          • 1970-01-01
          相关资源
          最近更新 更多