write tag open fundamentals end coding attribute html image pdf iframe jsf-2

tag - html write



Mostrar la primera página de PDF como imagen (4)

Estoy creando una aplicación web en la que estoy mostrando imágenes / pdf en formato de miniatura. Onclicking respect respect image / pdf se abre en una nueva ventana.

Para PDF, tengo (este es el código de la nueva ventana)

<iframe src="images/testes.pdf" width="800" height="200" />

Usando esto puedo ver todos los PDF en el navegador web. Sin embargo, para el propósito de la miniatura, quiero mostrar solo la primera página de PDF como una Imagen.

Lo intenté

<h:graphicImage value="images/testes.pdf" width="800" height="200" />

sin embargo, no está funcionando. ¿Alguna idea de cómo hacer esto?

Actualización 1

Estoy proporcionando ruta de archivo pdf por ejemplo. Sin embargo, tengo imágenes en la base de datos. En real tengo el código como a continuación.

<iframe src="#{PersonalInformationDataBean.myAttachmentString}" width="800" height="200" />

Actualización 2

En aras de la miniatura, lo que estoy usando es

<h:graphicImage height=200 width=200 value="....">

Sin embargo, necesito lograr lo mismo para PDF también.

Espero tener claro lo que estoy esperando ...


Aquí hay un script bash que convierte las páginas en imágenes JPEG.

#!/bin/bash PDF=''doc.pdf'' NUMPAGES=`identify -format %n "$PDF"` for (( IDX=0; IDX<$NUMPAGES; IDX++ )) do PAGE=$(($IDX+1)) convert -resize 1200x900 "$PDF[$IDX]" `echo "$PDF" | sed "s//.pdf$/-page$PAGE.jpg/"` done echo "Done"


No estoy seguro de que todos los navegadores muestren su PDF incrustado (realizado a través de <h:graphicImage value="some.pdf" ... /> ) igualmente bien.

Extrayendo la primera página como PDF

Si insiste en usar PDF, le recomendaría una de estas 2 herramientas de línea de comandos para extraer la primera página de cualquier PDF:

  1. pdftk
  2. Ghostscript

Ambos están disponibles para Linux, Mac OS X y Windows.

comando pdftk

pdftk input.pdf cat 1 output page-1-of-input.pdf

Comando Ghostscript

gs -o page-1-of-input.pdf -sDEVICE=pdfwrite -dPDFLastPage=1 input.pdf

(En Windows use gswin32c.exe o gswin64c.exe lugar de gs ).

pdftk es ligeramente más rápido que Ghostscript en lo que respecta a la extracción de páginas, pero para una sola página esa diferencia es probablemente negligible. A partir de la versión más reciente lanzada, v9.05, la oración anterior ya no es verdadera. Descubrí que Ghostscript (incluida toda la sobrecarga de inicio) requiere ~ 1 segundo para extraer la primera página de la especificación PDF de 756 páginas, mientras que PDFTK necesitaba ~ 11 segundos.

Convertir la primera página a JPEG

Si quiere estar seguro de que incluso los navegadores más antiguos pueden mostrar bien su primera página, conviértala a JPEG. Ghostscript es tu amigo aquí (ImageMagick no puede hacerlo solo, de todos modos necesita la ayuda de Ghostscript):

gs -o page-1-of-input-PDF.jpeg -sDEVICE=jpeg -dLastPage=1 input.pdf

Si necesita la página 33, puede hacerlo así:

gs -o page-33-of-input-PDF.jpeg -sDEVICE=jpeg -dFirstPage=33 -dLastPage33 input.pdf

Si necesita una variedad de archivos PDF, como las páginas 17-23, intente esto:

gs -o page-16+%03d-of-input-PDF.jpeg -sDEVICE=jpeg -dFirstPage=17 -dLastPage23 input.pdf

Tenga en cuenta que la notación %03d aumenta con cada página procesada, comenzando con 1. Por lo tanto, el primer nombre de JPEG sería la page-16+001-of-input-PDF.jpeg .

Quizás PNG es mejor?

Tenga en cuenta que JPEG no es un formato adecuado para imágenes que contienen alto contraste negro + blanco y bordes afilados como páginas de texto. PNG es mucho mejor para esto.

Crear un PNG desde la primera página PDF con Ghostscript es fácil:

gs -o page-1-of-input-PDF.png -sDEVICE=pngalpha -dLastPage=1 input.pdf

