2011-12-24 15 views
26

Estoy tratando de convertir PDF a IMG (JPG) con ayuda de PHP.Conversión de PDF a JPG usando PHP

Estoy usando la extensión de imagick.

este es mi código

$fp_pdf = fopen($pdf, 'rb'); 

    $img = new imagick(); // [0] can be used to set page number 
    $img->readImageFile($fp_pdf); 
    $img->setImageFormat("jpg"); 
    $img->setImageCompression(imagick::COMPRESSION_JPEG); 
    $img->setImageCompressionQuality(90); 

    $img->setResolution(300,300); 

    $img->setImageUnits(imagick::RESOLUTION_PIXELSPERINCH); 

    $data = $img->getImageBlob(); 

mi archivo PDF de origen tiene dimensión correcta (210x297 mm, como A4 tiene). Y todo se ve bien Pero mi jpg tiene una dimensión de página como 842x595 px, y DPI es 72.

y archivo img mucho más pequeño en papel que pdf, cuando lo imprimí.

lo que es una forma correcta de hacer archivo de imagen de PDF y que sea tan grande como PDF (en papel)

+0

todo lo último que he implementado a través de comandos de la consola ghostscript (gs), resultado es excelente! la velocidad es rapida! ¡muy rapido! – user1016265

Respuesta

5

ImageMagick utiliza GhostScript para procesar archivos JPEG, por lo que sería mejor que exec GhostScript directamente, lo que sería mucho más eficiente y le daría más control. También sería solo una declaración de 1 exec, en lugar de jugar con las funciones de IMagick.

+0

en proyecto real lo hice excatly como sugirió. Está trabajando más rápido, y el resultado es más esperado;) – user1016265

8

Parece que se ha perdido dos organismos:

Imagick :: setImagePage() http://www.php.net/manual/en/function.imagick-setimagepage.php

Y:

Imagick :: setImageExtent() http://www.php.net/manual/en/function.imagick-setimageextent.php

con el fin de conseguir la correcta pa rámetros para estas funciones, se pueden tratar lo siguiente:

$fp_pdf = fopen($pdf, 'rb'); 
$params=array(); 

    $img = new imagick(); 
    $img->readImageFile($fp_pdf); 
    /*my modification: */$img->setImageUnits(imagick::RESOLUTION_PIXELSPERINCH); 
    /*my modification: */$params=$img->identifyImage(); 
    $img->setImageFormat("jpg"); 
    $img->setImageCompression(imagick::COMPRESSION_JPEG); 
    $img->setImageCompressionQuality(90); 
    /*my modification: */$img->setPage($params['geometry']['width'], $params['geometry']['height'], 0, 0) 
    /*my modification: */$img->setResolution($params['resolution']['x'], $params['resolution']['y']); 
    $img->setImageUnits(imagick::RESOLUTION_PIXELSPERINCH); 
    $data = $img->getImageBlob(); 

Si usted encuentra que algunos otros atributos se deben establecer, a continuación, deja que te muestre la información que $ params está llevando a cabo. Es posible que una prueba útil para Usted:

$params=array(
    [imageName], 
    [format], 
    [geometry] => Array 
     (
      [width] 
      [height] 
     ) 
    [type], 
    [colorSpace], 
    [resolution], 
     (
      [x] 
      [y] 
     ) 

    [units], 
    [fileSize], 
    [compression], 
    [signature], 

)

Para ser honesto, no estoy completamente seguro de si esto va a funcionar. Es solo un intento para ayudarte. Sinceramente espero que sí.

+0

Gracias por responder, pero ¿cómo puedo imaginarme cuál es el valor que debo aprobar en estas funciones? El PDF tiene un tamaño de papel A4, ¿cómo puedo saber qué tanto en píxeles debería hacer la misma dimensión en papel? o con fines de impresión solo se usará el valor de DPI? – user1016265

+0

¡Oh! Ya veo ... déjame reescribir mi respuesta para agregar algunos detalles –

+0

no ayuda. Esta es información sobre el pdf http://o7.no/uAMcLa. Lo más extraño es que hice esta convertación usando shell_exec ("convert -density 300 -units pixelsperinch + matte in out"). y la imagen resultante se convierten en las dimensiones esperadas. – user1016265

0

Tienes que llamar a setResolution antes de leer la imagen. De lo contrario, imagemagick usará los ppp predeterminados del sistema.

10

Puede usar imagemagick a través de exec() o similar, los argumentos del shell son mucho menos detallados que la extensión de PHP.

$pdf_file = escapeshellarg("mysafepdf.pdf"); 
$jpg_file = escapeshellarg("output.jpg"); 

$result = 0; 
exec("convert -density 300 {$pdf_file} {$jpg_file}", null, $result); 

// at this point $result should == 0 if the conversion was successful 

Es el "-Densidad" (que establece el DPI para leer el archivo de origen como) la opción que fija específicamente a su problema.

imagemagick también utiliza una configuración de calidad de 92 para la escritura JPEG en la mayoría de los casos, por lo que probablemente no tenga que declararla explícitamente.

3

Como se ha mencionado antes, establecer la resolución antes de leer el archivo hace el truco:

$fp_pdf = fopen($pdf, 'rb'); 

$img = new imagick(); // [0] can be used to set page number 
$img->setResolution(300,300); 
$img->readImageFile($fp_pdf); 
$img->setImageFormat("jpg"); 
$img->setImageCompression(imagick::COMPRESSION_JPEG); 
$img->setImageCompressionQuality(90); 

$img->setImageUnits(imagick::RESOLUTION_PIXELSPERINCH); 

$data = $img->getImageBlob();