Как узнать, поддерживает ли браузер средство просмотра PDF или нет?

Я просматриваю PDF в iframe. Он работает нормально. Но некоторые из клиентов не видят этого в IE. Они получают его как вариант загрузки.

Как я могу определить, имеет ли браузер просмотрщик PDF или нет, и попросите пользователя, чтобы он не просматривал PDF?

Примечание. Я использую asp.net mvc 5 (С#).

Я пробовал этот, но не помог мне. Проблема со мной у какого-то клиента есть Adobe PDF, поэтому нет проблем для ответа ниже. Но те, у кого есть nitropdf или chrome pdf viewer, ниже ответа, не помогают мне. Я хочу, чтобы idenitify все просмотрщик pdf. в противном случае, если у клиента есть какой-то просмотрщик PDF, тогда также будет отображаться предупреждение о том, что программа просмотра PDF не установлена. И это неправильно.

Я применил этот код, получив справку عبد النور التومي answer, и он работал на хром и мозилла. Здесь js я изменен.

Но IE все еще не отвечает на него. Я не знаю, как проверить в IE, что у него есть программа просмотра PDF или нет. Для IE я получаю следующую ошибку, хотя есть программа просмотра PDF:

enter image description here

Ответы

Ответ 1

Я попробовал следующее решение, взяв справку из عبد النور التومي, которая помогает любому просмотрщику PDF в хроме и mozilla

    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, установленная в моем браузере. enter image description here

Тогда я решил его эту ссылку.

Затем я добавляю новое условие для IE 11 trident, и теперь он отлично работает. Также я добавил параметр для проверки foxit reader. вы можете добавить другое имя читателя PDF также в состояние или условие.

Ответ 2

Существует решение 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()
  };
};

Ответ 3

В качестве альтернативы вы можете использовать библиотеку, например viewer.js, для отображения вашего pdf файла в контейнере.

см. http://viewerjs.org/

Ответ 4

Формат PDF - это лицензионный формат Adobe, по моему мнению, он, вероятно, не всегда будет надежным обнаружением, если вам также необходимо учитывать все нелицензированные PDF-ридеры.

Однако есть этот ресурс: http://www.pinlady.net/PluginDetect/PDFReader/

Основная идея:

  • Обнаружить все плагины, запущенные в браузере
  • Найдите "application/pdf" в массиве navigator.mimeTypes браузера
  • Если тест массива navigator.mimeTypes терпит неудачу, второй тест выполняется в фоновом режиме (т.е. ничего не отображается пользователю на интерфейсе), который отправляет браузеру легкий "пустой" pdf файл, чтобы увидеть, можно ли его интерпретировать

Конечно, идея запуска тестового pdf в фоновом режиме может быть дорогостоящим решением (например, мобильными пользователями на 3G и т.д.), но, вероятно, это будет довольно надежный метод, и хорошая часть - вам нужно только проверить ваш пользователь один раз, когда они достигнут вашего домена, а затем установите элемент cookie или localStorage с сохраненной конфигурацией в pdf, поэтому вам не нужно продолжать тестирование своих возможностей PDF.