Подсчитайте количество страниц в PDF только в PHP

Мне нужен способ подсчитать количество страниц PDF в PHP. Я сделал немного Googling, и единственные вещи, которые я нашел, либо используют сценарии shell / bash, perl, либо другие языки, но мне нужно что-то в родном PHP. Существуют ли какие-либо библиотеки или примеры того, как это сделать?

Вы можете использовать расширение ImageMagick для PHP. ImageMagick понимает PDF, и вы можете использовать команду identify для извлечения количества страниц. Функция PHP – это Imagick :: identImage () .

Если вы используете Linux, это намного быстрее, чем использование identify чтобы получить количество страниц (особенно с большим количеством страниц):

 exec('/usr/bin/pdfinfo '.$tmpfname.' | awk \'/Pages/ {print $2}\'', $output); 

Вам необходимо установить pdfinfo.

Я знаю, что это довольно старый … но если это актуально для меня сейчас, это может быть актуально и для других.

Я просто разработал этот метод получения номеров страниц, так как перечисленные здесь методы неэффективны и чрезвычайно медленны для больших PDF-файлов.

 $im = new Imagick(); $im->pingImage('name_of_pdf_file.pdf'); echo $im->getNumberImages(); 

Кажется, это отлично работает для меня!

Я на самом деле пошел с комбинированным подходом. Поскольку у меня отключен exec на моем сервере, я хотел придерживаться решения на основе PHP, поэтому в итоге получилось:

Код:

 function getNumPagesPdf($filepath){ $fp = @fopen(preg_replace("/\[(.*?)\]/i", "",$filepath),"r"); $max=0; while(!feof($fp)) { $line = fgets($fp,255); if (preg_match('/\/Count [0-9]+/', $line, $matches)){ preg_match('/[0-9]+/',$matches[0], $matches2); if ($max<$matches2[0]) $max=$matches2[0]; } } fclose($fp); if($max==0){ $im = new imagick($filepath); $max=$im->getNumberImages(); } return $max; } 

Если он не может понять, потому что нет меток Count, то он использует расширение php imagick. Причина, по которой я делаю двукратный подход, заключается в том, что последняя довольно медленная.

Вы можете попробовать fpdi (см. Здесь ), как вы можете видеть, когда вы устанавливаете исходный файл, вы возвращаете номера страниц.

Попробуй это :

 <?php if (!$fp = @fopen($_REQUEST['file'],"r")) { echo 'failed opening file '.$_REQUEST['file']; } else { $max=0; while(!feof($fp)) { $line = fgets($fp,255); if (preg_match('/\/Count [0-9]+/', $line, $matches)){ preg_match('/[0-9]+/',$matches[0], $matches2); if ($max<$matches2[0]) $max=$matches2[0]; } } fclose($fp); echo 'There '.($max<2?'is ':'are ').$max.' page'.($max<2?'':'s').' in '. $_REQUEST['file'].'.'; } ?> 

Тег Count показывает количество страниц в разных узлах. Родительский узел имеет сумму других в своем теге Count, поэтому этот скрипт просто ищет max (то есть количество страниц).

 function getNumPagesPdf($filepath) { $fp = @fopen(preg_replace("/\[(.*?)\]/i", "", $filepath), "r"); $max = 0; if (!$fp) { return "Could not open file: $filepath"; } else { while (!@feof($fp)) { $line = @fgets($fp, 255); if (preg_match('/\/Count [0-9]+/', $line, $matches)) { preg_match('/[0-9]+/', $matches[0], $matches2); if ($max < $matches2[0]) { $max = trim($matches2[0]); break; } } } @fclose($fp); } return $max; } 

Это делает именно то, что я хочу:

Я просто разработал этот метод получения страниц в pdf-страницах … после того, как вы получили число страниц в pdf, я просто добавляю разрыв к тому, чтобы он не проходил в бесконечном цикле здесь …

это не использует воображение:

 function getNumPagesInPDF($file) { //http://www.hotscripts.com/forums/php/23533-how-now-get-number-pages-one-document-pdf.html if(!file_exists($file))return null; if (!$fp = @fopen($file,"r"))return null; $max=0; while(!feof($fp)) { $line = fgets($fp,255); if (preg_match('/\/Count [0-9]+/', $line, $matches)){ preg_match('/[0-9]+/',$matches[0], $matches2); if ($max<$matches2[0]) $max=$matches2[0]; } } fclose($fp); return (int)$max; } 
 $pdftext = file_get_contents($caminho1); $num_pag = preg_match_all("/\/Page\W/", $pdftext,$dummy); 

Использование только PHP может привести к установке сложных библиотек, перезапуску Apache и т. Д., И многие чистые PHP-пути (например, открытие потоков и использование регулярных выражений) являются неточными .

Включенный ответ – единственный быстрый и надежный способ, о котором я могу думать. Он использует один исполняемый файл, хотя он не должен быть установлен (либо * nix, либо Windows), и простой PHP-скрипт извлекает результат. Лучше всего, что я еще не видела неправильной настройки!

Его можно найти здесь, в том числе, почему другие подходы «не работают» :

Получить количество страниц в документе PDF

В среде * nix вы можете использовать:

 exec('pdftops ' . $filename . ' - | grep showpage | wc -l', $output); 

Где pdftops должен быть установлен по умолчанию.

Или, как предложил Xethron:

 pdfinfo filename.pdf | grep Pages: | awk '{print $2}'