wom*_*ble 17 linux pdf ghostscript
我有一堆 PDF 文件,其中包含两个“真实”页面到一个 PDF 页面;我想把它们切成两半,然后把每一半放在单独的一页上。本质上,我需要一些与pdfnup(or psnup)完全相反的东西。如何实现这一壮举?
平台为Linux,开源优先;因为我有一大堆这些来做一些可以编写脚本的东西(而不是 GUI)会很好,所以我可以给它一个它们的列表并让它咀嚼。
预先存在的脚本也不是唯一的选择;如果有使用第三方库以类似方式操作 PDF 的示例代码,我可能可以将其破解为做我想做的事。
Kur*_*fle 23
您可以在 Ghostscript 的帮助下解决此问题。pdftk单独不能做到这一点(据我所知)。我将为您提供手动执行此操作的命令行步骤。将此脚本作为一个过程将很容易,也可以使用不同的页面大小和页码参数。但是你说你可以自己做;-)
...为了它的乐趣,我最近没有使用具有“双倍”页面的输入文件,而是使用具有“三倍”页面的输入文件。您可以在此处阅读此案例的答案。
你的情况更简单。你似乎有类似的东西:
+------------+------------+ ^
| | | |
| 1 | 2 | |
| | | 595 pt
| | | |
| | | |
| | | |
+------------+------------+ v
^
fold
v
+------------+------------+ ^
| | | |
| 3 | 4 | |
| | | 595 pt
| | | |
| | | |
| | | |
+------------+------------+ v
<---------- 842 pt -------->
Run Code Online (Sandbox Code Playgroud)
您想创建 1 个包含 4 页的 PDF,每页的大小为 421 pt x 595 pt。
让我们首先从每个输入页面中提取左侧部分:
gs \
-o left-sections.pdf \
-sDEVICE=pdfwrite \
-g4210x5950 \
-c "<</PageOffset [0 0]>> setpagedevice" \
-f double-page-input.pdf
Run Code Online (Sandbox Code Playgroud)
这些参数做了什么?
首先,要知道在 PDF 中1 inch == 72 points。那么剩下的就是:
-o ...............:命名输出文件。隐式也使用-dBATCH -dNOPAUSE -dSAFER.-sDEVICE=pdfwrite : 我们想要 PDF 作为输出格式。-g................:以像素为单位设置输出媒体大小。pdfwrite 的默认分辨率是 720 dpi。因此,乘以 10 以获得 PageOffset 的匹配项。-c "..............:要求 Ghostscript 在主输入文件(需要跟在 之后-f)之前处理给定的 PostScript 代码片段。<</PageOffset ....:设置介质上页面图像的移动。(当然,对于左页, shift by[0 0]没有实际效果。)-f ...............: 处理这个输入文件。最后一条命令实现了哪个结果?
这个:
Output file: left-sections.pdf, page 1
+------------+ ^
| | |
| 1 | |
| |595 pt
| | |
| | |
| | |
+------------+ v
Output file: left-sections.pdf, page 2
+------------+ ^
| | |
| 3 | |
| |595 pt
| | |
| | |
| | |
+------------+ v
<-- 421 pt -->
Run Code Online (Sandbox Code Playgroud)
接下来,正确的部分:
gs \
-o right-sections.pdf \
-sDEVICE=pdfwrite \
-g4210x5950 \
-c "<</PageOffset [-421 0]>> setpagedevice" \
-f double-page-input.pdf
Run Code Online (Sandbox Code Playgroud)
请注意负偏移,因为我们将页面向左移动,同时保持查看区域静止。
结果:
Output file: right-sections.pdf, page 1
+------------+ ^
| | |
| 2 | |
| |595 pt
| | |
| | |
| | |
+------------+ v
Output file: right-sections.pdf, page 2
+------------+ ^
| | |
| 4 | |
| |595 pt
| | |
| | |
| | |
+------------+ v
<-- 421 pt -->
Run Code Online (Sandbox Code Playgroud)
现在我们将这些页面合并为一个文件。我们也可以使用 ghostscript 来做到这一点,但我们将使用pdftk它,因为它对于这项工作更快:
pdftk \
A=right-sections.pdf \
B=left-sections.pdf \
shuffle \
output single-pages-output.pdf
verbose
Run Code Online (Sandbox Code Playgroud)
完毕。这是想要的结果。4 个不同的页面,大小为 421x595 pt。
结果:
+------------+ +------------+ +------------+ +------------+ ^
| | | | | | | | |
| 1 | | 2 | | 3 | | 4 | |
| | | | | | | |5595 pt
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
+------------+ +------------+ +------------+ +------------+ v
<-- 421 pt --> <-- 421 pt --> <-- 421 pt --> <-- 421 pt -->
Run Code Online (Sandbox Code Playgroud)