Разрезание 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 для удаления (невидимого) содержимого страницы.

Другие вопросы по тегам