这个问题是为了参考和比较。解决方案是。
几个小时以来,我一直在寻找一种快速、简单但大部分准确的方法来获取PDF文档中的页数。由于我在一家图形打印和复制公司工作,该公司大量使用PDF,因此在处理文档之前,必须准确地知道文档的页数。PDF文档来自许多不同的客户端,因此它们不是使用相同的应用程序生成的,并且/或者不使用相同的压缩方法。
以下是我发现不足或无法工作的一些答案
使用Imagick ( PHP扩展)
Imagick需要大量的安装,apache需要重启,当我最终让它工作时,它花了惊人的长时间(每个文档2-3分钟),而且它总是在每个文档中返回1
页面(到目前为止还没有看到Imagick的工作副本),所以我把它扔掉了。getNumberImages()
和identifyImage()
方法都是如此。
使用FPDI ( PHP库)
FPDI易于使用和安装(只需解压缩文件并调用PHP脚本),但是许多压缩技术都不受FPDI支持。然后,它返回一个错误:
FPDI错误:此文档(test_1.pdf)可能使用了FPDI附带的免费解析器不支持的压缩技术。
打开一个流并使用正则表达式进行搜索:
这将在流中打开PDF文件,并搜索某种类型的字符串,其中包含页面计数或类似的内容。
$f = "test1.pdf";
$stream = fopen($f, "r");
$content = fread ($stream, filesize($f));
if(!$stream || !$content)
return 0;
$count = 0;
// Regular Expressions found by Googling (all linked to SO answers):
$regex = "/\/Count\s+(\d+)/";
$regex2 = "/\/Page\W*(\d+)/";
$regex3 = "/\/N\s+(\d+)/";
if(preg_match_all($regex, $content, $matches))
$count = max($matches);
return $count;
/\/Count\s+(\d+)/
(查找/Count <number>
)不起作用,因为只有少数文档内部有参数/Count
,所以大多数时候它不会返回任何内容。Source./\/Page\W*(\d+)/
(查找/Page<number>
)不获取页数,主要包含一些其他数据。Source./\/N\s+(\d+)/
(查找/N <number>
)也不起作用,因为文档可以包含多个/N
值;大多数(如果不是全部)不是包含/N <number>
的。Source.那么,什么是可靠和准确的工作呢?
发布于 2013-02-01 18:33:13
一个简单的命令行可执行文件: pdfinfo。
它是downloadable for Linux and Windows。您下载了一个压缩文件,其中包含几个与PDF相关的小程序。把它提取出来。
其中一个文件是pdfinfo (或pdfinfo.exe for Windows)。下面是在PDF文档上运行它返回的数据示例:
Title: test1.pdf
Author: John Smith
Creator: PScript5.dll Version 5.2.2
Producer: Acrobat Distiller 9.2.0 (Windows)
CreationDate: 01/09/13 19:46:57
ModDate: 01/09/13 19:46:57
Tagged: yes
Form: none
Pages: 13 <-- This is what we need
Encrypted: no
Page size: 2384 x 3370 pts (A0)
File size: 17569259 bytes
Optimized: yes
PDF version: 1.6
我还没有见过PDF文档返回错误的页面计数。它也真的很快,即使是200+ MB的大文档,响应时间也只有几秒钟或更短。
在PHP中,有一种简单的方法可以从输出中提取pagecount:
// Make a function for convenience
function getPDFPages($document)
{
$cmd = "/path/to/pdfinfo"; // Linux
$cmd = "C:\\path\\to\\pdfinfo.exe"; // Windows
// Parse entire output
// Surround with double quotes if file name has spaces
exec("$cmd \"$document\"", $output);
// Iterate through lines
$pagecount = 0;
foreach($output as $op)
{
// Extract the number
if(preg_match("/Pages:\s*(\d+)/i", $op, $matches) === 1)
{
$pagecount = intval($matches[1]);
break;
}
}
return $pagecount;
}
// Use the function
echo getPDFPages("test 1.pdf"); // Output: 13
当然,这个命令行工具也可以在其他语言中使用,这些语言可以解析外部程序的输出,但我在PHP中使用它。
我知道它不是纯粹的PDF,但外部程序在处理方面要好得多(如问题所示)。
我希望这能帮助人们,因为我花了很多时间试图找到这个问题的解决方案,我已经看到了很多关于PDF页面计数的问题,在这些问题中我找不到我想要的答案。这就是我提出这个问题并亲自回答的原因。
发布于 2015-12-30 23:29:17
其中最简单的是使用ImageMagick
下面是一个示例代码
$image = new Imagick();
$image->pingImage('myPdfFile.pdf');
echo $image->getNumberImages();
否则,您还可以使用PDF
库,如MPDF
或PHP
的TCPDF
发布于 2019-08-20 03:26:34
你可以像下面这样使用qpdf
。如果文件file_name.pdf具有100页,
$ qpdf --show-npages file_name.pdf
100
https://stackoverflow.com/questions/14644353
复制相似问题