2017-02-10 15 views
1

Я хотел бы обнаружить поврежденный PDF с помощью PHP. Я смог определить, что на не поврежденном pdf у меня есть тег «%% EOF» в конце файла. Я также проверил, что этот тег поврежден, и он не отображается.Verifiy поврежден PDF с использованием PHP

У меня возникла идея автоматически проверить действительность моего 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 и $ п являются ул но, когда я хочу сравнить его, я никогда не получаю равенства/соответствия. Я также пытался с ==, но результат тот же.

Я также пробовал так:

<?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 с $n="%%EOF\n"; или trim($endfile); сначала для удаления конечной линии.

+0

Спасибо за ваш ответ. Проблема решена. Спасибо за объяснения. – Rflow