0

我在我的 Windows PC 中使用 PHP5 运行 Apache。我已经成功配置了 Ghostscript 和 Image 魔术。我有一个生成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 文件中的可用页数,或者 imagick 函数运行起来有些困难,我想要显示或回显。我怎样才能做到这一点?

4

2 回答 2

1

理论上,在运行主命令之前,您可以使用命令参数的%n变量来查找给定文件(包括 PDF)的页数('frames'、'images') 。这样,您可以使用结果将正确的值填充到您的主命令中,这样您就不会首先收到错误消息:-formatidentify

identify -format %n some.pdf

实际上,这可能非常慢(因为ImageMagick似乎首先虚拟地呈现完整的 PDF 以计算页面数)。

因此,我的建议是使用外部命令行工具来获取 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 口头禅:“为工作使用正确的工具……”

于 2012-08-13T13:42:29.597 回答
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());
}
于 2012-03-26T16:06:22.650 回答