Получить количество страниц в pdf с помощью командного файла cmd

Я вижу, что есть много вопросов для получения количества страниц в pdf с помощью C, PHP и других, но мне интересно, есть ли простой способ получить количество страниц с помощью командного файла или cmd?


person Peter Craig    schedule 04.11.2009    source источник
comment
определить пакетный файл. вы можете написать PHP-скрипт и поместить выполнение скрипта в текстовый файл, сохранить его как .bat, который также называется пакетным файлом. Вам нужно указать, разрешены ли внешние инструменты или просто чистый cmd.exe.   -  person ghostdog74    schedule 04.11.2009


Ответы (7)


Используя pdftk:

pdftk my.pdf dump_data | grep NumberOfPages

делает свое дело.

person Tuure Laurinolli    schedule 04.11.2009
comment
Замените grep на findstr, и вы даже будете работать в Windows, не устанавливая больше, чем pdftk. - person Joey; 04.11.2009
comment
Объедините ответы выше pdftk my.pdf dump_data | grep NumberOfPages | sed 's/[^0-9]*//', и вы просто получите число. - person David Folkner; 04.04.2014
comment
Другой способ просто получить число — использовать awk для печати второго столбца. pdftk my.pdf dump_data | grep NumberOfPages | awk '{print $2}' - person Mehmet; 22.01.2015
comment
PDFtk требует среды выполнения Java, что является довольно большой зависимостью. Приятно знать об этом. - person Palec; 18.11.2015
comment
С AWK использование grep не требуется, @Mehmet. pdftk my.pdf dump_data | awk '/NumberOfPages/{print $2}' Точно так же достаточно одного sed. pdftk my.pdf dump_data | sed '/NumberOfPages/!d;s/[^0-9]*//' - person Palec; 04.07.2017
comment
Если вы хотите суммировать количество страниц всех pdf-файлов в каталоге, просто напишите: for f in *pdf; сделать pdftk $f dump_data ; сделано| awk '/Количество страниц/ {сумма+=$2; print $2} END {print Summa: sum}' - person Arpad Horvath; 12.02.2018
comment
@ArpadHorvath Вероятно, более мощным было бы найти: find . -maxdepth 1 -name "*.pdf" -exec sh -c "pdftk '{}' data_dump" \; | awk '/NumberOfPages/{print $2}' - person Pablo Bianchi; 19.02.2021

В качестве альтернативы вы можете использовать команду, которая возвращает только число:

pdfinfo "${PDFFILE}" | grep Pages | sed 's/[^0-9]*//'

Вам понадобится пакет xpdf (обычно предустановлен во многих дистрибутивах):

http://www.foolabs.com/xpdf/download.html

person dimib    schedule 16.05.2012
comment
На самом деле в Debian это пакет poppler-utils. Xpdf просто использует библиотеку Poppler и рекомендует poppler-utils. - person Palec; 18.11.2015
comment
Чтобы суммировать количество страниц во всех PDF-файлах каталога: ( for pdf in *.pdf ; do pdfinfo "$pdf" ; done ) | grep Pages | sed 's/[^0-9]*//' | paste -sd+ | bc - person Thomas W; 19.12.2015
comment
Совершенно удивительно на 180-страничном PDF. Ваше решение быстрее, чем qpdf выше. matt@mtbook:~/projects/booky% time ./booky-pdfinfo.sh real 0m0.129s user 0m0.099s sys 0m0.022s matt@mtbook:~/projects/booky% time ./booky-qpdf.sh реальный 0m0.039s пользователь 0m0.019s sys 0m0.020s - person cavalcade; 29.09.2016
comment
Это лучший ответ. poppler-utils больше подходит даже для серверной среды и является поддерживаемым пакетом Ubuntu. - person oᴉɹǝɥɔ; 01.03.2017
comment
Время, которое вы опубликовали, привело меня к выводу, прямо противоположному тому, который вы сделали, @cavalcade. QPDF выиграл, будучи в 3 раза быстрее в реальном времени, в 5 раз по времени процессора в пользовательском пространстве. - person Palec; 04.07.2017
comment
Правда @Палек. Может быть, я по ошибке перепутал числа или запутался, но, как написано, это действительно поддерживает противоположный вывод, как вы сказали. Странный - person cavalcade; 10.07.2017

