Разрезание страницы 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 и за меньшее количество шагов (и меньше повторной обработки оригинала).


person mheim    schedule 08.02.2016    source источник
comment
Вы можете сделать это с помощью Ghostscript, но...... Не за один шаг, вам потребуется как минимум 3.   -  person KenS    schedule 08.02.2016
comment
Хорошо, а как мне это сделать? Меня особенно интересует, как сделать реальное наложение двух страниц/двух областей страницы на одну новую страницу в Ghostscript   -  person mheim    schedule 09.02.2016
comment
Сначала вам нужно создать страницу, содержащую только левую часть, а затем страницу, содержащую только правую часть. Затем вам нужно создать новый файл PDF, в котором правая часть отображается слева от страницы, а левая часть смещается вправо. Чтобы сделать последнее (наложение), вам нужно использовать процедуры BeginPage и EndPage в словаре страничного устройства. Ваша процедура EndPage должна не выдавать страницу 1, а выдавать страницу 2. Вам придется поэкспериментировать с перемещением страницы 2, это может быть возможно как часть EndPage, но может также потребоваться и BeginPage.   -  person KenS    schedule 09.02.2016


Ответы (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();

Обратите внимание: это удваивает содержимое страницы. Используйте профиль предварительной проверки или инструменты очистки документов Acrobat, чтобы удалить (невидимое) содержимое страницы.

person mheim    schedule 02.08.2016