将 pdf 页面切成两半并使用 ghostscript 以不同方式重新拼版
Cutting pdf page in half and reimposing parts differently using ghostscript
我正在寻找一个 ghostscript(或其他命令行)命令来重新拼版 pdf 页面,以便将左侧的元素复制到右侧。像这样:
页面的大小不应改变(每页的裁剪和切割方式不同),虽然我可以手动提供最终大小,但从原始 pdf 阅读它会更整洁。
为了简单起见,我们假设输入文件只有一页。
我想出了一系列极其复杂的命令,涉及
- 使用
pdfinfo
读取 CropBox
- 正在复制文件并更改 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 执行,并且步骤更少(并且对原始文件的再处理更少)。
我终于想出了一个有用的解决方案 - 虽然它没有完全反映原始问题。
此解决方案基于(专有)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 的文档清理工具删除(不可见的)页面内容。
我正在寻找一个 ghostscript(或其他命令行)命令来重新拼版 pdf 页面,以便将左侧的元素复制到右侧。像这样:
页面的大小不应改变(每页的裁剪和切割方式不同),虽然我可以手动提供最终大小,但从原始 pdf 阅读它会更整洁。
为了简单起见,我们假设输入文件只有一页。
我想出了一系列极其复杂的命令,涉及
- 使用
pdfinfo
读取 CropBox
- 正在复制文件并更改 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 执行,并且步骤更少(并且对原始文件的再处理更少)。
我终于想出了一个有用的解决方案 - 虽然它没有完全反映原始问题。
此解决方案基于(专有)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 的文档清理工具删除(不可见的)页面内容。