QPDF — это облегченная альтернатива PDFtk (требующая Java runtime) и pdfinfo (довольно тупой инструмент).

qpdf --show-npages file.pdf

Он печатает только количество страниц, не требуя постобработки.

Для большинства дистрибутивов Linux существуют пакеты, обычно называемые просто qpdf. Такие страницы, как Softpedia, содержат бинарные файлы для Windows. исходный код можно загрузить с SourceForge или с официальный репозиторий GitHub.


Параметр --show-npages был добавлен в версии после 4.1.0, в commit 91367239fd55f7c4996ed6158405eacbверсией 4.1.0 и более ранними, вы можете выводить основную информацию о каждой странице и подсчитывать количество страниц. В Linux и OS X:

qpdf --show-pages file.pdf | grep -c ^page

В Windows вместо этого следует использовать findstr и find:

qpdf --show-pages file.pdf | findstr ^page | find /c /v ""
person Palec    schedule 17.11.2015
comment
Кажется, он установлен по умолчанию в моей установке Ubuntu 16.10! :D - person starbeamrainbowlabs; 23.04.2017
comment
Если вы хотите суммировать количество страниц всех pdf-файлов в каталоге, просто напишите: for f in *pdf; сделать printf $f ; qpdf --show-npages $f ; сделано| awk '{сумма+=$2; print $0} END {print Summa sum}' - person Arpad Horvath; 12.02.2018
comment
Также кажется, что он установлен по умолчанию на Manjaro и, вопреки текущим ответам с более высоким рейтингом, выполняет эту работу без необходимости передачи в другие команды. - person Dalker; 08.08.2019

Без каких-либо внешних инструментов (сохраните приведенный ниже скрипт как .bat):

@if (@X)==(@Y) @end /* JScript comment
@echo off

cscript //E:JScript //nologo "%~f0"  %*

exit /b 0
@if (@X)==(@Y) @end JScript comment */

   var args=WScript.Arguments;
   var filename=args.Item(0);
   var fSize=0;
   var inTag=false;
   var tempString="";
   var pages="";

   function getChars(fPath) {

        var ado = WScript.CreateObject("ADODB.Stream");
        ado.Type = 2;  // adTypeText = 2
        ado.CharSet = "iso-8859-1";
        ado.Open();
        ado.LoadFromFile(fPath);                     
        var fs = new ActiveXObject("Scripting.FileSystemObject");
        fSize = (fs.getFile(fPath)).size;

        var fBytes = ado.ReadText(fSize);
        var fChars=fBytes.split('');
        ado.Close();
        return fChars;
   }


   function checkTag(tempString) {

    if (tempString.length == 0 ) {
        return;
    }

    if (tempString.toLowerCase().indexOf("/count") == -1) {
        return;
    }

    if (tempString.toLowerCase().indexOf("/type") == -1) {
        return;
    }

    if (tempString.toLowerCase().indexOf("/pages") == -1) {
        return;
    }

    if (tempString.toLowerCase().indexOf("/parent") > -1) {
        return;
    }


    var elements=tempString.split("/");
    for (i = 0;i < elements.length;i++) {

        if (elements[i].toLowerCase().indexOf("count") > -1) {
            pages=elements[i].split(" ")[1];

        }
    }
   }

   function getPages(fPath) {
        var fChars = getChars(fPath);

        for (i=0;i<fSize-1;i++) {

            if ( fChars[i] == "<" && fChars[i+1] == "<" ) {
                inTag = true;
                continue;
            }

            if (inTag && fChars[i] == "<") {
                continue;
            }

            if ( inTag && 
                 fChars[i] == ">" &&
                 fChars[i+1] == ">" ) {

                inTag = false;
                checkTag(tempString);
                if (pages != "" ) {
                    return;
                }

                tempString="";

            }

            if (inTag) {
                if (fChars[i] != '\n' && fChars[i] != '\r') {
                   tempString += fChars[i];
                }
            }

        }

   }

   getPages(filename);
   if (pages == "") {
     WScript.Echo("1");
   } else {
    WScript.Echo(pages);
   }

