¿Cómo convierto un documento PDF en una imagen de vista previa en PHP? [cerrado]

199

¿Qué bibliotecas, extensiones, etc. serían necesarias para representar una parte de un documento PDF en un archivo de imagen?

La mayoría de las bibliotecas PDF de PHP que he encontrado se centran en la creación de documentos PDF, pero ¿hay alguna manera simple de representar un documento en un formato de imagen adecuado para uso web?

Nuestro entorno es una pila LAMP.

Mathew Byrne
fuente
Me encantaría poder hacer esto y que el archivo tenga una .jpgextensión. Intenté el método .htaccess AddHandler y no funcionó.
Keyslinger

Respuestas:

228

Necesitas ImageMagickyGhostScript

<?php
$im = new imagick('file.pdf[0]');
$im->setImageFormat('jpg');
header('Content-Type: image/jpeg');
echo $im;
?>

Los [0]medios page 1.

Paolo Bergantino
fuente
11
Si, funciona. También puede hacer: $ im-> setResolution (300, 300) por ejemplo para renderizar su pdf a la resolución deseada.
Luis Melgratti
66
No lo he probado, pero si está usando documentos de Google y no le importa el iFrame, esta sugerencia podría funcionar (también es un complemento de wp) forrst.com/posts/PDF_thumbnails_with_Google_Docs-6G6
David
44
pero cómo incluir ImageMagick y GhostScript en el archivo php
namratha
1
@ think123 use $im->thumbnailImage(1500, 0);Eso establecerá su imagen jpg en un ancho de 1500 y retendrá la escala. Ver documentación
Kevin Jantzer
1
De mi respuesta a continuación: si está cargando el PDF desde un blob, así es como obtiene la primera página en lugar de la última página: $ im-> readimageblob ($ blob); $ im-> setiteratorindex (0);
jrjohnson
34

Para aquellos que no tienen ImageMagick por cualquier razón, las funciones GD también funcionarán, junto con GhostScript. Ejecute el comando ghostscript con exec()para convertir un PDF a JPG y manipule el archivo resultante con imagecreatefromjpeg().

Ejecute el comando ghostscript:

exec('gs -dSAFER -dBATCH -sDEVICE=jpeg -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -r300 -sOutputFile=whatever.jpg input.pdf')

Para manipular, cree una nueva imagen de marcador de posición $newimage = imagecreatetruecolor(...), y traiga la imagen actual. $image = imagecreatefromjpeg('whatever.jpg'), y luego puede usar imagecopyresampled()para cambiar el tamaño, o cualquier número de otros imagemagickcomandos no integrados

Andrés
fuente
3
Para obtener una imagen de la primera página, agregue los modificadores -dFirstPage = 1 -dLastPage = 1 al comando.
Tim Dearborn
Si todavía no funciona, es posible que deba proporcionar la ruta completa al gsbinario.
Craned
Parece que está ejecutando un comando del sistema. ¿Qué pasa si el usuario sube un archivo llamado something;rm -rf /?
iProgram
Si quiero que toda la página del pdf se convierta en imagen. entonces como hacer?
Dhara
31

También puede obtener el recuento de páginas usando

$im->getNumberImages();

Luego puede crear los pulgares de todas las páginas usando un bucle, por ejemplo.

'file.pdf['.$x.']'
Jason
fuente
34
(Esto debería ser un comentario sobre la respuesta de Paolo Bergantino)
Simon East
respuesta inteligente. no dado por otro pero te das cuenta y escribiste.
Ashu Kumar
16

Utiliza la extensión php Imagick . Para controlar el tamaño deseado de la imagen de salida ráster, use la función setResolution

<?php    
$im = new Imagick();
$im->setResolution(300, 300);     //set the resolution of the resulting jpg
$im->readImage('file.pdf[0]');    //[0] for the first page
$im->setImageFormat('jpg');
header('Content-Type: image/jpeg');
echo $im;
?>

(Extensión sobre Paolo Bergantino su respuesta y Luis Melgratti su comentario. Debe establecer la resolución antes de cargar la imagen).

Sebastian
fuente
11

Si está cargando el PDF desde un blob, así es como obtiene la primera página en lugar de la última página:

$im->readimageblob($blob);
$im->setiteratorindex(0);
jrjohnson
fuente
10
(Esto debería ser un comentario sobre la respuesta de Paolo Bergantino)
Simon East
9

