Conversion PDF en 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 a). Et tout semble bon. Mais mon jpg a une dimension de page comme 842x595 px, et DPI est 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 si grand que pdf (sur papier)

26
demandé sur Mat 2011-12-24 17:40:08

5 réponses

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

5
répondu Alasdair 2012-01-02 04:38:03

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 "-density" (qui définit le DPI pour lire le fichier source sous) qui résout spécifiquement votre problème.

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

10
répondu Jonathan Williamson 2012-01-21 17:08:35

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

Pour 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 certains autres attributs doivent être définis, alors laissez-moi vous montrer les informations que $params est maintenant. Cela 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 tout à fait sûr si cela fonctionnera. Est juste un essai afin de vous aider. J'espère sincèrement qu'il fait.

8
répondu Alfredo Castaneda Garcia 2012-01-01 21:37:10

Comme mentionné précédemment, définir 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(); 
5
répondu caugner 2013-04-23 14:53:54

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

1
répondu Pieter 2012-01-07 15:30:11