将 pdf 页面切成两半并使用 ghostscript 以不同方式重新拼版

Cutting pdf page in half and reimposing parts differently using ghostscript

我正在寻找一个 ghostscript(或其他命令行)命令来重新拼版 pdf 页面,以便将左侧的元素复制到右侧。像这样:

页面的大小不应改变(每页的裁剪和切割方式不同),虽然我可以手动提供最终大小,但从原始 pdf 阅读它会更整洁。

为了简单起见,我们假设输入文件只有一页。

我想出了一系列极其复杂的命令,涉及

但是,我无法使它令人满意地工作,而且我不喜欢所涉及的一系列步骤或所涉及的工具数量。当然,所有步骤都可以使用 ghostscript 执行,并且步骤更少(并且对原始文件的再处理更少)。

我终于想出了一个有用的解决方案 - 虽然它没有完全反映原始问题。

此解决方案基于(专有)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 的文档清理工具删除(不可见的)页面内容。