Hay una gran comparación no solo de soluciones específicas sino de estrategias generales, en la wiki del repositorio pdf2htmlEX . También, aunque no lo he probado, este parece ser un tenedor mantenido.
ShreevatsaR
Respuestas:
540
Probablemente el mejor enfoque es usar la biblioteca PDF.JS. Es un procesador puro de HTML5 / JavaScript para documentos PDF sin complementos de terceros.
Como se señaló en otra respuesta, scribd realmente usa pdf2swf para convertir archivos pdf
Peter Craig el
8
Recomiendo encarecidamente no usar scribd: acabo de realizar un experimento en un documento en particular y en firefox 4 solo muestra las primeras 3 páginas, mientras que en IE9 su texto de representación es incorrecto, compensa algunas secciones de la página. Técnicamente hablando, tiene errores. ¡Además, esperan que se suscriba para imprimir o descargar documentos! Esencialmente están tomando documentos previamente gratuitos y erigiendo un muro de pago a su alrededor.
frankster
99
La biblioteca PDF.js en realidad parece una muy buena solución, aunque la demostración vinculada no muestra incrustada en una página (ocupa toda la página). Pero utiliza el lienzo HMTL5, por lo que debería ser fácil de insertar y es rápido . En el lado negativo , toma algunos js para usar, a diferencia de <object>: github.com/mozilla/pdf.js/blob/master/examples/helloworld/…
LarsH
33
pdf.js funciona mal en navegadores de tabletas como Chrome. También encuentro que es muy, muy lento para documentos PDF más grandes.
Rocco The Taco
10
No puedo creer que esto se recomiende. Mire la representación de la fuente en la demostración en línea, se ven irregulares y horribles. Se ve mucho mejor con la representación de subpíxeles cuando se abre en Adobe Reader.
Speedplane
532
Esto es rápido, fácil, directo y no requiere ningún script de terceros:
Es mejor usar una etiqueta <object> para que pueda incluir una reserva.
Jonathon Hill
1
Pensé que los desarrolladores querrían saber que Mac / Firefox obtiene una imagen de complemento rota. La página del complemento no cargará el complemento que está buscando. ¿Alguna idea de cómo solucionar esto?
Shanimal
63
si desea asegurarse de que se mostrará en lugar de descargar automáticamente el pdf (como me ocurrió), agréguelo type='application/pdf'a la etiqueta de
inserción
32
Es mejor usar la <object>etiqueta porque puede mostrar contenido alternativo en navegadores que no pueden mostrar archivos PDF. Incluso puede poner una <embed>etiqueta en una <object>etiqueta si lo desea. Ref: stackoverflow.com/questions/1244788/embed-vs-object
Raphael
1
@raphaelcm En realidad, como dije antes, solo usar la etiqueta de inserción funciona en todos los principales navegadores. Incluso IE 7 y 8.
Batfan
361
También puede usar el visor de PDF de Google para este propósito. Hasta donde sé, no es una función oficial de Google (¿estoy equivocado en esto?), Pero me funciona muy bien y sin problemas. Necesita cargar su PDF en algún lugar antes y simplemente usar su URL:
Una cosa que debe mencionarse es que hay un límite superior para el tamaño del PDF que se puede mostrar. Creo que actualmente son 10 MB / 100 páginas. PD: No creo que el espectador sea "no oficial"; incluso tienen una página de
instrucciones
30
Esta opción funciona muy bien, pero debe hacer que sus archivos PDF sean de acceso público, lo que para mí no siempre es una opción.
KoviNET
44
@riot_starter esta solución ya no funciona, si está completamente desconectado de google se carga bien, si está completamente conectado se carga bien, sin embargo, si está en el medio (lo que sea que eso signifique) le pedirá su contraseña. Y en el caso del iframe, simplemente no se carga.
dwenaus
55
Se le permite configurar la privacidad de cualquier Docs Google entre public, sign-in requiredy private. Definitivamente es una característica oficial, teniendo en cuenta que cualquier documento en Google Docs tiene una embedopción.
b1nary.atr0phy
66
Otra cosa que debe mencionarse es la advertencia "ha realizado demasiadas solicitudes recientemente", que es una limitación.
kommradHomer
116
Usted tiene cierto control sobre cómo aparece el PDF en el navegador al pasar algunas opciones en la cadena de consulta. Estaba feliz de que esto funcionara, hasta que me di cuenta de que no funciona en IE8. :(
Funciona en Chrome 9 y Firefox 3.6, pero en IE8 muestra el mensaje "Inserte su mensaje de error aquí, si el PDF no se puede mostrar".
Sin embargo, todavía no he probado versiones anteriores de ninguno de los navegadores anteriores. Pero aquí está el código que tengo de todos modos en caso de que ayude a alguien. Esto establece el zoom al 85%, elimina las barras de desplazamiento, las barras de herramientas y los paneles de navegación. Actualizaré mi publicación si encuentro algo que también funciona en IE.
<objectwidth="400"height="500"type="application/pdf"data="/my_pdf.pdf?#zoom=85&scrollbar=0&toolbar=0&navpanes=0"><p>Insert your error message here, if the PDF cannot be displayed.</p></object>
Esa es la mejor solución porque está utilizando las capacidades del navegador y no una solución de terceros complicada. En todos los navegadores modernos (IE9, FF o Chrome), el PDF debe integrarse bien. Perdón por los usuarios de IE 6/7. Tienen que actualizar. Hemos dejado de admitir estos navegadores hace mucho tiempo. :(
Adrian P.
2
No funciona en mi tableta móvil de Chrome..FYI ... lástima, habría sido una solución rápida.
Rocco The Taco
1
+1 para abordar las opciones de zoom y desplazamiento, sin embargo, esto no funciona en la última versión de Chrome (44) ... Error al cargar el documento PDF.
NoJay
¿Es posible agregar un botón de cierre? ¿y cómo?
Roberto Sepúlveda Bravo
@RoccoTheTaco Secundario, no funciona en Chrome móvil en Android
Anónimo
66
Usando ambos <object>y <embed>le dará una mayor amplitud de compatibilidad del navegador.
<objectdata="http://yoursite.com/the.pdf"type="application/pdf"width="750px"height="750px"><embedsrc="http://yoursite.com/the.pdf"type="application/pdf"><p>This browser does not support PDFs. Please download the PDF to view it: <ahref="http://yoursite.com/the.pdf">Download PDF</a>.</p></embed></object>
Esta es una buena opción si necesita una solución rápida, desea evitar problemas de visualización de PDF en varios navegadores y si el PDF es solo una o dos páginas. Por supuesto, necesita instalar ImageMagick (que a su vez necesita Ghostscript) en su servidor web, una opción que podría no estar disponible en entornos de alojamiento compartido. También hay un complemento PHP (llamado imagick) que funciona así, pero tiene sus propios requisitos especiales.
O convierta la imagen a PNG utilizando una aplicación, como Vista previa en Mac.
Garrett
2
pero puedes hacer eso programáticamente?
Dan Mantyla
¿Qué pasa si el documento tiene más de 1 página? Supongo que solo mostrarás la primera página entonces
seb
@seb ha pasado un tiempo, pero pude usarlo en archivos PDF de 2 o 3 páginas. No sería prudente ir mucho más lejos que eso, creo que los navegadores móviles tienen dificultades para mostrar imágenes como esa. Es por eso que lo llamé el método "rápido y sucio", pero creo que es bueno siempre que el PDF no sea más que unas pocas páginas.
Dan Mantyla
1
Si abre el PDF utilizando la biblioteca zend, puede hacer foreach($pdf->pages as $page)y crear una imagen para cada página
99 Problemas - La sintaxis no es uno
19
Eche un vistazo a este código: para incrustar el PDF en HTML
<!-- Embed PDF File --><objectdata="YourFile.pdf"type="application/x-pdf"title="SamplePdf"width="500"height="720"><ahref="YourFile.pdf">shree</a></object>
Esto no parece funcionar. Siempre termino con una pantalla gris en blanco en lugar del pdf. Pero el cambio srcde data, como en la respuesta de @ Gayle, funciona.
Mottie
1
Estoy usando Chrome 44 y no funcionará. También intenté cambiar los datos a src.
NoJay
1
type = "application / pdf" soluciona el problema. Funciona bien en cromo.
Gavin Simpson
13
FDView combina PDF2SWF (que se basa en xpdf ) con un visor SWF para que pueda convertir e incrustar documentos PDF sobre la marcha en su servidor.
xpdf no es un conversor de PDF perfecto. Si necesita mejores resultados, Ghostview tiene la capacidad de convertir documentos PDF a otros formatos para los que puede construir más fácilmente un visor Flash.
Pero para documentos PDF simples, FDView debería funcionar razonablemente bien.
¿FDView está disponible en otro lugar? code4net.com parece haber desaparecido.
Michael Myers
@Michael No es que pueda encontrarlo fácilmente. Dejaré esta respuesta en caso de que alguien vuelva a organizar fdview en otro lugar.
Adam Davis
12
Nuestro problema es que, por razones legales, no podemos almacenar temporalmente un PDF en el disco duro . Además, no se debe volver a cargar toda la página al mostrar un PDF como Vista previa en el navegador.
Primero probamos PDF.jS. Funcionó con Base64 en el visor para Firefox y Chrome. Sin embargo, fue inaceptablemente lento para nuestro PDF. IE / Edge no funcionó en absoluto.
Por lo tanto, lo probamos con una cadena Base64 en una etiqueta de objeto HTML. De nuevo, esto no funcionó para IE / Edge (quizás el mismo problema que con PDF.js). En Chrome / Firefox / Safari nuevamente no hay problema. Por eso elegimos una solución híbrida. IE / Edge usamos un IFrame y para todos los demás navegadores la etiqueta de objeto.
La solución IFrame, por supuesto, también funcionaría para Chrome y compañía. La razón por la que no utilizamos esta solución para Chrome es que, aunque el PDF se muestra correctamente, Chrome realiza una nueva solicitud al servidor tan pronto como hace clic en "descargar" en la vista previa . El PDFHelperTransferData de campo oculto requerido (para enviar nuestros datos de formulario necesarios para la generación de PDF) ya no se establece porque el PDF se muestra en un IFrame. Para esta característica / error verChrome envía dos solicitudes al descargar un PDF (y cancela una de ellas) .
Ahora el problema sigue siendo niños IE9 e IE10. Para estos, renunciamos a una solución de vista previa y simplemente enviamos el documento haciendo clic en el botón de vista previa como descarga para el usuario (en lugar de la vista previa). Hemos intentado mucho, pero incluso si hubiéramos encontrado una solución, el esfuerzo adicional para esta pequeña parte de los usuarios no habría valido la pena. Puede encontrar nuestra solución para la descarga aquí: descargue PDF sin actualizar con IFrame .
Nuestro Javascript:
var transferData = getFormAsJson()if(isMicrosoftBrowser()){// Case IE / Edge (because doesn't recoginzie Pdf-Base64 use Iframe)var form = document.getElementById('pdf-helper-form');
$("#pdfHelperTransferData").val(transferData);
form.target ="iframe-pdf-shower";
form.action ="serverSideFunctonWhichWritesPdfinResponse";
form.submit();}else{// Case non IE use Object tag instead of iframe
$.ajax({
url:"serverSideFunctonWhichRetrivesPdfAsBase64",
type:"post",
data:{ downloadHelperTransferData: transferData },
success:function(result){
$("#object-pdf-shower").attr("data", result);}})}
Lo siento, pero no entiendo, ¿qué tipo de valor tiene la variable "transferData"?
Kate
1
Hola @Kate, en nuestro caso, generamos el PDF basado en la entrada de un usuario en nuestro formulario web. "transferData" contiene los datos que se envían como JSON a la función de generación de PDF en la API web. He agregado una línea más de código para aclaraciones.
George Maharis
10
Puede usar la ubicación relativa del pdf guardado de esta manera:
Esta fue una muy buena solución y funcionó bien en conjunto con el estilo bootstrap. Todo fue por encima de otros elementos de arranque.
netfed
¿Intentaste con blob file? Utilicé esto con pdf.output('bloburl')lib jspdf pero parece que no funciona en IE11.
Hoang Tran Son
8
Scribd ya no requiere que aloje sus documentos en su servidor. Si crea una cuenta con ellos para obtener una ID de editor. Solo se necesitan unas pocas líneas de código JavaScript para cargar archivos PDF almacenados en su propio servidor.
Desearía poder gustar esto más de una vez, funciona perfectamente. Desplácese hasta la parte inferior del sitio web y haga clic en API para ver ejemplos.
Rocco The Taco
1
Las inscripciones ahora están cerradas para scribd.
Para transmitir el archivo al navegador, consulte la pregunta sobre desbordamiento de pila Cómo transmitir un archivo PDF como binario al navegador utilizando .NET 2.0 : tenga en cuenta que, con pequeñas variaciones, esto debería funcionar tanto si está sirviendo un archivo desde el sistema de archivos o generado dinámicamente.
Dicho esto, el artículo de MSDN al que se hace referencia toma una visión bastante simplista del mundo, por lo que es posible que desee leer Transmitir con éxito un PDF al navegador a través de HTTPS también para algunos de los encabezados que necesite suministrar.
Usando ese enfoque, un iframe es probablemente la mejor manera de hacerlo. Tenga un formulario web que transmita el archivo y luego coloque el iframe en otra página con su srcatributo establecido en el primer formulario.
Tuve que previsualizar un PDF con React, así que después de probar varias bibliotecas, mi solución óptima fue obtener los datos y enviarlos.
const pdfBase64 =//fetched from url or generated with jspdf or other library<embed
src={pdfBase64}
width="500"
height="375"
type="application/pdf"></embed>
¿Qué se supone que esto debe lograr? No puedo ver cómo responde la pregunta.
TRiG
Cuando estoy incrustando un PDF en mi HTML, encuentro que la mejor manera es tener un enlace a este documento. como <a href=" server1.network/trifold_JonesChiro.pdf "target='_blank'> Client Portal Trifold (muestra) </a> a veces es una respuesta limpia para abrir una página y mostrar el pdf vs tring para colocarlo en el html También permite que el pdf permanezca abierto en una pestaña.
Wynn
¿Entonces su recomendación es vincular, no incrustar? Eso está bien, pero como respuesta esto no está claro.
Respuestas:
Probablemente el mejor enfoque es usar la biblioteca PDF.JS. Es un procesador puro de HTML5 / JavaScript para documentos PDF sin complementos de terceros.
Demostración en línea: http://mozilla.github.com/pdf.js/web/viewer.html
GitHub: https://github.com/mozilla/pdf.js
fuente
<object>
: github.com/mozilla/pdf.js/blob/master/examples/helloworld/…Esto es rápido, fácil, directo y no requiere ningún script de terceros:
ACTUALIZACIÓN (1/2018):
El navegador Chrome en Android ya no admite incrustaciones de PDF. Puede solucionar esto utilizando el visor de PDF de Google Drive
fuente
type='application/pdf'
a la etiqueta de<object>
etiqueta porque puede mostrar contenido alternativo en navegadores que no pueden mostrar archivos PDF. Incluso puede poner una<embed>
etiqueta en una<object>
etiqueta si lo desea. Ref: stackoverflow.com/questions/1244788/embed-vs-objectTambién puede usar el visor de PDF de Google para este propósito. Hasta donde sé, no es una función oficial de Google (¿estoy equivocado en esto?), Pero me funciona muy bien y sin problemas. Necesita cargar su PDF en algún lugar antes y simplemente usar su URL:
Lo importante es que no necesita un reproductor Flash, usa JavaScript.
fuente
public
,sign-in required
yprivate
. Definitivamente es una característica oficial, teniendo en cuenta que cualquier documento en Google Docs tiene unaembed
opción.Usted tiene cierto control sobre cómo aparece el PDF en el navegador al pasar algunas opciones en la cadena de consulta. Estaba feliz de que esto funcionara, hasta que me di cuenta de que no funciona en IE8. :(
Funciona en Chrome 9 y Firefox 3.6, pero en IE8 muestra el mensaje "Inserte su mensaje de error aquí, si el PDF no se puede mostrar".
Sin embargo, todavía no he probado versiones anteriores de ninguno de los navegadores anteriores. Pero aquí está el código que tengo de todos modos en caso de que ayude a alguien. Esto establece el zoom al 85%, elimina las barras de desplazamiento, las barras de herramientas y los paneles de navegación. Actualizaré mi publicación si encuentro algo que también funciona en IE.
fuente
Usando ambos
<object>
y<embed>
le dará una mayor amplitud de compatibilidad del navegador.fuente
embed
queunsafe
Chrome y Firefox consideraron que usar la etiqueta por sí mismo .Conviértalo a PNG a través de ImageMagick y muestre el PNG (rápido y sucio).
Esta es una buena opción si necesita una solución rápida, desea evitar problemas de visualización de PDF en varios navegadores y si el PDF es solo una o dos páginas. Por supuesto, necesita instalar ImageMagick (que a su vez necesita Ghostscript) en su servidor web, una opción que podría no estar disponible en entornos de alojamiento compartido. También hay un complemento PHP (llamado imagick) que funciona así, pero tiene sus propios requisitos especiales.
fuente
foreach($pdf->pages as $page)
y crear una imagen para cada páginaEche un vistazo a este código: para incrustar el PDF en HTML
fuente
src
dedata
, como en la respuesta de @ Gayle, funciona.FDView combina PDF2SWF (que se basa en xpdf ) con un visor SWF para que pueda convertir e incrustar documentos PDF sobre la marcha en su servidor.
xpdf no es un conversor de PDF perfecto. Si necesita mejores resultados, Ghostview tiene la capacidad de convertir documentos PDF a otros formatos para los que puede construir más fácilmente un visor Flash.
Pero para documentos PDF simples, FDView debería funcionar razonablemente bien.
fuente
Nuestro problema es que, por razones legales, no podemos almacenar temporalmente un PDF en el disco duro . Además, no se debe volver a cargar toda la página al mostrar un PDF como Vista previa en el navegador.
Primero probamos PDF.jS. Funcionó con Base64 en el visor para Firefox y Chrome. Sin embargo, fue inaceptablemente lento para nuestro PDF. IE / Edge no funcionó en absoluto.
Por lo tanto, lo probamos con una cadena Base64 en una etiqueta de objeto HTML. De nuevo, esto no funcionó para IE / Edge (quizás el mismo problema que con PDF.js). En Chrome / Firefox / Safari nuevamente no hay problema. Por eso elegimos una solución híbrida. IE / Edge usamos un IFrame y para todos los demás navegadores la etiqueta de objeto.
La solución IFrame, por supuesto, también funcionaría para Chrome y compañía. La razón por la que no utilizamos esta solución para Chrome es que, aunque el PDF se muestra correctamente, Chrome realiza una nueva solicitud al servidor tan pronto como hace clic en "descargar" en la vista previa . El PDFHelperTransferData de campo oculto requerido (para enviar nuestros datos de formulario necesarios para la generación de PDF) ya no se establece porque el PDF se muestra en un IFrame. Para esta característica / error verChrome envía dos solicitudes al descargar un PDF (y cancela una de ellas) .
Ahora el problema sigue siendo niños IE9 e IE10. Para estos, renunciamos a una solución de vista previa y simplemente enviamos el documento haciendo clic en el botón de vista previa como descarga para el usuario (en lugar de la vista previa). Hemos intentado mucho, pero incluso si hubiéramos encontrado una solución, el esfuerzo adicional para esta pequeña parte de los usuarios no habría valido la pena. Puede encontrar nuestra solución para la descarga aquí: descargue PDF sin actualizar con IFrame .
Nuestro Javascript:
Nuestro HTML:
Para verificar el tipo de navegador para IE / Edge, consulte aquí: ¿Cómo puedo detectar Internet Explorer (IE) y Microsoft Edge usando JavaScript? Espero que estos hallazgos le ahorren tiempo a alguien más.
fuente
Puede usar la ubicación relativa del pdf guardado de esta manera:
Ejemplo 1
Ejemplo2
<iframe src="example.pdf" style="width:1000px; height:800px;" frameborder="0" allowfullscreen></iframe>
fuente
Crea un contenedor para guardar tu PDF
Dígale a PDFObject qué PDF incrustar y dónde incrustarlo
Opcionalmente, puede usar CSS para especificar el estilo visual, incluidas las dimensiones, los bordes, los márgenes, etc.
fuente: https://pdfobject.com/
fuente
pdf.output('bloburl')
lib jspdf pero parece que no funciona en IE11.Scribd ya no requiere que aloje sus documentos en su servidor. Si crea una cuenta con ellos para obtener una ID de editor. Solo se necesitan unas pocas líneas de código JavaScript para cargar archivos PDF almacenados en su propio servidor.
Para obtener más detalles, consulte Herramientas para desarrolladores .
fuente
fuente
PdfToImageServlet usando el
convert
comando ImageMagick .Ejemplo de uso:
<img src='/webAppDirectory/PdfToImageServlet?pdfFile=/usr/share/cups/data/default-testpage.pdf'>
fuente
Así lo hice con AXIOS y Vue.js:
agregue urlPDF dinámicamente a HTML:
fuente
Una de las opciones que debe considerar es Notable PDF.
Tiene un plan gratuito a menos que esté planeando colaborar en línea en tiempo real en PDF
Incruste lo siguiente
iframe
en cualquier html y disfrute de los resultados:fuente
Para transmitir el archivo al navegador, consulte la pregunta sobre desbordamiento de pila Cómo transmitir un archivo PDF como binario al navegador utilizando .NET 2.0 : tenga en cuenta que, con pequeñas variaciones, esto debería funcionar tanto si está sirviendo un archivo desde el sistema de archivos o generado dinámicamente.
Dicho esto, el artículo de MSDN al que se hace referencia toma una visión bastante simplista del mundo, por lo que es posible que desee leer Transmitir con éxito un PDF al navegador a través de HTTPS también para algunos de los encabezados que necesite suministrar.
Usando ese enfoque, un iframe es probablemente la mejor manera de hacerlo. Tenga un formulario web que transmita el archivo y luego coloque el iframe en otra página con su
src
atributo establecido en el primer formulario.fuente
El URI para el iframe debería verse así:
Ahora FF, Chrome, IE 11 y Edge muestran el PDF en un visor en el iframe pasado a través de URI de blob estándar en la URL.
fuente
Tuve que previsualizar un PDF con React, así que después de probar varias bibliotecas, mi solución óptima fue obtener los datos y enviarlos.
fuente
Si no desea alojar PDF.JS por su cuenta, puede probar DocDroid . Es similar al visor de PDF de Google Drive, pero permite la marca personalizada.
fuente
solo use iFrame para PDF.
Tenía necesidades específicas en mi aplicación React.js, probé millones de soluciones pero terminé con un iFrame :) ¡Buena suerte!
fuente
Encontré que esto funciona bien y el navegador lo maneja en Firefox. No he comprobado IE ...
fuente