Как узнать количество страниц в pdf файле не открывая

Обновлено: 03.07.2024

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

Использование FPDI (библиотека PHP)

FPDI прост в использовании и установке (просто извлеките файлы и вызовите сценарий PHP), НО многие методы сжатия не поддерживаются FPDI. Затем он возвращает ошибку:

Ошибка FPDF: в этом документе (test_1.pdf), вероятно, используется метод сжатия, который не поддерживается бесплатным анализатором, поставляемым с FPDI.

Открытие потока и поиск с регулярным выражением:

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

  • /\/Count\s+(\d+)/ (ищет /Count <number> ) не работает, потому что только несколько документов содержат параметр /Count внутри, поэтому в большинстве случаев он ничего не возвращает. Источник.
  • /\/Page\W*(\d+)/ (ищет /Page<number> ) не получает количество страниц, в основном содержит некоторые другие данные. Источник.
  • /\/N\s+(\d+)/ (ищет /N <number> ) тоже не работает, поскольку документы могут содержать несколько значений /N ; большинство, если не все, не содержат количество страниц. Источник.

Итак, что же работает надежно и точно?

Простой исполняемый файл командной строки с именем: pdfinfo .

Его можно загрузить для Linux и Windows. Вы загружаете сжатый файл, содержащий несколько небольших программ, связанных с PDF. Извлеките его куда-нибудь.

Один из этих файлов - pdfinfo (или pdfinfo.exe для Windows). Пример данных, возвращаемых при их запуске в PDF-документе:

Я не видел PDF-документа, в котором он возвращал бы ложное количество страниц (пока). Это также очень быстро, даже с большими документами размером 200+ МБ время отклика составляет всего несколько секунд или меньше.

Здесь, в PHP, есть простой способ извлечь количество страниц из вывода:

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

Я знаю, что это не чистый PHP , но внешние программы способом лучше обрабатывают PDF (как видно из вопроса).

Я надеюсь, что это может помочь людям, потому что я потратил много времени, пытаясь найти решение этой проблемы, и я видел много вопросов о количестве страниц PDF, в которых я не нашел ответа, который искал. Поэтому я задал этот вопрос и сам на него ответил.

Пакет R pdftools и функция pdf_info() предоставляет информацию о количестве страниц в pdf.

Вот командный сценарий Windows с использованием gsscript, который сообщает номер страницы файла PDF.

Вот функция R , которая сообщает номер страницы файла PDF с помощью команды pdfinfo .

Я создал класс-оболочку для pdfinfo на случай, если он кому-то будет полезен, на основе ответа Ричарда @

Поскольку вы не против использовать утилиты командной строки, вы можете использовать cpdf (Microsoft Windows / Linux /Mac OS X). Чтобы узнать количество страниц в одном PDF:

Если у вас есть доступ к оболочке, самым простым (но не применимым в 100% PDF-файлов) подходом было бы использование grep .

Это должно вернуть только количество страниц:

  • -m 1 необходимо, так как некоторые файлы могут иметь более одного совпадения с шаблоном регулярного выражения (необходимо заменить его расширением решения регулярного выражения только для совпадения)
  • -a необходимо для обработки двоичного файла как текста
  • -o , чтобы показать только совпадение
  • -P для использования регулярного выражения Perl

Объяснение регулярного выражения:

  • начальный "разделитель": (?<=\/N ) ретроспективный просмотр /N (nb. пробел здесь не отображается)
  • фактический результат: \d+ любое количество цифр
  • окончание "разделителя": (?=\/) просмотр вперед /

Примечание: если в каком-то случае совпадение не найдено, можно с уверенностью предположить, что существует только 1 страница.

Кажется, это работает очень хорошо, без необходимости в специальных пакетах или выводе команды синтаксического анализа.

Вот простой пример, чтобы получить количество страниц в PDF с помощью PHP.

Если вы не можете установить какие-либо дополнительные пакеты, вы можете использовать этот простой однострочник:

Вы можете использовать qpdf , как показано ниже. Если файл имя_файла.pdf содержит 100 страниц,

Проще всего использовать ImageMagick .

Вот пример кода

В противном случае вы также можете использовать библиотеки PDF , такие как MPDF или TCPDF для PHP

Мне необходимо посчитать количество страниц в PDF-файлах (в данной дирректории и во всех вложениях) и количество этих PDF-файлов. Количество PDF-файлов - любое, количество вложенных папок - любое.

