首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP Imagick 讀取 PDF 生成 PNG 縮圖:兩種實作與效能比較

     編輯:PHP 相關知識

利用 php_imagick 擴展,提供「指定頁碼單張輸出」與「全頁批次輸出」兩種模式,涵蓋解析度、壓縮品質、縮放模式等關鍵參數設定。

前置需求

  • 安裝 ImageMagick 並啟用 php_imagick 擴展
  • 確認 extension_loaded('imagick') 為 true
  • PDF 處理需 ImageMagick 內建 Ghostscript 委派

方法一:指定頁碼單張輸出(適合封面/首頁縮圖)

<?php
/**
 * PDF 指定頁轉 PNG
 * @param string $pdfPath  PDF 檔路徑
 * @param string $saveDir  輸出目錄
 * @param int    $page     頁碼:0=第一頁,-1=全部(此函式僅處理單頁)
 * @return string|false    成功回傳檔案路徑
 */
function pdf2png(string $pdfPath, string $saveDir, int $page = 0) {
    if (!is_dir($saveDir)) mkdir($saveDir, 0755, true);
    if (!extension_loaded('imagick')) return false;
    if (!file_exists($pdfPath)) return false;

    $im = new Imagick();
    $im->setResolution(150, 150);          // 解析度 DPI,越高越清晰但檔案越大
    $im->setCompressionQuality(85);        // JPEG/PNG 壓縮品質 0-100
    $im->readImage("{$pdfPath}[{$page}]"); // 讀取指定頁
    $im->scaleImage(300, 0, true);         // 等比縮放寬度 300px,高度 0 表自動
    // $im->thumbnailImage(300, 200, true); // 或用裁剪縮圖

    $fileName = $saveDir . '/' . md5($pdfPath . $page . microtime(true)) . '.png';
    return $im->writeImage($fileName) ? $fileName : false;
}

// 使用
$thumb = pdf2png('uploads/report.pdf', 'thumbs', 0);
if ($thumb) echo "";
?>

方法二:全頁批次輸出(適合文件預覽)

<?php
function pdfAllPages2png(string $pdfPath, string $saveDir) {
    if (!extension_loaded('imagick') || !file_exists($pdfPath)) return false;

    $im = new Imagick();
    $im->setResolution(120, 120);
    $im->setCompressionQuality(90);
    $im->readImage($pdfPath); // 讀取全部頁

    $results = [];
    foreach ($im as $i => $frame) {
        $frame->setImageFormat('png');
        $frame->scaleImage(250, 0); // 統一寬度
        $file = $saveDir . '/' . basename($pdfPath, '.pdf') . "_page{$i}.png";
        if ($frame->writeImage($file)) $results[] = $file;
    }
    return $results;
}
?>

關鍵參數調教建議

參數建議值說明
setResolution120-200DPI 越高文字越銳利,記憶體/CPU 成長平方
setCompressionQuality80-90PNG 無損壓縮品質,檔案大小折衷
scaleImage vs thumbnailImagescaleImage等比縮放不裁剪;thumbnail 會裁剪填滿框
記憶體限制ini_set('memory_limit', '256M')大 PDF 需調高

常見錯誤排查

  • PDFDelegateFailed:Ghostscript 未安裝或路徑未加入系統 PATH。
  • Allowed memory exhausted:調高 memory_limit 或降低 DPI。
  • 輸出空白/黑圖:PDF 含透明度,需 $im->setBackgroundColor(new ImagickPixel('white'))。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved