簡體   English   中英

使用PHP進行PDF到JPG的轉換

[英]PDF to JPG conversion using PHP

我正在嘗試使用PHP幫助將PDF轉換為IMG(JPG)。

我正在使用imagick擴展。

這是我的代碼

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

我的源文件pdf文件有正確的尺寸(210x297毫米,像A4一樣)。 一切看起來都不錯。 但我的jpg頁面尺寸為842x595像素,DPI為72。

和img文件在紙上然后pdf,當我打印它時更小。

什么是從pdf制作圖像文件並使其像pdf一樣大的正確方法(在紙上)

你可以通過exec()或類似的方法使用imagemagick,shell參數比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

它是“-density”(將DPI設置為讀取源文件)選項,專門解決您的問題。

默認情況下,imagemagick在大多數情況下使用-quality設置為92進行JPEG寫入 - 因此您可能不需要顯式聲明它。

看起來你錯過了兩個二傳手:

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

和:

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

為了獲得這些函數的正確參數,您可以嘗試以下方法:

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

如果您發現應該設置其他屬性,那么讓我向您展示$ params持有的信息。 它可能證明對您有用:

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

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

說實話,我不完全確定這是否有效。 只是一個嘗試,以幫助您。 我真誠地希望它能做到。

如前所述,在讀取文件之前設置分辨率可以解決問題:

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

ImageMagick使用GhostScript處理JPEG,因此您最好直接exec GhostScript,這樣可以提高效率並為您提供更多控制。 它也只是1個exec語句,而不是使用IMagick函數。

您必須在讀取圖像之前調用setResolution。 否則imagemagick將使用默認系統dpi。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM