Ghostscript: Всего страниц PDF

Я использую API библиотеки Ghostscript (обертка из C#) для печати PDF-документов из своего приложения.
С параметрами '-dFirstPage' и '-dLastPage' я Я могу выбрать диапазон страниц для печати, но как насчет общего количества страниц PDF?

Не очень приятно позволять пользователю выбирать интервал страниц от 2 до 10, когда, скажем, в документе PDF всего 4 страницы.

Учтите, что я использую библиотеку Ghostscript через вызов библиотеки API gsapi_init_with_args.


person lorenzoff    schedule 28.01.2011    source источник
comment
PDF-файлы ДОЛЖНЫ указывать количество страниц в своем каталоге метаданных. Вы также можете запустить s.th. Например, gs -q -c (in.pdf) (r) file runpdfbegin pdfpagecount = quit, чтобы заставить Ghostscript считать страницы.   -  person Kurt Pfeifle    schedule 28.01.2011
comment
@pipitas Привет и спасибо за вашу помощь; если я понимаю, я должен использовать (в.pdf) (r) файл runpdfbegin pdfpagecount = quit в качестве входного параметра вызова GS? Если да, то «in.pdf» будет входным файлом, но как насчет «(r)»? Еще раз спасибо.   -  person lorenzoff    schedule 28.01.2011
comment
Просто используйте '(r)' как есть. Это внутренний макрос Ghostscript, указывающий Ghostscript прочитать/запустить файл '(in.pdf)'... Да, единственная переменная - in.pdf -- замените ее на [путь+]имя файла вашего PDF.   -  person Kurt Pfeifle    schedule 28.01.2011


Ответы (2)


Ghostscript может подсчитывать и отображать количество страниц PDF на stdout. Командная строка

gswin32c ^
  -q ^
  -dNODISPLAY ^
  -c "(input.pdf) (r) file runpdfbegin pdfpagecount = quit" 

Здесь весь материал -c "..." представляет собой фрагмент командной строки PostScript (с использованием нескольких внутренних расширений команд GS). А input.pdf — это имя файла PDF (также может быть полный путь, например (c:/path/to/my.pdf)).

Однако для этого задания лучше и быстрее использовать pdfinfo (часть утилиты XPDF, также доступная в Windows).


Обновление:

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

gswin32c ^
  -q ^
  -c "(input.pdf) (r) file runpdfbegin pdfpagecount =" ^
  -f input.pdf

Ну, это не одна операция — это просто две разные операции в одной командной строке.

person Kurt Pfeifle    schedule 28.01.2011
comment
Можно ли изменить это, чтобы читать метаданные, а также отображать изображение PDF за одну операцию? (скажем с -sDEVICE=display и указанными друзьями) И еще, при чтении файла с stdin? (то есть: имя файла gswin32 из -) Запуск только: -c "pdfpagecount", похоже, дал мне ошибку «Операция не существует». Включая runpdfbegin игру с недопустимым именем файла. - person ; 26.03.2014
comment
@ebyrob: вам нужен каждый символ в моем примере команды (вы можете изменить «input.pdf» только на другое существующее имя файла или путь. Вы не можете просто пропустить какую-либо часть, если хотите ... - person Kurt Pfeifle; 27.03.2014
comment
Я думал что-то вроде: gswin64c - -c "currentfile runpdfbegin pdfpagecount ==" < input.pdf поможет. Но runpdfbegin использует setfileposition, который, по-видимому, не поддерживается stdin или currentfile. Работа полностью в памяти с интерфейсом DLL делает чтение из файловой системы немного проблематичным. мое недопустимое имя файла произошло от (%stdin) runpdfbegin и вариантов с командой file. По сути, я не мог успешно указать stdin в file или runpddfbegin. - person ; 27.03.2014
comment
Похоже, что % удалялся из командной строки, %% работает в пакетном сценарии NT. Итак, я вернулся к setfileposition нарушению runpdfbegin чего-либо вроде стандартного ввода или операций в памяти. - person ; 31.03.2014
comment
@KurtPfeifle Думаю, я нашел здесь кое-что, что могло бы сработать: bugs.ghostscript.com/show_bug. cgi?id=691739 Конечно, мне все равно придется пропустить input.pdf части... Я забыл упомянуть в своем первом комментарии, что хотел прочитать stdin? - person ; 01.04.2014
comment
Есть ли способ зафиксировать вывод этой команды (имеется в виду количество страниц)? Я пытаюсь запустить это из python с помощью пакета ghostscript, но он просто запускается и успешно завершается, я хотел бы записать его в переменную или файл. - person Ran Lottem; 17.01.2018
comment
Если вы получаете сообщение об ошибке /invalidfileaccess, см. ответ Гера Хоббельта здесь: stackoverflow.com/a/61310729/8542816 - person Sam Tigle; 05.11.2020

Я попытался сделать этот скрипт:

gswin32c ^
  -q ^
  -c "(input.pdf) (r) file runpdfbegin pdfpagecount =" ^
  -f input.pdf

работать в завернутом c# решении и постоянно получать ошибку "/undefinedfilename". В этом случае убедитесь, что ваш путь к файлу имеет косую черту «/» в качестве DirectorySeperator, а не обратную косую черту «\». Я знаю, что Курт Пфайфл уже написал это, но так случилось, что я просто проглядел это.

person Sam Tigle    schedule 15.01.2018
comment
Если вы хотите использовать обратную косую черту, вы должны использовать два из них каждый раз... - person Kurt Pfeifle; 17.01.2018