Las opciones analógicas como con JPEG son verdaderas cuando se trata de extraer rangos de páginas.


Advertencia: no use el script de Ma9ic (publicado en otra respuesta) a menos que quiera ...

  • ... hacer que la conversión PDF-> JPEG consuma mucho más tiempo + recursos de lo que debería ser
  • ... renunciar a su propio control sobre el proceso de conversión de PDF-> JPEG por completo.

Si bien puede funcionar bien para usted, hay tantos problemas en estas 8 pequeñas líneas de Bash.

Primero,
usa identify para extraer el número de páginas del PDF de entrada. Sin embargo, identify (parte de ImageMagick) es completamente incapaz de procesar archivos PDF por sí mismo. Tiene que ejecutar Ghostscript como un ''delegado'' para manejar la entrada de PDF. Sería mucho más eficiente usar Ghostscript directamente en lugar de ejecutarlo indirectamente, a través de ImageMagick.

Segundo,
usa convert a PDF-> conversión JPEG. La misma observación que arriba: usa Ghostscript de todos modos, ¿por qué no ejecutarlo directamente?

Tercero,
recorre las páginas y ejecuta un proceso de convert diferente para cada página del PDF, es decir, 100 convert para un archivo PDF de 100 páginas. Eso significa que también ejecuta 100 comandos Ghostscript para producir 100 JPEG.

Cuarto ,
La pregunta de Fahim Parkar fue obtener una miniatura de la primera página del PDF, no de todos.

La secuencia de comandos ejecuta al menos 201 comandos diferentes para un PDF de 100 páginas, cuando todo se puede hacer en solo 1 comando. Si Ghostscript directamente ...

  1. ... no solo funcionará más rápido y más eficientemente,
  2. ... pero también le dará un control más detallado y mejor sobre la configuración de calidad de los archivos JPEG.

¡Use la herramienta adecuada para el trabajo y úselo correctamente!

Actualizar:

Desde que me preguntaron, aquí está mi implementación alternativa al script de Ma9ic.

#!/bin/bash infile=${1} gs -q -o $(basename "${infile}")_p%04d.jpeg -sDEVICE=jpeg "${infile}" # To get thumbnail JPEGs with a width 200 pixel use the following command: # gs -q -o name_200px_p%04d.jpg -sDEVICE=jpeg -dPDFFitPage -g200x400 "${infile}" # To get higher quality JPEGs (but also bigger-in-size ones) with a # resolution of 300 dpi use the following command: # gs -q -o name_300dpi_p%04d.jpg -sDEVICE=jpeg -dJPEGQ=100 -r300 "${infile}" echo "Done"

Incluso he ejecutado un punto de referencia en ello. Convertí la especificación PDF-1.7 de 756 páginas en archivos JPEG con ambos scripts:

  • La versión de Ma9ic necesita 1413 segundos para generar los 756 JPEG.
  • Mi versión ahorra el 93% de ese tiempo y demora 91 segundos.
  • Además, el script de Ma9ic produce en mi sistema imágenes JPEG en su mayoría negras, las mías están bien.

Esto es lo que usé

Document document = new Document(); try { document.setFile(myProjectPath); System.out.println("Parsed successfully..."); } catch (PDFException ex) { System.out.println("Error parsing PDF document " + ex); } catch (PDFSecurityException ex) { System.out.println("Error encryption not supported " + ex); } catch (FileNotFoundException ex) { System.out.println("Error file not found " + ex); } catch (IOException ex) { System.out.println("Error handling PDF document " + ex); } // save page caputres to file. float scale = 1.0f; float rotation = 0f; System.out.println("scale == " + scale); // Paint each pages content to an image and write the image to file InputStream fis2 = null; File file = null; for (int i = 0; i < 1; i++) { BufferedImage image = (BufferedImage) document.getPageImage(i, GraphicsRenderingHints.SCREEN, Page.BOUNDARY_CROPBOX, rotation, scale); RenderedImage rendImage = image; // capture the page image to file try { System.out.println("/t capturing page " + i); file = new File(myProjectActualPath + "myImage.png"); ImageIO.write(rendImage, "png", file); fis2 = new BufferedInputStream(new FileInputStream(myProjectActualPath + "myImage.png")); } catch (IOException ioe) { System.out.println("IOException :: " + ioe); } catch (Exception e) { System.out.println("Exception :: " + e); } image.flush(); }