Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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 извлекает результат. Лучше всего то, что я еще не видела неправильной страницы!

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

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