php - convertir - imagick
Conversión de PDF a JPG usando PHP (5)
Como se mencionó anteriormente, 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();
Estoy tratando de convertir PDF a IMG (JPG) con ayuda de 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 fuente tiene la dimensión correcta (210x297 mm, como A4 tiene). Y todo se ve bien Pero mi jpg tiene una dimensión de página de 842x595 px, y DPI es 72.
y el archivo img es mucho más pequeño en papel que pdf, cuando lo imprimí.
¿Cuál es una forma adecuada de hacer un archivo de imagen desde el pdf y hacerlo tan grande como el pdf (en papel)
ImageMagick utiliza GhostScript para procesar archivos JPEG, por lo que sería mejor ejecutar directamente GhostScript, que sería mucho más eficiente y le daría más control. También sería solo 1 declaración exec
, en lugar de jugar con las funciones IMagick.
Parece que te perdiste dos setters:
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
Para obtener los parámetros correctos para estas funciones, puede intentar 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 encuentra que se deben establecer algunos otros atributos, entonces permítame mostrarle la información que $ params contiene. Puede ser útil para usted:
$params=array(
[imageName],
[format],
[geometry] => Array
(
[width]
[height]
)
[type],
[colorSpace],
[resolution],
(
[x]
[y]
)
[units],
[fileSize],
[compression],
[signature],
)
Para ser sincero, no estoy completamente seguro de si esto funcionará. Es solo un intento para ayudarte. Sinceramente espero que sí.
Puede usar imagemagick a través de exec () o similar, los argumentos del shell son mucho menos detallados que la extensión 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 la opción "-densidad" (que establece el DPI para leer el archivo de origen como) que soluciona específicamente su problema.
Asimismo, imagemagick utiliza de forma predeterminada una configuración de calidad de 92 para la escritura JPEG en la mayoría de los casos, por lo que probablemente no necesite declararla explícitamente.
Tienes que llamar a setResolution antes de leer la imagen. De lo contrario, imagemagick usará los ppp predeterminados del sistema.