Этот вопрос для ссылки и сравнения. Решение - принятый ответ ниже.
Много часов я искал быстрый и простой, но в основном точный способ получения количества страниц в документе PDF. Поскольку я работаю в компании по печати и печати графики, которая много работает с PDF файлами, количество страниц в документе должно быть точно известно до их обработки. Документы PDF поступают от разных клиентов, поэтому они не создаются в одном приложении и/или не используют один и тот же метод сжатия.
Вот некоторые из ответов, которые я нашел недостаточными или просто НЕ работающими:
Использование Imagick (расширение PHP)
Imagick требует большой установки, apache нужно перезапустить, и когда у меня наконец-то все заработало, обработка заняла удивительно много времени (2-3 минуты на каждый документ), и он всегда возвращал 1
страницу в каждом документе (не видел работающего копия Imagick до сих пор), поэтому я выбросил ее. Это было как с getNumberImages()
и identifyImage()
методов.
Использование FPDI (библиотека PHP)
FPDI прост в использовании и установке (просто извлекает файлы и вызывает скрипт PHP), НО многие методы сжатия не поддерживаются FPDI. Затем он возвращает ошибку:
Ошибка FPDF: этот документ (test_1.pdf), вероятно, использует метод сжатия, который не поддерживается бесплатным анализатором, поставляемым с FPDI.
Открытие потока и поиск с помощью регулярного выражения:
Это открывает файл PDF в потоке и ищет какую-то строку, содержащую количество страниц или что-то подобное.
$f = "test1.pdf";
$stream = fopen($f, "r");
$content = fread ($stream, filesize($f));
if(!$stream || !$content)
return 0;
$count = 0;
// Regular Expressions found by Googling (all linked to SO answers):
$regex = "/\/Count\s+(\d+)/";
$regex2 = "/\/Page\W*(\d+)/";
$regex3 = "/\/N\s+(\d+)/";
if(preg_match_all($regex, $content, $matches))
$count = max($matches);
return $count;
-
/\/Count\s+(\d+)/
(ищет/Count <number>
) не работает, потому что только несколько документов имеют параметр/Count
внутри, поэтому большую часть времени он не возвращает что-нибудь. Источник. -
/\/Page\W*(\d+)/
(ищет/Page<number>
) не получает количество страниц, в основном содержит некоторые другие данные. Источник. -
/\/N\s+(\d+)/
(ищет/N <number>
) также не работает, так как документы могут содержать несколько значений/N
; большинство, если не все, не содержащие количество страниц. Источник.
Итак, что же работает надежно и точно?