PHP、ImageMagick、Imagick(PHPクラス)を使用してPDFのサムネイルを作成したいと思います。一部のPDFには1ページしかないものもあれば、多くのページがあるものもあります。PDFの最初のNページごとに1つずつ、作成するサムネイルの数(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";
}