我正在寻找一个ghostscript(或其他命令行)命令来重新创建一个pdf页面,以便将左侧的元素复制到右侧。像这样:
页面的大小不应该改变(每个页面都被裁剪和切割不同),虽然我可以手动提供最终尺寸,但从原始pdf中读取它会更简洁。
为简单起见,我们假设输入文件只有一页。
我提出了一系列非常复杂的命令,涉及
pdfinfo
-c "[/CropBox [*new dimensions*] /PAGES pdfmark"
命令扩展右半部分-g "PageDimension"
和-c \"<<\/Install{1 1 scale WithOfRightside 0 translate}>> setpagedevice\"
pdftk.exe lefthalf.pdf background righthalf.pdf output combinedfile.pdf
然而,我无法令人满意地工作,我不喜欢所涉及的一系列步骤或调用的工具数量。当然,所有步骤都可以使用ghostscript和较少的步骤执行(并且可以减少对原始文件的重新处理)。
答案 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的文档清理工具删除(不可见)页面内容。