通过PHP检测PDF是否加密的最简单方法

6

我正在寻找一种最佳方法,使用PHP检测给定的PDF是否被加密。我不需要解密或编辑它之类的操作。我的想法是,如果用户上传了加密的PDF文件,则简单地向他们提供错误消息。

大多数PHP的PDF解析库似乎都需要将整个PDF读入内存才能进行解析。对于我的目的来说,将整个PDF读入内存是不可接受的,因为我要处理的PDF可能有几十甚至上百兆字节大。

调用pdfinfo程序并不是一个好选择(因为我不喜欢启动新进程),但如果没有其他选项,这就是解决方案。我对PDF的二进制结构了解得不够,甚至无法编写足够的解析器来检测这个,所以pdfinfo可能是唯一的选择。

简而言之,有没有一种易于实现的纯PHP方法(没有C扩展)可以检测PDF是否被加密(也就是需要密码保护),而不需要将整个文件读入内存?


可能是重复的问题:如何在PHP中检查PDF文件是否受密码保护 - Adam
这个重复的评论中的FPDF库无法在PDF文件版本大于1.4的情况下工作。此外,建议使用pdfinfo(或其他东西)来进行命令行调用,但我想避免这样做。 - pleonasm
2个回答

4
很不幸,PDF文件的加密标志(即“/Encrypt”)位于文件末尾。
正常的文件解析函数从文件开头读取到文件末尾(或达到一定长度),因此如果您想确定PDF是否已加密/受保护,则可能需要读取整个文件,这就是为什么大多数PDF解析库都会读取整个文件进行解析的逻辑原因。
当前服务器的性能应该可以处理大型PDF文件的读取而没有问题。
我个人使用以下脚本,它可以在没有性能问题的情况下工作:
<?php
$filename= "./useruploads/". $uploadedfilename; 
$handle = fopen($filename, "r");
$contents = fread($handle, filesize($filename));
fclose($handle);

if (stristr($contents, "/Encrypt")) 
{echo " (Suspected Enrypted PDF File !)";}
else
{echo " OK ";}  
?>

0

看起来最简单的方法是使用pdflib。虽然它是C扩展,但这是解决此问题的最快且最可靠的方式,而无需转向其他程序。


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