2012-02-10 551 views
24

Estoy usando un script pequeño para convertir PDF a JPG. Eso funciona pero la calidad es muy pobre.Convertir PDF a JPEG con PHP e ImageMagick

El guión:

$im = new imagick('document.pdf[ 0]'); 
$im->setImageColorspace(255); 
$im->setResolution(300, 300); 
$im->setCompressionQuality(95); 
$im->setImageFormat('jpeg'); 
$im->writeImage('thumb.jpg'); 
$im->clear(); 
$im->destroy(); 

Una cosa más, quiero mantener el tamaño original del PDF, pero la conversión surge el tamaño del JPG.

Respuesta

37

Se puede hacer usando setResolution, pero debe hacerlo antes de cargar una imagen. Pruebe algo como esto:

// instantiate Imagick 
$im = new Imagick(); 

$im->setResolution(300,300); 
$im->readimage('document.pdf[0]'); 
$im->setImageFormat('jpeg');  
$im->writeImage('thumb.jpg'); 
$im->clear(); 
$im->destroy(); 
+3

Parece que en algunos casos ImageMagick requiere la instalación de Ghostscript, porque de lo contrario lanzará un error fallido del delegado de Postscript – Zsolti

+0

¿Por qué en el mundo setResolution y setImageResolution hacen cosas diferentes y tienen la misma descripción en los documentos? Gracias, me salvaste por completo. – Hissvard

5

La calidad de la imagen producida a partir del PDF se puede cambiar mediante el establecimiento de la density (que es el DIP) antes de leer en el PDF - esto consigue más allá de ghostscript (gs) debajo de la cual entrama el PDF. Para obtener un buen resultado, muestree el doble de la densidad que necesita y use resample para volver al DPI deseado. Recuerde cambiar el colorspace a RGB si desea un JPEG RGB.

Una versión típica línea de comandos para convert podría ser:

convert -density 600 document.pdf[0] -colorspace RGB -resample 300 output.jpg 

Si necesita recortarla, un comando -shave siguiendo el volver a muestrear es generalmente sensible, si la imagen está centrada dentro de la página.

En cuanto al PHP IMagick extension, bueno, nunca lo uso personalmente, así que no estoy seguro de cómo se especifican los consejos para leer archivos, pero espero que sea posible.

3
$im = new imagick(); 

//this must be called before reading the image, otherwise has no effect 

$img->setResolution(200,200); 

//read the pdf 

$img->readImage("{$pdf_file}[0]"); 
0

Haga clic here para más detalles. Prueba esto:

HTML

<html> 

    <body> 

    <form action="ConvertPdfToImg.php" enctype="multipart/form-data" method="post" name="f1"> 

     <input id="templateDoc" name="templateDoc" type="file" /> 

     <input type="submit" /> 

    </form> 

    </body> 

</html> 

PHP

$pdfAbsolutePath = __DIR__."/test.pdf"; 

if (move_uploaded_file($_FILES['templateDoc']["tmp_name"], $pdfAbsolutePath)) { 

     $im    = new imagick($pdfAbsolutePath); 

     $noOfPagesInPDF = $im->getNumberImages(); 

     if ($noOfPagesInPDF) { 

      for ($i = 0; $i < $noOfPagesInPDF; $i++) { 

       $url = $pdfAbsolutePath.'['.$i.']'; 

       $image = new Imagick($url); 

       $image->setImageFormat("jpg"); 

       $image->writeImage(__DIR__."/".($i+1).'-'.rand().'.jpg'); 

      } 

      echo "All pages of PDF is converted to images"; 

     } 
     echo "PDF doesn't have any pages"; 

} 
+0

Olvidaste totalmente el punto y todo este manejo de las solicitudes no tiene ninguna relación con la pregunta. Y siempre debes decir claramente que estás apuntando a tu propio blog. –