Рабочий код для подсчета количества PDF-файлов:

А вот с подсчетом количества страниц в PDF-файлах проблема. Почитал интернет - много всего говорится, но код так и не нашел. Может у кого-то есть готовый код для CMD/BAT?

Нашел код на др языках программирования, может кто-то сможет переписать эти варианты на CMD/BAT?

Вот что смог найти в интернете

Вариант 1: взял здесь:

%PDF-1.5
%вгПУ
109199 0 obj <</Linearized 1/L 9142108/O 109203/E 52524/N 1236/T 9126252/H [ 2754 12723]>>
endobj

Где $pdf_filename - путь к файлу

и здесь же указали измененный вариант кода:

__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь

Подсчет количества страниц в PDF файлах в каталоге: проблема с файлами с паролем
Привет)) Мне нужна программа, считающая кол-во страниц в PDF файлах в каталоге. Но у меня загвоздка.

Как получить количество страниц в документе PDF
kak iz biblioteka pdf reader (Axdpdf) shitat countpage in.vbnet

Как посчитать и записать количество строк в разных файлах
Доброго времени суток. Подскажите пожалуйста. Есть задача: список файлов (причем не эксель, а.

Как посчитать количество страниц?
Здравствуйте. Есть гостевая. Как сделать так что бы на каждой странице было по 5 записей и.

берете отсель бесплатный pdftk.exe для windows и с помощью этого, находите что надо
по одному файлу (жестко указанному файлу) считает классно, а как сделать, чтобы он посчитал страницы во всех PDF-файлах в данной папке и во вложенных? Количество PDF-файлов рандомное.

Решение

чтобы он посчитал страницы во всех PDF-файлах в данной папке alpap, огромное спасибо, все круто работает, считает во всех вложениях. se_arts,
ограничил вывод, не знаю стало ли шустрее, например у меня по всему диску С:

Старт поиск: 8:53:41,87
Стoп поиск: 8:54:12,23
Старт запись: 8:54:12,23
Всего страниц во всех файлах PDF диска C: - 608
Стоп запись: 8:54:12,23

Измененный код (в принципе изменения только в строке 4, добавлено find "NumberOfPages")

Добавлено через 4 минуты
быстрее, конечно, работать в папке, без ключа /s в dir /a-d/b/s, а еще быстрее использовать для поиска и перебора файлов pdf не cmd, например PowerShell или js, да все кроме cmd.

По времени подсчета: очень долго открывает файлы большого объема - 90-200МБ, даже файлов 5-6 может считать около минуты. Продолжаю тестить.

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

Подскажите чайнику, как получить результат работы этой функции?

Что необходимо проделать, чтобы получился результат?

Делал макрос в Excel, но сдается мне что код изложенный выше не относится к макросам. Подскажите пожалуйста!

1. в одну ячейку пишите полное имя ПДФ-файла (диск:\все_папки\сколько_потребуетс я\имя_файла)
2. в другую =PDFCount(и ссылку на ячейку п.1
3. понятно, что к этому моменту текст макроса должен уже быть в программном модуле файла, в котором Вы это все проделаете. 41001804815208 - ЮMoney бывш.Яндекс-кошелек благодарности за удачные советы и решения можно отправлять прямо сюда)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете 1. в одну ячейку пишите полное имя ПДФ-файла (диск:\все_папки\сколько_потребуетс я\имя_файла)
2. в другую =PDFCount(и ссылку на ячейку п.1
3. понятно, что к этому моменту текст макроса должен уже быть в программном модуле файла, в котором Вы это все проделаете.

Спасибо за ответ!

Ссылка на файл выглядит как гиперссылка, но при открытии выдает ошибку "Не удается открыть указанный файл"

Где я мог сделать что-то не так?

Последний раз редактировалось vsevtu; 27.07.2016 в 16:43 . у меня тоже не работает не знает что такое
words (str, Разделитель) Then 41001804815208 - ЮMoney бывш.Яндекс-кошелек благодарности за удачные советы и решения можно отправлять прямо сюда)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете у меня тоже не работает не знает что такое
words (str, Разделитель) Then

Написал макрос записи имени файла и полного пути до него в столбец А1, в B1 использую функцию предложенную Вами, с аргументом "А1":"А*", остается только сопоставить полученные данные с имеющимися в реестре за прошлые периоды и никаких нудных открываний тысячи с лишним файлов чтобы узнать кол-во страниц в них =)

