¿Cómo saber si el browser tiene visor de PDF o no?

Estoy viendo PDF en iframe. Funciona bien. Pero algunos de los clientes no pueden verlo en IE. Lo obtienen como una opción de descarga.

¿Cómo puedo identificar si el browser tiene visor de PDF o no e indicarle al usuario que no tiene visor de PDF?

Nota: Estoy usando asp.net mvc 5 (c #).

Intenté esto , pero no me ayudes. El problema conmigo es que algunos clientes tienen Adobe PDF, por lo que no hay problema con la respuesta a continuación. Pero aquellos que tienen nitropdf o Chrome pdf viewer, debajo de la respuesta no me ayudan. Quiero identificar todo el visor de pdf. de lo contrario, si el cliente tiene algún tipo de visor de PDF, también se mostrará alerta de que no está instalado el visor de PDF. Y eso está mal.

Apliqué este código obteniendo ayuda de la respuesta de عبد النور التومي y funcionó para chrome y mozilla. Aquí está el js que modifiqué .

Pero IE todavía no responde. No sé cómo comprobar en IE que tiene visor de PDF o no. Para IE, estoy recibiendo un error de seguimiento, aunque hay un visor de PDF allí:

enter image description here

Hay una solución JS:

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

Se sabe que API getAcrobatInfo es:

 // 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() }; }; 

Traté de seguir la solución gracias a la ayuda de عبد النور التومي , que ayuda a cualquier visor de PDF en cromo y 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 }; } 

Y obtuve un error de seguimiento para IE, aunque tengo un visor de PDF instalado en mi browser .: enter image description here

Entonces lo resolví por este enlace .

Luego agrego nuevas condiciones para IE 11 trident y ahora funciona bien. También agregué la opción para verificar el foxit reader . puede agregar otro nombre de lector de PDF también en o condición.

Como alternativa, puede usar una biblioteca como viewer.js para mostrar su pdf en un contenedor.

ver http://viewerjs.org/

El formatting PDF es un formatting de adobe con licencia, por lo que es probable que no siempre sea una detección confiable si necesita contar con todos los lectores de PDF sin licencia.

Sin embargo, existe este recurso: http://www.pinlady.net/PluginDetect/PDFReader/

La idea básica es:

  • Detecta todos los complementos que se ejecutan en el browser
  • Busque "application/pdf" en la matriz navigator.mimeTypes del navigator.mimeTypes
  • Si falla la testing de matriz navigator.mimeTypes , se ejecuta una segunda testing en segundo plano (es decir, nada mostrado al usuario en la interfaz) que envía al browser un file pdf "vacío" liviano para ver si puede interpretarse

Por supuesto, la idea de ejecutar un pdf de testing en segundo plano puede ser una solución costosa (es decir, usuarios de dispositivos mobilees con 3G, etc.) pero probablemente sea un método bastante confiable, y lo bueno es que solo debe probar a su usuario una vez cuando lleguen a su dominio y luego configuren una cookie o localStorage elemento localStorage con su configuration de PDF guardada para que no tenga que seguir probando su capacidad de PDF.