2017-02-10 153 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