在pdf缩略图创建中显示自定义错误消息 - PHP - Imagick

时间:2011-06-29 11:51:45

标签: php imagemagick imagick

我在Windows PC上使用PHP5运行Apache。我已经成功配置了Ghostscript和Image magic。我有一个生成pdf缩略图的脚本如下;

<?php
$file = 'test.pdf';
$page = 1;
$pdfpage = $page - 1;
$nh = 200;
$nw = 200;

$im = new imagick(realpath($file)."[$pdfpage]");
$im->setCompression(Imagick::COMPRESSION_JPEG);
$im->setCompressionQuality(100);
$im->setImageFormat("jpeg");
$im->sampleImage($nw,$nh);
$im->writeImage("test.jpg");
echo "true";
?>

这对我很有用。该脚本生成与$page变量对应的页面缩略图。但是,如果页码超过文档中的可用页数,则无法使用。我想要的是显示或回显"false"如果输入变量超过PDF文件中的可用页数,或者想象力函数运行有些困难。我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

理论中,您可以将%n变量用于-format命令的identify参数,以查找页数('框架', “图像”)给定文件,包括PDF,之前运行主命令。这样您就可以使用结果将正确的值填入主命令中,这样您就不会首先收到错误消息:

identify -format %n some.pdf

练习中,这可能是 非常慢 (因为ImageMagick似乎首先渲染完整的PDF以计算页面数。)< / p>

因此,我的建议是使用外部命令行工具来获取PDF页面的数量:pdfinfo。此工具专门用于PDF文件,它知道在哪里查找此信息(因为此数字是任何PDF文件所需元数据的一部分,pdfinfo不需要先渲染每个页面,然后才能吐出信息):

pdfinfo some.pdf | grep Pages:
pdfinfo some.pdf | grep Pages: | awk '{print $2}'

只是让你看到两个命令的不同性能级别,我确实针对包含PDF-1.7官方ISO 32000规范的文件运行它:

time identify  -format %n ~/Downloads/PDF32000_2008.pdf 
756

real  0m51.902s
user  0m50.133s
sys   0m1.090s


time pdfinfo ~/Downloads/PDF32000_2008.pdf | grep Pages: | awk '{print $2}'
756

real  0m0.138s
user  0m0.041s
sys   0m0.016s

因此,756页PDF文档的性能差异为51.9秒,而0.138秒(或376:1)。

我还测试了一个12页的PDF文件。这里的性能比为31:1。一页1页PDF显示 10:1 - 全都赞成pdfinfo

旧IT口头禅:'使用合适的工具......'

答案 1 :(得分:0)

$file        = 'test.pdf';
$total_pages = 1; // Probably should already know pages but if you don't, you can find out with imagick
$pdfpage     = $page - 1;
$nh          = 200;
$nw          = 200;

try {
    for($current_page = $total_pages; $current_page >= 0;$current_page--) {
        $im = new imagick(realpath($file)."[$pdfpage]");
        $im->setCompression(Imagick::COMPRESSION_JPEG);
        $im->setCompressionQuality(100);
        $im->setImageFormat("jpeg");
        $im->sampleImage($nw,$nh);
        $im->writeImage("test.jpg");
        if ($im->haspreviousimage()) { // Imagick reads pages in reverse order, thats why we're getting the previous image
            $im->previousimage();
        } else {
            break;
        }
    }
} catch (ImagickException $e) {
    die('ImagickException ' . $e->getMessage());
} catch (Exception $e) {
    die('Exception ' . $e->getMessage());
}