Verifiy使用PHP损坏了PDF

时间:2017-02-10 16:00:21

标签: php pdf corrupt

我想使用PHP检测损坏的PDF。我已经能够确定在没有损坏的pdf上我有标签" %% EOF"在文件的末尾。我还检查了这个标签已损坏但没有出现。

我有想法在将PDF文件上传到我的服务器之前自动检查PDF文件的有效性。



<?php
$file = file('good.pdf');

$endfile= $file[count($file) - 1];

echo gettype($endfile),"\n";
echo $endfile,"\n";

?>
&#13;
&#13;
&#13;

我得到了这个结果

&#13;
&#13;
string %%EOF 
&#13;
&#13;
&#13;

目前,一切似乎都很好,但在比较结果时我遇到了问题。

我测试了这段代码

&#13;
&#13;
<?php
$file = file('good.pdf');
$endfile= $file[count($file) - 1];
$n="%%EOF";

echo $endfile;
echo $n;

if ($endfile === $n) {
    echo "good";

} else {
    echo "corrupted";
}

?>
&#13;
&#13;
&#13;

我得到了这个结果

&#13;
&#13;
%%EOF %%EOF corrupted
&#13;
&#13;
&#13;

我知道$ endfile和$ n是字符串但是当我想比较它时,我永远不会得到相等/匹配。我也试过==但结果是一样的。

我也是这样尝试的:

&#13;
&#13;
<?php
$file = file('good.pdf');
$endfile= $file[count($file) - 1];
$var1val = $endfile;
$var2val = "%%EOF";
echo $var2val;
echo $var1val;
$n = strcmp($var1val,$var2val); // 0 mean that they are the same
echo $n;
if ($n == 0) {
    echo "good";

} else {
    echo "corrupted";
}

?>
&#13;
&#13;
&#13;

但我得到了这个结果:

&#13;
&#13;
%%EOF %%EOF 1 corrupted
&#13;
&#13;
&#13;

它给了我与===相同的结果。

我只测试了一个工作且未损坏的pdf。你知道为什么这不起作用吗?也许你有其他方法使用php检查pdf是否在我自动上传到我的服务器之前是否已损坏?

2 个答案:

答案 0 :(得分:4)

阅读http://php.net/manual/en/function.file.php

  

返回数组中的文件。数组的每个元素对应于文件中的一行,仍然附加换行符。您需要删除新行才能正确比较。

您需要执行以下操作:

<?php
$file = file('good.pdf');
$endfile= trim($file[count($file) - 1]);
$n="%%EOF";


if ($endfile === $n) {
    echo "good";

} else {
    echo "corrupted";
}

答案 1 :(得分:2)

我自己测试了这一点并注意到了一些事情:

php > echo $endfile;
%%EOF
php > echo strlen($endfile);
6

看起来像5个字符,但它实际上是6.最后有一个换行符:

php > var_dump($endfile == "%%EOF");
php shell code:1:
bool(false)
php > var_dump($endfile == "%%EOF\n");
php shell code:1:
bool(true)

首先与$n="%%EOF\n";trim($endfile);进行比较,然后删除结尾。