2017-02-10 81 views
1

我想使用PHP检测已损坏的PDF。我已经能够确定没有损坏的PDF文件末尾有标签“%% EOF”。我也检查了这个标签损坏,并没有出现。使用PHP验证已损坏的PDF

我的想法是在上载到我的服务器之前自动检查我的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是否没有损坏,然后我自动将其上传到我的服务器?

+0

所以你定义的PDF是有效的,因为它有%% EOF标记?!这有点奇怪,因为具有此内容的单个文本文件将被视为您的有效PDF ...您必须更深入地检查文件格式才能检查PDF文件的有效性。 –

+0

我选择这种方法取决于我生成的pdf。当我分析了所有损坏的pdf时,EOF标记从未到达。 – Rflow

回答

2

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"; 
} 
+0

谢谢你的回答。我试过了,它工作得很好;) – Rflow

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) 

所以要么比较w ith $n="%%EOF\n";trim($endfile);先删除endline。

+0

谢谢你的回答。问题已经解决了。感谢您的解释。 – Rflow