Он берет путь к файлу .pdf и просто печатает количество страниц. Не очень быстро, поскольку он считывает символ PDF по символу, но его можно оптимизировать.

person npocmaka    schedule 03.09.2014
comment
Как это возвращает количество страниц в файле PDF? - person David van Driessche; 18.11.2015
comment
@DavidvanDriessche - вот пример pdfpages.bat pdffile.pdf? Есть проблема? - person npocmaka; 18.11.2015
comment
Да :) Но мой настоящий вопрос заключался в том, что в этом коде определяет количество страниц? Я пытаюсь понять, при чем тут подсчет? - person David van Driessche; 19.11.2015
comment
@DavidvanDriessche Все это становится более очевидным, если вы посмотрите на необработанные прощания с .pdf в шестнадцатеричном редакторе (хороший мастер-класс). В основном ищем что-то вроде строки: <</Type/Pages/Count 21 getPages() сканирует байты PDF на наличие тегов ‹‹ и передает прочитанное содержимое в checkTag(). Затем checkTag() разбивает содержимое на элементы, используя / в качестве разделителя, и сканирует элемент для подсчета строк, обнаружив, что затем разбивает элемент по пробелу и возвращает индекс [1], т. е. второе значение в массиве в приведенном выше примере. 21 - person Phlebass; 07.04.2017
comment
На самом деле, в прошлом я писал средство визуализации PDF, поэтому точно знаю, как выглядит файл PDF. Я также знаю, что этот код никогда не будет работать в реальной жизни, так как файлы PDF могут содержать много экземпляров строки ‹‹/Type/Pages/Count..., которые либо просто не используются, либо не отражают реальное количество страниц в файле. PDF-документ. Этот метод в лучшем случае ненадежен и не должен использоваться. - person David van Driessche; 07.04.2017

Поскольку вы просили «пакетный файл», я должен предположить, что вам нужно только решение на базе Windows. Но на всякий случай, если Mac OS X является вариантом, вот кое-что, что может быть полезно. Если у вас есть PDF-файлы на Mac, на диске, проиндексированном Spotlight (по умолчанию), следующая команда вернет количество страниц без внешних зависимостей:

mdls -name kMDItemNumberOfPages POSIX_PATH_OF_PDF_FILE

Источник: MacScripter.net — http://macscripter.net/viewtopic.php?id=32381

person Daniel A. Shockley    schedule 23.05.2016
comment
могу подтвердить, все еще работает для macOS High Sierra 10.13.2 - person 23tux; 14.01.2018

Это может быть полезно для новых пользователей. В новой версии инструмента PDFtk (выше 2.0) используйте команду ниже, чтобы получить количество страниц файла PDF:

pdftk file.pdf dump_data_annots output outputfile.txt

В месте назначения будет создан новый файл с содержимым, подобным приведенному ниже:

NumberOfPages: 6

Теперь прочитайте файл и манипулируйте содержимым по своему усмотрению.

person Pankaj Verma    schedule 28.12.2018

Я знаю, что это старый пост, но все еще очень актуальный, поэтому я считаю, что должен быть ответ, который может рассказать, как получить количество страниц с помощью утилиты «poppler-0.68.0» в Windows.

Перейдите в папку bin и запустите pdfinfo.exe, например - C:\Temp\temp_folder\poppler-0.68.0\bin>pdfinfo.exe "C:\Temp\temp_folder\TT.pdf"

Код в действии

person Bhaskar Singh    schedule 27.04.2020