web-dev-qa-db-fra.com

PDF en conversion JPG en utilisant PHP

J'essaie de convertir PDF en IMG (JPG) avec l'aide de PHP.

J'utilise l'extension imagick.

c'est mon code

    $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(); 

mon fichier pdf source a la bonne dimension (210x297 mm, comme A4). Et tout a l'air bien. Mais mon jpg a une dimension de page de 842 x 595 px et un DPI de 72.

et le fichier img beaucoup plus petit sur papier que pdf, quand je l'avais imprimé.

quelle est la bonne façon de créer un fichier image à partir de pdf et de le rendre aussi grand que pdf (sur papier)

26
user1016265

ImageMagick utilise GhostScript pour traiter les fichiers JPEG, vous feriez donc mieux de exec GhostScript directement, ce qui serait beaucoup plus efficace et vous donnerait plus de contrôle. Ce serait également seulement 1 exec instruction, au lieu de jouer avec les fonctions IMagick.

5
Alasdair

Vous pouvez utiliser imagemagick via exec () ou similaire, les arguments Shell sont beaucoup moins verbeux que l'extension 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

C'est l'option "-densité" (qui définit le DPI pour lire le fichier source en tant que) qui résout spécifiquement votre problème.

Imagemagick utilise également par défaut un paramètre de qualité de 92 pour l'écriture JPEG dans la plupart des cas - vous n'avez donc probablement pas besoin de le déclarer explicitement.

11
Jonathan Williamson

On dirait que vous avez manqué deux setters:

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

Et:

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

Afin d'obtenir les paramètres corrects pour ces fonctions, vous pouvez essayer ce qui suit:

$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 vous trouvez que d'autres attributs doivent être définis, laissez-moi vous montrer les informations que $ params détient. Il peut vous être utile:

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

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

)

Pour être honnête, je ne suis pas complètement sûr que cela fonctionnera. C'est juste un essai pour vous aider. J'espère sincèrement que oui.

8

Comme mentionné précédemment, régler la résolution avant de lire le fichier fait l'affaire:

$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(); 
6
caugner

Vous devez appeler setResolution avant de lire l'image. Sinon, imagemagick utilisera le dpi système par défaut.

1
Pieter