0

我想使用 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";

}
4

1 回答 1

1

我很确定如果您打开 PDF,那么Imagick::getNumberImages会给您页数。同样,此时您可以使用 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";
}

注意我也改变了你尝试/捕捉的地方。如果出现错误,IMO 最好保释并停止一起创建图像,因为如果您正在处理单个文件,那么每次迭代都会抛出错误,因此在第一个异常时停止可能更有效。您可以轻松地将其包装在不同的位置,这就是我的做法。

于 2012-11-07T00:18:08.990 回答