使用PHP验证损坏的PDF

slwdgvem  于 2022-12-10  发布在  PHP
关注(0)|答案(3)|浏览(245)

我想使用PHP检测损坏的PDF。我已经能够确定,在未损坏的PDF上,我有标记“%%EOF”在文件的结尾。我还检查了损坏的此标记,它没有出现。
我有一个想法,自动检查我的PDF文件的有效性,然后再上传到我的服务器。

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

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

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

?>

我得到这个结果

string %%EOF

就目前而言,一切似乎都很好,但我在比较结果时有一个问题。
我测试了这个代码

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

echo $endfile;
echo $n;

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

} else {
    echo "corrupted";
}

?>

我得到这个结果

%%EOF %%EOF corrupted

我知道$endfile和$n都是字符串,但是当我想比较它们的时候,我从来没有得到相等/匹配。我也试过用==,但是结果是一样的。
我也这样试过:

<?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";
}

?>

但我得到的结果是:

%%EOF %%EOF 1 corrupted

它给出了与===相同的结果。
我只测试了一个工作和未损坏的pdf。你知道为什么这是不工作吗?也许你有其他方法使用php来检查如果pdf没有损坏之前,我自动上传到我的服务器?

iq0todco

iq0todco1#

阅读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";
}
eagi6jfj

eagi6jfj2#

我自己测试了一下,发现了一些东西:

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);进行比较,以删除端线。

b1payxdu

b1payxdu3#

您可以检查pdf内容的开头和结尾

<?php
$pdfFile=file('...file.pdf');
$end=trim(end($pdfFile));

if(substr($pdfFile[0],0,4)=='%PDF' && substr($end,-5)=='%%EOF')
{
   echo "IS GOOD";
}

相关问题