Мне нужен способ подсчитать количество страниц 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}'