当前位置: 首页 > 知识库问答 >
问题:

获取PDF文档中的页数

华坚成
2023-03-14

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

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

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

$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 )不起作用,因为只有少数文档内部有参数/count,所以大多数情况下它不会返回任何内容。来源。
  • /\/page\w*(\d+)/(查找/page )没有得到页数,主要包含一些其他数据。来源。
  • /\/n\s+(\d+)/(查找/n )也不起作用,因为文档可以包含/n的多个值;大多数(如果不是全部)不包含PageCount。来源。

共有1个答案

何骞尧
2023-03-14

它可以在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文档,它返回了一个错误的pagecount(还没有)。它也非常快,即使是200+MB的大文档,响应时间也只有几秒钟或更少。

php prettyprint-override">// 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的问题,但我没有找到我想要的答案。这就是为什么我提出这个问题,并自己回答。

 类似资料:
  • 我使用自动化对Word文档进行了大量更改,然后运行了一个VBA宏,其中包括检查文档是否超过一定的页数。 我使用获取页数,但此方法返回的结果不正确。我想这是因为Word还没有更新文档的分页以反映我所做的更改。 也存在同样的问题。

  • 想改进这个问题吗?更新问题,使其仅通过编辑这篇文章来关注一个问题。 我有一个PDF文档,有两页。我需要阅读此文档的第一页,并使用阅读内容创建一个新的PDF文档。我将如何使用iText执行此操作?到目前为止,我无法尝试任何事情,因为我真的不知道如何开始。最好的方法是什么?

  • 我在用iText7做游戏。净c#。我正在尝试在内存中创建一个多页PDF文档(n页数),其中源PDF文档只包含一页。 我可以用一页创建一个新文档,但无法根据需要创建额外的页面。我试过了 但我得到了一个ArgumentOutOfRange例外。。。索引超出范围。。。等 我试图关闭destPdfDoc,然后重新打开它,认为第二页直到我关闭它才被写入。但是当第二次打开destPdfDoc时,它没有页面。我

  • 我有一些文件,我已经用施乐扫描仪数字化成PDF文件。使用Java,我试图从中提取RGB像素数据,用于图像识别应用程序。从零开始开发这个功能有点超出我的水平,所以我依赖第三方库来进行PDF处理。 到目前为止,我已经尝试了两个不同的库;PdfBox和PdfClown。 使用PdfBox,我正在尝试使用方法来获得一个。使用PdfClown我正在尝试使用来自类的方法来获得一个。在这两种情况下返回的图像都是

  • 我尝试了不同的方法,如iframe、object,在网页上作为预览查看/显示文档。iFrame和google文档仅适用于公共可用的文档。如何显示/预览本地主机文件夹中存储的文档。

  • 问题内容: 如何使用PDFBox从PDF文档中读取特定页面(具有页码)? 问题答案: 这应该工作: 如本教程的“ 书签”部分中所示 更新2015年,版本2.0.0快照 似乎已将其删除并放回(?)。 getPage 在2.0.0 javadoc中。要使用它: 该 getAllPages 方法已更名 GETPAGES