Обрезка PDF с помощью Ghostscript 9.01

Я не программист, но хотел бы научиться обрезать PDF с помощью Ghostscript.

Я установил Ghostscript 9.01 на свой компьютер.

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

Я даже новичок в Ghostscript.


person AMER    schedule 31.05.2011    source источник


Ответы (1)


Во-первых, обратите внимание, что единица измерения для PDF такая же, как и для PostScript: она называется точка [pt].

72 points == 1 inch == 25.4 millimeters

Предположим, у вас размер страницы А4. Тогда размеры носителя:

595 points width  == 210 millimeters
842 points height == 297 millimeters

Предполагая, что вы хотите обрезать:

   left edge: 24 points == 1/3 inch ~=  8.5 millimeters
  right edge: 36 points == 1/2 inch ~= 12.7 millimeters
    top edge: 48 points == 2/3 inch ~= 17.0 millimeters
 bottom edge: 72 points ==   1 inch ~= 25.4 millimeters

Тогда ваша командная строка Ghostscript выглядит так (в Windows):

gswin32c.exe                     ^
  -o cropped.pdf                 ^
  -sDEVICE=pdfwrite              ^
  -c "[/CropBox [24 72 559 794]" ^
  -c " /PAGES pdfmark"           ^
  -f uncropped-input.pdf

Или в Linux:

gs                               \
  -o cropped.pdf                 \
  -sDEVICE=pdfwrite              \
  -c "[/CropBox [24 72 559 794]" \
  -c " /PAGES pdfmark"           \
  -f uncropped-input.pdf

Однако это может работать не для всех типов PDF-файлов [1]. В этих случаях вы должны альтернативно попробовать эти команды:

gswin32c.exe                 ^
  -o cropped.pdf             ^
  -sDEVICE=pdfwrite          ^
  -dDEVICEWIDTHPOINTS=595    ^
  -dDEVICEHEIGHTPOINTS=842   ^
  -dFIXEDMEDIA               ^
  -c "24 72 translate"       ^
  -c " 0 0 535 722 rectclip" ^
  -f uncropped-input.pdf

or

gs                           \
  -o cropped.pdf             \
  -sDEVICE=pdfwrite          \
  -dDEVICEWIDTHPOINTS=595    \
  -dDEVICEHEIGHTPOINTS=842   \
  -dFIXEDMEDIA               \
  -c "24 72 translate"       \
  -c " 0 0 535 722 rectclip" \
  -f uncropped-input.pdf

[^] : Чтобы быть более конкретным: это не будет работать для PDF-файлов, которые поставляются вместе со своими собственными /CropBox, уже определенными для конкретных значений. Грязный хак вокруг этого состоит в том, чтобы изменить строку /CropBox для всех страниц, где желательно, на /cROPBoX (или аналогичное изменение регистра) с помощью текстового редактора до запуска вышеуказанной команды GS. Изменение регистра эффективно «обезвреживает» параметр обрезки (без изменения каких-либо смещений объектов PDF, делающих недействительной существующую таблицу xref), поэтому средства визуализации PDF больше не учитывают его.

person Kurt Pfeifle    schedule 31.05.2011
comment
Большое спасибо за ваш быстрый ответ. Это удовлетворяет мои требования. - person AMER; 31.05.2011
comment
Если вы не знаете, каковы размеры исходного PDF-файла, вы можете попробовать gs -sDEVICE=bbox -f uncropped-input.pdf - person simonb; 26.01.2012
comment
@jolly swagman: Нет, извините, нет-нет-нет! Устройство bbox НЕ указывает «размеры» исходного PDF-файла. Это указывает на то (виртуальное) поле на каждой странице, которое будет содержать все отметки на распечатанной или просматриваемой странице. Одна команда, которая будет работать для получения размеров («MediaBox») для каждой страницы: pdfinfo -box some.pdf. - person Kurt Pfeifle; 26.01.2012
comment
@pipitas верно, это только дает вам представление о размере страницы, но в будущем я буду использовать pdfinfo, так как это кажется гораздо более полезным. - person simonb; 27.01.2012
comment
Кроме того, Google может помочь вам с конверсией google.co.uk/search. ?q=10cm+in+points - person Andy; 20.12.2012
comment
Однако это может работать не для всех типов PDF-файлов. В этих случаях вы должны альтернативно попробовать […] Что ж, я пробовал оба с Ghostscript 9.10, и ни один из них не работал у меня. С другой стороны, podofobox работает и намного быстрее. См. также Как обрезать поля PDF с помощью pdftk и /MediaBox - person Ali; 28.08.2014
comment
@Ali: я тоже знаю podofobox и знаю, что это работает. Также я знаком с некоторыми другими инструментами командной строки. Но ОП прямо спросил о Ghostscript и заявил, что ему нравится учиться с помощью Ghostscript. И вот о чем был ответ... ;-) - person Kurt Pfeifle; 29.08.2014
comment
@KurtPfeifle Мой предыдущий комментарий предназначен для тех будущих посетителей, которые попробуют что-то из вашего ответа и потерпят неудачу. Извините, я, вероятно, должен был указать это в своем комментарии. Я не отрицал ваш ответ, скорее всего, это ответ на вопрос. Однако моей целью было во что бы то ни стало обрезать имеющийся под рукой чертов PDF. :) - person Ali; 29.08.2014
comment
Вдохновленный этим ответом, я ответил на соответствующий вопрос на askubuntu. В моем ответе представлен небольшой скрипт bash для упрощения процесса, и я объясняю метод определения координат. Может быть, вы хотите добавить ссылку в свой ответ? - person bluenote10; 09.03.2015
comment
@KurtPfeifle В строке -c "24 72 translate \ отсутствует закрывающий ", а также в версии для Windows. Я не могу отредактировать сообщение, так как diff меньше 6 символов x) - person hdl; 29.05.2015
comment
@hdl: я думаю, что вы еще могли бы отредактировать сообщение (даже без добавления дополнительных пробелов): если вы напишете более длинный комментарий, почему+что вы отредактировали, это должно сработать. - person Kurt Pfeifle; 29.05.2015
comment
Одинаковы ли левый/правый/верхний/нижний, когда ориентация PDF альбомная? Мне не удается заставить работать любую из ваших команд для формата PDF в формате a3/landscape, который я хотел бы обрезать до формата a4/portrait (удалив 595pt слева) - person hdl; 29.05.2015
comment
@hdl: Да, они одинаковы. Однако будьте осторожны, если где-то задействована команда 90 rotate.... Проверьте с помощью pdfinfo -box -l 100 the.pdf, какие настройки /Media/Crop/Art/Trim&/BleedBox предназначены для первых 100 страниц, а также их статус чередования (обозначается rot: .... - person Kurt Pfeifle; 29.05.2015
comment
Ну, я, должно быть, что-то опечатался, потому что ваша первая команда сработала во второй раз, спасибо! FWIW, значение rot равно 0. - person hdl; 29.05.2015