Изменение размера PDF с помощью Ghostscript
Я пытаюсь масштабировать PDF, который, например, имеет малый размер A4 до A4.
Это прекрасно работает с портретными документами. Документ масштабируется правильно, а затем добавляется верхняя часть.
В альбомной документации дополнение не добавляется. Поэтому документ будет иметь правильную высоту для формата A4, но не достаточно широкий, так как на стороне документа (как я надеялся) не добавляется отступы.
Это то, что я использую для работы с документами формата A4:
gs \
-sOutputFile=output.pdf \
-sDEVICE=pdfwrite \
-sPAPERSIZE=a4 \
-dCompatibilityLevel=1.4 \
-dNOPAUSE \
-dBATCH \
-dPDFFitPage \
input.pdf
Ответы
Ответ 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, но это довольно неуклюже.