0

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";

}
4

1 に答える 1

1

Imagick::getNumberImagesPDFを開くと、ページ数が表示されると確信しています。同様に、その時点で、ページごとにインスタンス化することなく、magick を使用してそれらを反復処理できます。ただし、これはすべてドキュメントに基づく推測です。したがって、自分でテストして調べる必要があります。

private function create_thumbnails( $num_thumbs = 3) {

    echo "\n\n    creating thumbnails ... ";

    try {
        $Image = new Imagick( $this->file_path_pdf);
        $nbCreated = 0;
        if($num_thumbs > 0) {
           foreach($Image as $idx => $im) {
              if($nbCreated < $num_thumbs) {
                $im->setImageColorspace( 255 );
                $im->setCompression( Imagick::COMPRESSION_JPEG );
                $im->setCompressionQuality( 60 );
                $im->setImageFormat( 'jpg' );

                $im->resizeImage( 180, 232, imagick::FILTER_POINT, 1 );

                // save image
                $im->writeImage( $idx . '-' . $nbCreated . '.jpg' );
                $im->clear();

                $nbCreated++;
              }
              else 
              {
                 break; // pop out of loop we have reach our limit and are done
              }
           }

        }

        $Image->destroy();
    }
    catch( Exception $e ) {
       echo "\n  * failed to create some or all thumbnails: " . $e->getMessage();
       $Image->destroy();    
    }   

    echo "done";
}

また、try/catch がある場所も変更したことに注意してください。IMOは、エラーが発生した場合は、イメージの作成をすべて停止して停止することをお勧めします。これは、単一のファイルを処理する場合、反復ごとにエラーがスローされる可能性があるため、最初の例外で停止する方がおそらく効率的です。別の場所に簡単にラップできます。それが私のやり方です。

于 2012-11-07T00:18:08.990 に答える