PHP Количество страниц в файле PDF через ImageMagick

Я использую следующий код, чтобы получить количество страниц в файле PDF.

$img = new imagick();
$img->setResolution(200,200);
$img->readImage("{$FileName}");
$NumberOfPages = $img->getNumberImages();
echo "$NumberOfPages";

Код работает, но очень медленно (0,5 секунды на страницу. 29-страничный PDF-файл выдает результат за 15 секунд).

Я что-то пропустил? Должен быть более быстрый способ:

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

2) Преобразование одной страницы в изображение

Обратите внимание, что 2) возможно только после выполнения 1). Нет смысла конвертировать, скажем, 39-ю страницу, когда в PDF всего 16 страниц.

Любая помощь приветствуется.

Дэйвид


person Cymro    schedule 28.12.2014    source источник


Ответы (2)


Я попробовал ваш код, но он не работал с имеющимися у меня PDF-файлами. Я использую Free PDF для создания PDF-файлов. Возможно, полученные PDF-файлы не линеаризованы.

Я нашел некоторый код под вопросом 1098156, и, похоже, он работает нормально с PDF-файлами, которые у меня есть:

function count_pages($pdfname) {
$pdftext = file_get_contents($pdfname);
$num = preg_match_all("/\/Page\W/", $pdftext, $dummy);
return $num;
}
person Cymro    schedule 31.12.2014
comment
Блестящее решение. Для 30-страничного PDF-файла это заняло около 5 секунд (с Imagick), но этот сделал это за 50 мс. - person Skywarth; 22.11.2020
comment
Это не работает для PDF-файлов с определенными типами сжатия. Используйте Imagick::getnumberimages(), если вам нужна более широкая поддержка. - person Gavin; 10.12.2020

Согласно «Обнаружение страниц в файлах PDF». Я рекомендую по возможности не использовать imagemagick для этой простой задачи по обнаружению страниц PDF-файла. PDF имеет функцию макета «Линеаризованный» -> http://labs.appligent.com/pdfblog/linearization/ для обнаружения некоторых основных метаданных PDF с начала файла. Вот действительно простой код для получения количества страниц, я протестировал его с 10 случайными файлами PDF из Интернета, работал каждый раз и должен быть намного быстрее, чем код с imagemagick.

Это всего лишь быстрый код, не очень хорошо протестированный, но он должен дать вам некоторые идеи для выполнения этой работы только на PHP. Возможно, не все ваши PDF-файлы гарантируют такой линеаризованный макет.

$pdfcontent = file_get_contents("test.pdf", NULL, NULL, 0, 300);
preg_match("~Linearized.*?\/N ([0-9]+)~s", $pdfcontent, $pages);
if(isset($pages[1])){
    echo "Pages ".$pages[1];
}
person Brain Foo Long    schedule 28.12.2014
comment
Это не работает для PDF-файлов с определенными типами сжатия. Imagick::getnumberimages() работает. - person Gavin; 10.12.2020