在保存文件之前,PHP 在上传时计算 PDF 文件上的页数


Php count number of pages on PDF file upon upload prior to saving file

我有一个函数,可以将文件上传到 Web 存储中,如果文件是 pdf 文件,则在将文件保存到存储系统之前,我想确定一个 pdf 文件有多少页。

目前我有以下内容:

    $pdftext = file_get_contents($path);
    $num = preg_match_all("/'/Page'W/", $pdftext, $dummy);
    return $num;

其中$path是我与 fopen 一起使用以打开文档的临时路径

此功能有时有效,但不可靠。我知道还有这个功能

exec('/usr/bin/pdfinfo '.$pdf_file.' | awk ''/Pages/ {print $2}''', $output);

但这需要将文件重新加载到服务器上。有什么想法或建议可以做到这一点吗?

PHP 是一种服务器端语言,这意味着所有处理都发生在您的服务器上。PHP 无法在客户端确定文件的详细信息,它不知道它,也不需要访问它。

所以你现在问题的答案是:这是不可能的。但是你可能有一个目标,为什么要检查这个,分享这个目标可能有助于获得更有建设性的答案/建议。

正如 Oldskool 已经解释的那样,这在客户端的 PHP 中是不可能的。您必须将 PDF 文件上传到服务器,然后确定页数。有一些库和命令行工具可以完成此操作。

如果您不想将PDF文件上传到服务器(这里似乎是这种情况),您可以使用pdf.js库。现在,客户能够自行确定PDF文档中的页数。

PDFJS.getDocument(data).then(function (doc) {
    var numPages = doc.numPages;
}

还有其他库,但我不确定它们的浏览器支持(http://www.electronmedia.in/wp/pdf-page-count-javascript/)

现在,您只需将 javascript 中的页面数量提交到需要此信息的 php 文件即可。为了实现这一点,您只需使用 ajax。如果你不知道ajax,只需谷歌它,那里有足够的例子。

作为旁注;永远记住不要信任客户。客户端能够修改页数并发送完全不同的页数。

对于那些运行Linux服务器的人来说,这实际上是可能的。您需要安装pdfinfo扩展并使用该功能

  $pages = exec('/usr/bin/pdfinfo '.$pdf_file.' | awk ''/Pages/ {print $2}''', $output);

输出正确的页码,其中 $pdf_file 是上载时服务器上的临时路径。

它对我不起作用的原因是因为我没有安装 PDFinfo。