我想使用PHP,ImageMagick和Imagick(PHP類)來創建PDF的縮略圖。有些PDF只會有一個頁面,有些會有很多。我想指定一個數字(N)的縮略圖來創建,其中一個用於PDF中的前N個頁面。如何使用Imagick,ImageMagick和PHP從PDF創建特定數量的縮略圖?
下面的代碼有效,但是當PDF沒有足夠的頁面時會產生錯誤(因爲我試圖在不存在的PDF頁面上實例化Imagick)。我也知道ImageMagick可以在從命令行使用PDF時爲所有頁面創建縮略圖。我想以最有效的方式(內存和處理器)模仿這種行爲,同時控制創建的拇指數量......我只需要大型PDF中前N頁的縮略圖。
我已經看過各種方法來確定PDF中的頁面數量,它們似乎都是資源密集型的。也許下面的代碼是我最好的選擇。它完成了我的目標,但困擾我,因爲它會導致一些錯誤......即使它們不影響最終結果。
這裏是我的代碼,目前的工作(有錯誤時,PDF比N頁更少):
private function create_thumbnails(
$num_thumbs = 3 // how many thumbnails to create, defaults to one
) {
echo "\n\n creating thumbnails ... ";
$num_thumbs_created = 0;
while($num_thumbs_created < $num_thumbs)
{
try {
// instantiate imagick with the pdf
$Image = new Imagick($this->file_path_pdf . '[' . $num_thumbs_created . ']');
// define image file
$Image->setImageColorspace(255);
$Image->setCompression(Imagick::COMPRESSION_JPEG);
$Image->setCompressionQuality(60);
$Image->setImageFormat('jpg');
// size the thumbnail
// - resized relative to 8.5x11 (assuming most pdfs are paper sized)
$Image->resizeImage(180, 232, imagick::FILTER_POINT, 1);
// save image
$Image->writeImage(substr($this->File->path, 0, -4) . '-' . $num_thumbs_created . '.jpg');
$Image->clear();
$num_thumbs_created++;
} catch(Exception $e) {
echo "\n * failed to create some or all thumbnails: " . $e->getMessage();
break;
}
}
$Image->destroy();
echo "done";
}
你看過poppler庫嗎? http://poppler.freedesktop.org/你必須運行pdfinfo命令,從輸出字符串中提取頁面數量,然後你就可以得到它......有點迂迴,但它會工作。 –
@MAtthew:但在這點上,他可以從cli執行imagemagick並做到這一點。 – prodigitalson
@prodigitalson雖然imagemagick identify命令比poppler的pdfinfo慢得多。我同意它不完全乾淨和直接,但有時候稍候更容易破解cli命令並稍後重構。 –