Разрезание pdf страницы пополам и повторное наложение частей с помощью ghostscript
Я ищу команду ghostscript (или другую командную строку), чтобы наложить PDF-страницу так, чтобы элементы с левой стороны были скопированы справа. Вот так:
Размер страницы не должен изменяться (каждая страница обрезается и обрезается по-разному), и хотя я мог бы указать конечный размер вручную, было бы лучше прочитать его из исходного PDF-файла.
Для простоты предположим, что входной файл имеет только одну страницу.
Я придумал чрезвычайно сложную серию команд, включающую
- чтение CropBox с
pdfinfo
- копирование файла и изменение поля обрезки, чтобы левая половина была укорочена, а правая половина - с
-c "[/CropBox [*new dimensions*] /PAGES pdfmark"
команда - копирование файла и изменение поля обрезки, чтобы левая половина оставалась
- повторная обработка этого файла со старыми размерами страницы
-g "PageDimension"
а также-c \"<<\/Install{1 1 scale WithOfRightside 0 translate}>> setpagedevice\"
- используйте pdftk, чтобы объединить два новых файла в одну страницу:
pdftk.exe lefthalf.pdf background righthalf.pdf output combinedfile.pdf
Однако я не мог заставить это работать удовлетворительно, и мне не нравятся ни последовательность шагов, ни количество задействованных инструментов. Конечно, все шаги могут быть выполнены с помощью ghostscript и с меньшим количеством шагов (и с меньшей обработкой оригинала).
1 ответ
Я наконец-то нашел полезное решение - хотя оно не полностью отражает первоначальный вопрос.
Это решение основано на (проприетарном) Acrobat и использует интерфейс Acrobat JavaScript, а не GhostScript. Но следующий скрипт работает прекрасно, поэтому я решил поделиться им:
/*
* Acrobat PDF script
* transpose part of left page to right side and recrop document
*/
// define cutting line, in points from left
var cuttingline = 300;
/* define offset(s) --- if uncertain, leave at 0
a) of new left page border,
b) of transposed half of page
WATCH OUT:
a) may expose material from original left half when negative
b) may expose material from original right half when negative - leave "correctcrop" true to avoid this.
*/
var offsetleft = 5;
var offsettransposition = -50;
var correctcrop = true;
// cut off left page and add as much white space to right, then insert left part of page on top right
for (var p = 0; p < this.numPages; p++) {
// add white space to media box right
console.println("\nPage " + (p + 1));
var aRect = this.getPageBox("Media", p);
console.println("Original media box: " + aRect);
aRect[2] += cuttingline + offsettransposition;
console.println("New media box: " + aRect);
this.setPageBoxes("Media", p, p, aRect);
// Add copy of page as overlay, shifted to the right
this.addWatermarkFromFile({
cDIPath: this.path,
nSourcePage: p,
nStart: p,
nEnd: p,
nHorizAlign: app.constants.align.left,
nVertAlign: app.constants.align.bottom,
nHorizValue: aRect[2] - cuttingline + offsettransposition,
nVertValue: 0
});
// crop left, add space to crop box right to reveal page copy
var aRect = this.getPageBox("Crop", p);
console.println("Original crop box: " + aRect);
aRect[0] += cuttingline + offsetleft;
aRect[2] += cuttingline + offsettransposition + (((correctcrop == true) && (offsettransposition < 0)) ? offsettransposition : 0);
console.println("New crop box: " + aRect);
this.setPageBoxes("Crop", p, p, aRect);
}
// flatten layers
this.flattenPages();
Пожалуйста, обратите внимание: это удваивает содержание страницы. Используйте профиль Preflight или инструменты очистки документов Acrobat для удаления (невидимого) содержимого страницы.