簡體   English   中英

在 pdf 縮略圖創建中顯示自定義錯誤消息 - PHP - Imagick

[英]Display custom error message in pdf thumbnail creation - PHP - Imagick

我在我的 windows PC 中使用 PHP5 運行 Apache。 我已經成功配置了 Ghostscript 和 Image 魔術。 我有一個腳本來生成 pdf 縮略圖如下;

<?php
$file = 'test.pdf';
$page = 1;
$pdfpage = $page - 1;
$nh = 200;
$nw = 200;

$im = new imagick(realpath($file)."[$pdfpage]");
$im->setCompression(Imagick::COMPRESSION_JPEG);
$im->setCompressionQuality(100);
$im->setImageFormat("jpeg");
$im->sampleImage($nw,$nh);
$im->writeImage("test.jpg");
echo "true";
?>

這對我很有用。 該腳本生成與$page變量對應的頁面縮略圖。 但是,如果頁碼超過文檔中可用的頁數,這將不起作用。 如果輸入變量超過 PDF 文件中的可用頁數,或者 imagick function 運行起來有些困難,我想要顯示或回顯"false" 我怎樣才能做到這一點?

理論上,您可以在運行主命令之前,使用identify命令的-format參數的%n變量來查找給定文件(包括 PDF)的頁數(“幀”、“圖像”)。 這樣,您可以使用結果將正確的值填充到您的主命令中,這樣您就不會首先收到錯誤消息:

identify -format %n some.pdf

實際上,這可能非常慢(因為 ImageMagick 似乎首先呈現完整的 PDF 以計算頁面)。

因此,我的建議是使用外部命令行工具來獲取 PDF 頁面的數量: pdfinfo 此工具專門用於 PDF 文件,它知道在哪里查找此信息(因為此數字是任何 PDF 文件所需的元數據的一部分,pdfinfo 不需要先渲染每個頁面,然后才能吐出信息):

pdfinfo some.pdf | grep Pages:
pdfinfo some.pdf | grep Pages: | awk '{print $2}'

為了讓您看到這兩個命令的不同性能級別,我確實針對包含 PDF-1.7 的官方 ISO 32000 規范的文件運行了它:

time identify  -format %n ~/Downloads/PDF32000_2008.pdf 
756

real  0m51.902s
user  0m50.133s
sys   0m1.090s


time pdfinfo ~/Downloads/PDF32000_2008.pdf | grep Pages: | awk '{print $2}'
756

real  0m0.138s
user  0m0.041s
sys   0m0.016s

因此,756 頁 PDF 文檔的性能差異為 51.9 秒與 0.138 秒(或 376:1)。

我還測試了一個 12 頁的 PDF 文件。 這里的性能比是 31:1。 一頁的 PDF 顯示 10:1 - 全部支持pdfinfo

古老的 IT 口頭禪: “為工作使用正確的工具……”

$file        = 'test.pdf';
$total_pages = 1; // Probably should already know pages but if you don't, you can find out with imagick
$pdfpage     = $page - 1;
$nh          = 200;
$nw          = 200;

try {
    for($current_page = $total_pages; $current_page >= 0;$current_page--) {
        $im = new imagick(realpath($file)."[$pdfpage]");
        $im->setCompression(Imagick::COMPRESSION_JPEG);
        $im->setCompressionQuality(100);
        $im->setImageFormat("jpeg");
        $im->sampleImage($nw,$nh);
        $im->writeImage("test.jpg");
        if ($im->haspreviousimage()) { // Imagick reads pages in reverse order, thats why we're getting the previous image
            $im->previousimage();
        } else {
            break;
        }
    }
} catch (ImagickException $e) {
    die('ImagickException ' . $e->getMessage());
} catch (Exception $e) {
    die('Exception ' . $e->getMessage());
}

暫無
暫無

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

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