我在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
变量相对应的页面缩略图。但是,如果页码超过了文档中的可用页数,这将不起作用。如果输入变量超过PDF文件中的可用页数,或者imagick函数运行起来有困难,我想要的是显示或回显"false"
。我该怎么做?
在理论中,您可以将%n
变量用于identify
命令的-format
参数,以在运行主命令之前查找给定文件(包括PDF)的页数。通过这种方式,您可以使用结果将正确的值填充到主命令中,这样您就不会首先收到错误消息:
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。一页PDF显示10:1——均支持pdfinfo
。
旧的IT口头禅:"为工作使用正确的工具…"
$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());
}