将pdf页面切成两半并使用ghostscript以不同方式重新组合部分

时间:2016-02-08 18:37:30

标签: pdf ghostscript pdftk imposition

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

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

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

我提出了一系列非常复杂的命令,涉及

  • 使用pdfinfo
  • 阅读CropBox
  • 复制文件并更改裁剪框,以便缩短左半部分并使用-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 个答案:

答案 0 :(得分: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();

请注意:这会使页面内容翻倍。使用预检规范或Acrobat的文档清理工具删除(不可见)页面内容。