1

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

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

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

我想出了一系列极其复杂的命令,包括

  • 阅读 CropBoxpdfinfo
  • -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 以更少的步骤执行(并且对原始文件的重新处理更少)。

4

1 回答 1

0

我终于想出了一个有用的解决方案——尽管它没有完全反映最初的问题。

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

于 2016-08-02T15:31:45.957 回答