获取 PDF 文档的页数

新手上路,请多包涵

这个问题是为了参考和比较。解决方案是 以下公认的答案

我花了好几个小时寻找一种快速简单但大部分 准确 的方法来获取 PDF 文档中的页数。由于我在一家经常使用 PDF 的图形印刷和复制公司工作,因此在处理文档之前必须准确知道文档的页数。 PDF 文档来自许多不同的客户端,因此它们不是使用相同的应用程序生成的和/或不使用相同的压缩方法。

以下是我发现 不足 或根本 不起作用 的一些答案:

使用 Imagick (一个 PHP 扩展)

Imagick 需要大量安装,apache 需要重新启动,当我终于让它工作时,处理时间非常长(每个文档 2-3 分钟)并且它总是返回 1 每个文档中的页面(到目前为止还没有看到 Imagick 的工作副本),所以我把它扔掉了。这是 getNumberImages()identifyImage() 方法。

使用 FPDI (一个 PHP 库)

FPDI 易于使用和安装(只需提取文件并调用 PHP 脚本), FPDI 不支持许多压缩技术。然后它返回一个错误:

FPDF 错误:本文档 (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 里面有任何东西,所以大部分时间它不返回. 资源。
  • /\/Page\W*(\d+)/ (寻找 /Page<number> )没有得到页数,主要包含一些其他数据。 资源。
  • /\/N\s+(\d+)/ (寻找 /N <number> )也不起作用,因为文档可以包含 /N 的多个值;大多数(如果不是全部) 包含页数。 资源。

那么,什么工作可靠和准确呢?

请看下面的答案

原文由 Richard de Wit 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
2 个回答

一个简单的命令行可执行文件名为: pdfinfo

可用于 Linux 和 Windows 下载。您下载了一个压缩文件,其中包含几个与 PDF 相关的小程序。在某处提取它。

其中一个文件是 pdfinfo (或 Windows 的 pdfinfo.exe )。在 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 的大文档,响应时间也只有几秒钟或更短。

有一种从输出中提取 pagecount 的简单方法,在 PHP 中:

 // 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 中使用它。

我知道它不是纯 PHP ,但外部程序在 PDF 处理 方面 要好得多(如问题所示)。

我希望这可以帮助人们,因为我花了很多时间试图找到解决方案,并且我看到了很多关于 PDF pagecount 的问题,但我没有找到我想要的答案。这就是我提出这个问题并自己回答的原因。

安全注意事项:如果文档名称来自用户输入或文件上传,则在 $document escapeshellarg

原文由 Richard de Wit 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以使用 mutool

 mutool show FILE.pdf trailer/Root/Pages/Count

mutoolMuPDF 软件包的一部分。

原文由 ninfito 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题