Хорошо, теперь, когда Реверс переформулировал свою проблему в том, что он ищет «универсальный код», позвольте мне попробовать еще раз.
Проблема с «универсальным кодом» заключается в том, что существует много «законных» формальных представлений операторов «CropBox», которые могут появиться в PDF. Все перечисленное ниже возможно и правильно и задает одинаковые значения для CropBox страницы:
/CropBox[10 20 500 700]
/CropBox[ 10 20 500 700 ]
/CropBox[10 20 500 700 ]
/CropBox [10 20 500 700]
/CropBox [ 10 20 500 700 ]
/CropBox [ 10.00 20.0000 500.0 700 ]
/CropBox [
10
20
500
700
]
То же самое верно для ArtBox
, TrimBox
, BleedBox
, CropBox
и MediaBox
. Для этого вам необходимо «нормализовать» представление * Box внутри исходного кода PDF, если вы хотите его отредактировать.
Первый шаг: «нормализация» исходного кода PDF
Вот как вы это делаете:
- Загрузка
qpdf
для вашей платформы ОС.
- Запустите эту команду для вашего ввода PDF:
qpdf --qdf input.pdf output.pdf
output.pdf
теперь будет иметь вид нормализованной структуры (аналогично последнему примеру, приведенному выше), и его будет легче редактировать, даже с помощью редактора потоков, такого как sed
.
Второй шаг: убрать все лишние * вставки
Далее вам нужно знать, что единственная необходимая * коробка - это MediaBox
. Этот ДОЛЖЕН присутствовать, другие являются необязательными (в определенном порядке приоритетов). Если остальные отсутствуют, по умолчанию используются те же значения, что и MediaBox
. Поэтому для достижения вашей цели мы можем просто удалить весь код, связанный с ними. Мы сделаем это с помощью sed
.
Этот инструмент обычно устанавливается во всех системах Linux - в Windows загрузите и установите его с gnuwin32.sf.net . (Не забудьте установить именованные «зависимости», если вы решите использовать файл .zip вместо Setup .exe).
Теперь запустите эту команду:
sed.exe -i.bak -e "/CropBox/,/]/s#.# #g" output.pdf
Вот что должна делать эта команда:
-i.bak
говорит sed редактировать исходный файл встроенным образом, а также создавать файл резервной копии с суффиксом .bak
(на случай, если что-то пойдет не так).
/CropBox/
указывает первую строку адреса для обработки с помощью sed.
/]/
указывает последнюю строку адреса для обработки с помощью sed.
s
говорит sed делать замены для всех строк от первой до последней адресуемой строки.
#.# #g
сообщает sed, какой тип замены нужно сделать: заменить каждый произвольный символ ('.
') в адресном пространстве пробелами ('
'), глобально ('g
').
Мы заменяем все символы пробелами (вместо «ничто», то есть удаляем их), потому что в противном случае мы получили бы жалобы на «повреждение файла PDF», так как счетчик ссылок на объекты и длины потоков изменились бы.
Третий шаг: запустите команду Ghostscript
Вы уже достаточно хорошо это знаете:
gswin32c.exe -sDEVICE=png16m -o outputImage_%03d.png output.pdf
Все три шага сверху можно легко записать в сценарий, который я оставлю вам для вашего удовольствия.