PHP pdf轉化為圖片(PNG)

ainiaa發表於2018-06-28
/**
 * 將pdf檔案轉化為多張png圖片
 * @param string $pdf  pdf所在路徑 (/www/pdf/abc.pdf pdf所在的絕對路徑)
 * @param string $path 新生成圖片所在路徑 (/www/pngs/)
 *
 * @return array|bool
 */
function pdf2png($pdf, $path)
{
    if (!extension_loaded('imagick')) {
        return false;
    }
    if (!file_exists($pdf)) {
        return false;
    }
    $im = new Imagick();
    $im->setResolution(120, 120); //設定解析度 值越大解析度越高
    $im->setCompressionQuality(100);
    $im->readImage($pdf);
    foreach ($im as $k => $v) {
        $v->setImageFormat('png');
        $fileName = $path . md5($k . time()) . '.png';
        if ($v->writeImage($fileName) == true) {
            $return[] = $fileName;
        }
    }
    return $return;
}

/**
 * 將pdf轉化為單一png圖片
 * @param string $pdf  pdf所在路徑 (/www/pdf/abc.pdf pdf所在的絕對路徑)
 * @param string $path 新生成圖片所在路徑 (/www/pngs/)
 *
 * @throws Exception
 */
function pdf2png2($pdf, $path)
{
    try {
        $im = new Imagick();
        $im->setCompressionQuality(100);
        $im->setResolution(120, 120);//設定解析度 值越大解析度越高
        $im->readImage($pdf);

        $canvas = new Imagick();
        $imgNum = $im->getNumberImages();
        //$canvas->setResolution(120, 120);
        foreach ($im as $k => $sub) {
            $sub->setImageFormat('png');
            //$sub->setResolution(120, 120);
            $sub->stripImage();
            $sub->trimImage(0);
            $width  = $sub->getImageWidth() + 10;
            $height = $sub->getImageHeight() + 10;
            if ($k + 1 == $imgNum) {
                $height += 10;
            } //最後新增10的height
            $canvas->newImage($width, $height, new ImagickPixel('white'));
            $canvas->compositeImage($sub, Imagick::COMPOSITE_DEFAULT, 5, 5);
        }

        $canvas->resetIterator();
        $canvas->appendImages(true)->writeImage($path . microtime(true) . '.png');
    } catch (Exception $e) {
        throw $e;
    }
}

PS: 無論是轉化為多張還是單張圖片,都需要安裝PHP的Imagick擴充套件。

其實,這兩個方法還可以再優化,比如可以自定義設定圖片的解析度,存放圖片的地址不存在的時候,可以自動建立目錄之類的。這些問題和轉化圖片,就不多寫了。


相關文章