首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >获取PDF文档中的页数

获取PDF文档中的页数
EN

Stack Overflow用户
提问于 2013-02-01 18:33:13
回答 15查看 99.9K关注 0票数 71

这个问题是为了参考和比较。解决方案是。

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

以下是我发现不足或无法工作的一些答案

使用Imagick ( PHP扩展)

Imagick需要大量的安装,apache需要重启,当我最终让它工作时,它花了惊人的长时间(每个文档2-3分钟),而且它总是在每个文档中返回1页面(到目前为止还没有看到Imagick的工作副本),所以我把它扔掉了。getNumberImages()identifyImage()方法都是如此。

使用FPDI ( PHP库)

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

FPDI错误:此文档(test_1.pdf)可能使用了FPDI附带的免费解析器不支持的压缩技术。

打开一个流并使用正则表达式进行搜索:

这将在流中打开PDF文件,并搜索某种类型的字符串,其中包含页面计数或类似的内容。

代码语言:javascript
复制
$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.

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

See the answer below

EN

回答 15

Stack Overflow用户

回答已采纳

发布于 2013-02-01 18:33:13

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

它是downloadable for Linux and Windows。您下载了一个压缩文件,其中包含几个与PDF相关的小程序。把它提取出来。

其中一个文件是pdfinfo (或pdfinfo.exe for Windows)。下面是在PDF文档上运行它返回的数据示例:

代码语言:javascript
复制
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:

代码语言:javascript
复制
// 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页面计数的问题,在这些问题中我找不到我想要的答案。这就是我提出这个问题并亲自回答的原因。

票数 104
EN

Stack Overflow用户

发布于 2015-12-30 23:29:17

其中最简单的是使用ImageMagick

下面是一个示例代码

代码语言:javascript
复制
$image = new Imagick();
$image->pingImage('myPdfFile.pdf');
echo $image->getNumberImages();

否则,您还可以使用PDF库,如MPDFPHPTCPDF

票数 24
EN

Stack Overflow用户

发布于 2019-08-20 03:26:34

你可以像下面这样使用qpdf。如果文件file_name.pdf具有100页,

代码语言:javascript
复制
$ qpdf --show-npages file_name.pdf
100
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14644353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档