Подтвердить что ты не робот

Изменение размера PDF с помощью Ghostscript

Я пытаюсь масштабировать PDF, который, например, имеет малый размер A4 до A4.

Это прекрасно работает с портретными документами. Документ масштабируется правильно, а затем добавляется верхняя часть.

В альбомной документации дополнение не добавляется. Поэтому документ будет иметь правильную высоту для формата A4, но не достаточно широкий, так как на стороне документа (как я надеялся) не добавляется отступы.

Это то, что я использую для работы с документами формата A4:

gs \
 -sOutputFile=output.pdf \
 -sDEVICE=pdfwrite \
 -sPAPERSIZE=a4 \
 -dCompatibilityLevel=1.4 \
 -dNOPAUSE \
 -dBATCH \
 -dPDFFitPage \
  input.pdf
4b9b3361

Ответ 1

Вы должны добавить переключатель -dFIXEDMEDIA:

gs \
 -o output.pdf \
 -sDEVICE=pdfwrite \
 -sPAPERSIZE=a4 \
 -dFIXEDMEDIA \
 -dPDFFitPage \
 -dCompatibilityLevel=1.4 \
  input.pdf

-dFIXEDMEDIA всегда требуется, если требуется принудительно установить конкретный размер бумаги/страницы/носителя и игнорировать размер бумаги/страницы/носителя, указанный в документе. Поскольку PDF всегда имеет определенный формат бумаги/страницы/носителя (PostScript может иметь или может не иметь...).

(Мой -o ... короче и сохраняет его от добавления -dBATCH -dNOPAUSE - но работает только для более поздних версий Ghostscript.)

Ответ 2

Ваша команда не делает никакого масштабирования вообще, она просто берет PDF файл и преобразует его в файл PDF.

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

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

Ответ 3

Кажется, что размер вывода может быть (лучше всего) принудительным, указав размер в точках и не используя -dPDFFitPage. Я получал дробные размеры точек, что было плохо. Для печати A5 используется служба печати по требованию. "Реальный" A5 - 420x595 точек. Я обнаружил, что использование -sPAPERSIZE = a5 дало размеры страниц с дробной точкой, но это могло быть связано с тем, что оригинал был неудобным.

gs \
 -o output.pdf \
 -sDEVICE=pdfwrite \
 -dDEVICEWIDTHPOINTS=419 -dDEVICEHEIGHTPOINTS=595 \
 -dFIXEDMEDIA \
 -dCompatibilityLevel=1.4 \
  input.pdf

Чтобы проверить это, я обнаружил, что с помощью PDFshuffler я смог экспортировать отдельные страницы, а затем с pdfinfo мне удалось получить точный размер этих страниц. Это подтвердило, что использование параметров устройства явно помогло.

Ответ 4

Во-первых, спасибо всем, кто разместил здесь.

У меня есть этот маленький script, называемый pdfScale, который поглощает часть ответов, размещенных здесь. Поэтому я решил отправить мои 2 цента. Я использую немного ответа Курта и Тима. Более похоже на Тима. Я играл с этим в течение нескольких дней, и вот мое частное заключение о методах, размещенных здесь:

Задайте размер бумаги по имени с помощью -sPAPERSIZE

  • Легко просто передать название бумаги (например, a4)
  • Может не создавать 100% точных размеров точек.
  • May Flip Landscape < > Portrait

Установите размер бумаги в PS-пунктах -dDEVICEWIDTHPOINTS, -dDEVICEHEIGHTPOINTS

  • Уверен, что вы получите нужный размер в точках.
  • Вы можете перевернуть WIDTH < > HEIGHT самостоятельно
  • Вам нужно знать размеры в точках
  • Не так просто script вокруг него, так как вам понадобится новый размер страницы в точках, а также потребуется размер исходной страницы, если вы хотите обнаружить пейзаж/портрет.
  • Вы также можете установить персонализированные документы (любой размер, который вы действительно хотите).
  • Я использовал -dDEVICEWIDTH, -dDEVICEHEIGHT вместо более длинной версии с точками, но оба они, похоже, делают одно и то же (оба получают точки).

