我想使用 PHP、ImageMagick 和 Imagick(PHP 类)来创建 PDF 的缩略图。有些 PDF 只有一页,有些则有很多。我想指定要创建的缩略图数 ( N ),PDF 中的前 N 页中的每一页都有一个。
下面的代码有效,但是当 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";
}