También puede intentar ejecutar la utilidad 'convertir' que viene con imagemagick.

exec("convert pdf_doc.pdf image.jpg");
echo 'image-0.jpg';
Preet Sandhu
fuente
3
En lugar de pdf_doc.pdf, se prefiere pdf_doc.pdf [0].
John Kurlak
convertir es parte del paquete ImageMagick; intente sudo yum instalar ImageMagick
Jack Miller
Si aún no funciona, es posible que deba proporcionar la ruta completa al convertbinario.
Craned
1
echo 'image-0.jpg';devuelve una cadena
suz
funcionó para mí, gracias
Isabella
4

Soy el autor de PDFlib, que es un contenedor de GhostScript para php, la ventaja de usar esta biblioteca es que ya está probado y no requiereImageMagic

Los GhostScriptcomandos siempre son más rápidos que ImageMagiccuando se trata de pdf, por lo que debe elegir un contenedor GhostScript o comandos GhostScript puros

$pdflib = new ImalH\PDFLib\PDFLib();
$pdflib->setPdfPath($pdf_file_path);
$pdflib->setOutputPath($folder_path_for_images);
$pdflib->convert();
imal hasaranga perera
fuente
Hola, estoy usando su PDFlib para crear PNG a partir de archivos PDF. $ pdflib = nuevo ImalH \ PDFLib \ PDFLib (); $ pdflib-> setPdfPath ($ pdf_file_path); $ pdflib-> setOutputPath ($ folder_path_for_images); $ pdflib-> setImageFormat (\ ImalH \ PDFLib \ PDFLib :: $ IMAGE_FORMAT_PNG); $ pdflib-> setDPI (100); $ pdflib-> setPageRange (1, $ pdflib-> getNumberOfPages ()); $ pdflib-> convert (); ¿PDFlib tiene una opción para establecer el ancho y alto de los archivos PNG creados?
WGS
Hola, no PDFLib no proporciona métodos para manipular imágenes, pero puede hacerlo así. una vez que generó los pngs usando PDFLib, puede usar otra biblioteca de manipulación de imágenes como github.com/Treinetic/ImageArtist para hacer su trabajo ...
imal hasaranga perera
intente el método anterior que sugerí, pero si aún tiene dificultades, envíeme un correo electrónico a [email protected] y lo ayudaré con un código de muestra ... ¡¡¡salud !!
imal hasaranga perera
Voy a intentarlo Gracias por la sugerencia.
WGS
3

Lo instalo terminado! Ha funcionado!

Puede hacer imagemagick de instalación base en Windows.

En php (local)uso llame exec(<command line>) ex:

<?php
$pdf = "filename.pdf";
$info = pathinfo($pdf);
$file_name =  basename($pdf,'.'.$info['extension']);
echo $file_name;
$pdf = "filename.pdf[0]";
exec("convert $pdf convert-img/$file_name.jpg");    
?>

Además, puedes usarlo class imagicken la clase PHP Imagick

Gracias a todos me ayudaron!

Duy Khanh
fuente
2

Piensa diferente, puedes usar la siguiente biblioteca para convertir pdf a imagen usando javascript

http://usefulangle.com/post/24/pdf-to-jpeg-png-with-pdfjs

jewelhuq
fuente
Si quiero mostrar la imagen de vista previa en el servidor, ¿cómo podemos usar eso?
chithra
Es posible que desee echar un vistazo a esto: github.com/scandel/pdfThumbnails . Creo que puede cargar la miniatura de la imagen generada aquí junto con el archivo real y guardarla, de esta manera ahorrará más tiempo computacional en su servidor (ya que el proceso de creación de miniaturas se realizó en una computadora del lado del cliente).
sajed zarrinpour
1

Aquí hay una clase simple que he escrito y usado en un par de proyectos. Simplemente envuelve imagicky maneja la escritura de cada página en el disco. Si alguien todavía está buscando una manera fácil de hacer esto, este enlace puede ser útil.

usuario664995
fuente
2
Las respuestas de solo enlace tienen un valor bajo en StackOverflow porque si el enlace se mueve o muere, la respuesta se vuelve absolutamente inútil. Para mejorar su respuesta, la mayor parte de su solución debe codificarse aquí.
mickmackusa