Еще раз, спасибо!

Последний раз редактировалось vsevtu; 28.07.2016 в 10:13 .

Привет всем, зарегистрировался специально, чтобы отписаться.

За две недели я достаточно развился в исследовании структуры PDF-файла для написания PDF-сплиттера на VBA, чтобы сказать, что первый попавшийся "/Count N" не гарантирует, что N - это общее количество страниц в документе.

Слово "Count" относится к свойствам объекта "набор страниц" (/Type/Pages). А их в PDF может быть от одного до нескольких из-за древовидной структуры страниц внутри исходного кода файла PDF. Так что правильнее будет исходить от корневого объекта - /Type/Catalog, узнать ID подчиненного к нему набора страниц /Type/Pages, найти этот набор по ID, считать значение его параметра Count. Но здесь я сделаю проще - отпарсю регулярками значения всех Count-ов и узнаю наибольшее значение.

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

используя Imagick (расширение PHP)

Imagick требует много установки, apache нужно перезапустить, и когда я, наконец, работал, это заняло удивительно много времени для обработки (2-3 минут на документ) и он всегда возвращался 1 страница в каждом документе (до сих пор не видел рабочей копии Imagick), поэтому я ее выбросил. Это было с обоими getNumberImages() и identifyImage() методы.

используя FPDI (библиотека PHP)

FPDI прост в использовании и установке (просто извлеките файлы и вызовите PHP-скрипт),но многие методы сжатия не поддерживаются FPDI. Затем он возвращает ошибку:

ошибка FPDF: этот документ (test_1.pdf) вероятно, использует метод сжатия, который не поддерживается бесплатным парсером, поставляемым с FPDI.

Открытие потока и поиск с регулярным выражением:

это открывает PDF-файл в потоке и ищет какую-то строку, содержащую pagecount или что-то подобное.

  • //Counts+(d+)/ (ищет /Count <number> ) не работает, потому что есть только несколько документов параметр /Count внутри, поэтому большую часть времени он не возвращает ничего. Источник.
  • //PageW*(d+)/ (ищет /Page<number> ) не получает количество страниц, в основном содержит некоторые другие данные. Источник.
  • //Ns+(d+)/ (ищет /N <number> ) не работает, так как документы могут содержать несколько значений /N ; большинство, если не все, не содержащий pagecount. Источник.

Итак, что же работает надежно и точно?

смотрите ответ ниже

простой исполняемый файл командной строки: pdfinfo.

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

один из этих файлов -pdfinfo (или pdfinfo.exe для Windows). Пример данных, возвращаемых при запуске в PDF-документе:

Я не видел PDF-документ, где он возвращено ложное число страниц (пока). Это также очень быстро, даже с большими документами 200 + MB время отклика составляет всего несколько секунд или меньше.

существует простой способ извлечения pagecount из вывода, здесь в PHP:

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

Я знаю, что это не чистый PHP, но внешние программы путь лучше в обработке PDF (как видно из вопроса).

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

проще всего использовать ImageMagick

вот пример кода

в противном случае вы можете также использовать PDF библиотеки MPDF или TCPDF на PHP

  • -m 1 необходимо, так как некоторые файлы могут иметь более одного совпадения шаблона регулярных выражений (volonteer необходимо заменить это на матч-только-первое регулярное выражение расширение решения)
  • -a необходимо рассматривать двоичный файл как текст
  • -o показать только матч
  • -P использовать регулярное выражение Perl
  • запуск "разделитель": (?<=\/N ) lookbehind of /N (nb. пробел не видел здесь)
  • фактический результат: \d+ любое число цифр
  • заканчивая "разделитель": (?=\/) перспективной /

Если вы не можете установить какие-либо дополнительные пакеты, вы можете использовать этот простой фразой:

здесь R функция, которая сообщает номер страницы PDF-файла с помощью .

вот командный скрипт Windows с использованием gsscript, который сообщает номер страницы PDF-файла

пакет R pdftools и предоставляет информацию о количестве страниц в формате PDF.

это, кажется, работает довольно хорошо, без необходимости специальных пакетов или вывода команды разбора.

Читайте также: