Мне нужен способ подсчета количества страниц PDF в PHP. Я сделал немного Googling, и единственные вещи, которые я нашел, либо используют shell/ bash скрипты, perl или другие языки, но мне нужно что-то в родном PHP. Существуют ли какие-либо библиотеки или примеры того, как это сделать?
Подсчитайте количество страниц в PDF только в PHP
Ответ 1
Вы можете использовать расширение ImageMagick для PHP. ImageMagick понимает PDF, и вы можете использовать команду identify
для извлечения количества страниц. Функция PHP Imagick:: identImage().
Ответ 2
Если вы используете Linux, это намного быстрее, чем при использовании identify
, чтобы получить количество страниц (особенно с большим количеством страниц):
exec('/usr/bin/pdfinfo '.$tmpfname.' | awk \'/Pages/ {print $2}\'', $output);
Вам необходимо установить pdfinfo.
Ответ 3
Я знаю, что это довольно старый... но если это относится ко мне сейчас, это может быть актуально и для других.
Я только разработал этот метод получения номеров страниц, так как перечисленные здесь методы неэффективны и чрезвычайно медленны для больших PDF файлов.
$im = new Imagick();
$im->pingImage('name_of_pdf_file.pdf');
echo $im->getNumberImages();
Кажется, он отлично работает для меня!
Ответ 4
Вы можете попробовать fpdi (см. здесь), как вы можете видеть, когда вы устанавливаете исходный файл, вы возвращаете номера страниц.
Ответ 5
Я действительно пошел с комбинированным подходом. Поскольку на моем сервере отключен 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. Причина, по которой я делаю двукратный подход, состоит в том, что последняя довольно медленная.
Ответ 6
Попробуйте следующее:
<?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 показывает количество страниц в разных узлах. Родительский node имеет сумму других в своем теге Count, поэтому этот script просто ищет max (число страниц).
Ответ 7
function getNumPagesPdf($filepath) {
$fp = @fopen(preg_replace("/\[(.*?)\]/i", "", $filepath), "r");
$max = 0;
if (!$fp) {
return "Could not open file: $filepath";
} else {
while ([email protected]($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 файле я просто добавляю разрыв в то время, чтобы он не проходил в бесконечном цикле здесь.
Ответ 8
это не использует imagick:
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;
}
Ответ 9
$pdftext = file_get_contents($caminho1);
$num_pag = preg_match_all("/\/Page\W/", $pdftext,$dummy);
Ответ 10
В среде * nix вы можете использовать:
exec('pdftops ' . $filename . ' - | grep showpage | wc -l', $output);
Где pdftops должен быть установлен по умолчанию.
Или, как предположил Xethron:
pdfinfo filename.pdf | grep Pages: | awk '{print $2}'
Ответ 11
Использование только PHP может привести к установке сложных библиотек, перезапуску Apache и т.д., а многие чистые PHP-пути (например, открытие потоков и использование регулярных выражений) неточно.
Включенный ответ - единственный быстрый и надежный способ, о котором я могу думать. Он использует один исполняемый файл, хотя он не должен быть установлен (либо * nix, либо Windows), и простой PHP script извлекает результат. Лучше всего то, что я еще не видела неправильной страницы!
Здесь можно найти, в том числе, почему другие подходы "не работают" :