使用PHP如何检查PDF文件内容的有效性?

6

我正在尝试实现一个功能,它应该能够检测pdf文件及其内容是否有效。使用以下脚本,我可以轻松地检测文件是否为pdf:

  $info = pathinfo("test.pdf");
  if ($info["extension"] == "pdf"){
  echo "PDF file";
  }

现在我想要检查一个文件是否是pdf格式,如果是,则该文件的内容应该是有效的。

请告诉我如何检查pdf文件的内容是否有效,而不是损坏或无效格式。


你可以尝试使用FPDI,看看如果文件无效,该函数是否会返回0页。 - Rimble
3个回答

16

PDF文件的内容以%PDF-版本号为开头,因此首先要使用以下脚本获取PDF文件的内容:

$filecontent = file_get_contents("test.pdf");

然后使用以下正则表达式检查$filecontent变量,以检测它是有效格式还是无效格式:

if (preg_match("/^%PDF-1.5/", $filecontent)) {
    echo "Valid pdf";
} else {
    echo "In Valid pdf";
}

注意: Pdf版本可能不同,如1.0、1.5、1.7等...在我的情况下,它是1.5,还请确保您将上述代码放置在scripts/conditions(如果文件具有.pdf扩展名)中。


2
这只是一个可能性检查,魔术字节风格。它将识别您是否输入了一个单词文档,但不会检查PDF文件是否有效。尽管如此,它似乎对操作员已经足够了。 - mkl
1
我没有指定版本,所以PDF版本可以是任何数字。preg_match("/^%PDF-/", $filecontent) - Jeff Luyet
请注意,如果您在if语句中使用返回语句,则可以删除else情况。 - Bram
2
我建议您也检查一下内容是否与“%%EOF\v*$”匹配。 这样,您就可以确定自己没有得到半个PDF文件(下载中断或其他原因)。 - danielklejnstrup
1
@danielklejnstrup提到了关于“%%EOF”的一个好观点。我们已经对我们的网站进行了渗透测试,该公司成功上传了一个以PDF扩展名命名并在开头包含“%PDF-”的文件。在该标头之后是一个准备启动一些恶意软件的PHP脚本。但是没有“%%EOF”。这可能不是绝对保证文件中没有隐藏着shell或其他可执行脚本的保证,但每个测试都是朝着安全的又一步。 - UncaAlby

2
我使用FPDI来创建和导入现有的pdf文件。 当pdf文件无效时,会抛出一个错误:无法找到PDF文件头; 当pdf有效时,将通过。
目前对我来说一切都很正常。
try {
    $pdf = new \setasign\Fpdi\Tcpdf\Fpdi();
    $pdf->AddPage();
    $pdf->setSourceFile($filepath);
    $pdf->_destroy();
    return true;
} catch (\Exception $e) {
    debug('Pdf validation failed. error: ' . $e->getMessage());
    return false;
}

我发现使用Fpdi解析pdf文件时,必须使用他们的商业版本。
他们的商业版本可能完全正常工作。
但是我们最终采用了修改文件头部的方法来防止XSS攻击。 当我们将pdf上传到aws S3时,设置为:
'ContentType' => 'application/octet-stream'

通过这种方式,当我们通过URL访问这个PDF文件时,默认情况下会下载它,而不是直接打开它。
同样地,当上传到您自己的服务器时,您也可以采用类似的方法。
此外,通过应用AWS的WAF,还可以拦截PDF中的XSS攻击。

0

PHP可以使用内置库HaruPDF创建PDF文件,但不能直接读取、解析或验证PDF文件。您需要一个外部库或工具来完成这个任务。您可以尝试使用pdftk,但它似乎只适用于Windows系统,可能不是您想要的解决方案。


pdftk 可作为 Linux 命令行工具使用,是 Debian 主要软件库的一部分。因此,如果您拥有足够的权限,就可以从 PHP 中执行 pdftk。 - danielklejnstrup
还有一个名为“qpdf”的Linux命令行工具。使用这样的工具来验证传入文件可能是尽可能可靠的。PDF头和页脚是不错的步骤,但你仍然需要一些东西来验证中间的内容。 - UncaAlby

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接