Поскольку мой bash script уже способен получать исходные страницы, и мне понравилась идея установить настраиваемые размеры страниц, я решил сосредоточиться на настройке размера страницы в точках. Я уже включил Размеры бумаги GS в моем script (с именами и размерами). Так что получить эту информацию было также легко.

Использование -dFIXEDMEDIA кажется обязательным в обоих случаях, как указывалось ранее.

Так вот как мой подход прошел (по сценарию)

  • Получить исходные размеры страниц PDF (для обнаружения флип)
  • Получить размер целевой страницы в точках (например, A4 > 595x842)
  • Проверьте, что они имеют одинаковую ориентацию или Flip Target при необходимости
  • Запуск GS с точками или перевернутыми точками

Когда я пытался исправить проблему автовращения, я нашел этот другой ответ Курта. Речь идет об использовании -dAutoRotatePages. Просто скопируйте часть своего ответа здесь:

  • -dAutoRotatePages=/None - сохраняет ориентацию каждой страницы;
  • -dAutoRotatePages=/All - вращает все страницы (или нет) в зависимости от своего "решения большинства";
  • -dAutoRotatePages=/PageByPage - автоматическое вращение страниц по отдельности.

Мой script по умолчанию - PageByPage, но это настраивается. Он хорошо работал в моих тестах. Использование -dAutoRotatePages также, по-видимому, уменьшает необходимость предварительного листания размера страницы, хотя это не одно и то же. Я сохранил оба варианта.

Мое маленькое приложение было первоначально создано для масштабирования PDF файлов (без изменения размера страницы). Затем я добавил функциональность, чтобы сделать одно, другое или и то, и другое. Я все еще не мог сделать все это в одном вызове GS.

Это то, что я призываю изменять, изменяя переменные на реальные значения. Это для формата A4 Portrait с PageByPage автоматическим вращением:

gs \
-q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dSAFER \
-dCompatibilityLevel="1.5" -dPDFSETTINGS="/printer" \
-dColorConversionStrategy=/LeaveColorUnchanged \
-dSubsetFonts=true -dEmbedAllFonts=true \
-dDEVICEWIDTHPOINTS=595 -dDEVICEHEIGHTPOINTS=842 \
-dAutoRotatePages='/PageByPage' \
-dFIXEDMEDIA -dPDFFitPage \
-sOutputFile='../myOutputFile.pdf' \
-f '../input.pdf'

Обратите внимание, что я также использую -dFIXEDMEDIA AND -dPDFFitPage. Поскольку это подходит для страницы, другая часть моего script может быть удобна для масштабирования содержимого внутри PDF после изменения размера (особенно если доля PDF сильно изменилась). И это одна из причин, по которым я всегда запускаю масштабирование после изменения размера в моем script (в смешанном режиме).

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

Итак, мой вывод состоит в том, что сложная часть заключается в том, чтобы найти решение, которое работает по всем направлениям в разных документах разных размеров и ориентации. Я все еще не уверен, что использую правильное решение. Но, позволяя пользователю сменить функцию обнаружения флип и автоматическое вращение GS, я надеюсь, что у вас будет решение, по крайней мере, в большинстве случаев.

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

https://github.com/tavinus/pdfScale

PS: pdfScale имеет свое происхождение fooobar.com/questions/174206/....

Ответ 5

Жаль, что функции pstops - очень полезный пакет для масштабирование и объединение страниц postscript, похоже, не доступно для pdf файлов. Существует программа под названием pdftopdf, но она (насколько я может видеть) делать то же самое, что и pstops.   Вы можете сделать файл ps (я печатаю файл в evince), использовать pstops и то ps2pdf, но это довольно неуклюже.