![如何在 Ghostscript 的帮助下解决这个问题......](https://linux22.com/image/1218427/%E5%A6%82%E4%BD%95%E5%9C%A8%20Ghostscript%20%E7%9A%84%E5%B8%AE%E5%8A%A9%E4%B8%8B%E8%A7%A3%E5%86%B3%E8%BF%99%E4%B8%AA%E9%97%AE%E9%A2%98.......png)
如何将每页双面的 PDF 转换为每页单面的 PDF?
答案1
好的,这个问题已经在 Acrobat(完整版,不是 Reader)的帮助下解决了。但是如果你无法使用 Acrobat,该怎么办?Ghostscript 和 pdftk 也可以做到这一点吗?
如何在 Ghostscript 的帮助下解决这个问题......
...为了好玩,我们不要使用带有“双页”页面的输入文件,而是使用带有“三页”页面的输入文件。实际上,我今天通过电子邮件收到了一个这样的 PDF。这是一张折叠起来的传单莱波雷洛的阴谋纸张尺寸为 A4 横向 (842pt x 595pt),折叠和布局如下:
Front side to be printed, page 1 of PDF
+--------+--------+--------+ ^
| | | | |
| 5 | 6 | 1 | |
| | | | 595 pt
| | | | |
| | | | |
| | | | |
+--------+--------+--------+ v
^ ^
fold fold
v v
+--------+--------+--------+ ^
| | | | |
| 2 | 3 | 4 | |
| | | | 595 pt
| | | | |
| | | | |
| | | | |
+--------+--------+--------+ v
Back side to be printed, page 2 of PDF
<---------- 842 pt -------->
我想要创建 1 个包含 6 页的 PDF,每页的尺寸均为 280.67pt x 595 pt。
第一步
让我们首先从每个输入页面中提取左侧部分:
gswin32c.exe ^
-o left-sections.pdf ^
-sDEVICE=pdfwrite ^
-g2807x5950 ^
-c "<</PageOffset [0 0]>> setpagedevice" ^
-f myflyer.pdf
这些参数起什么作用?
-o ...............:
命名输出文件。隐式地也使用-dBATCH -dNOPAUSE -dSAFER
。-sDEVICE=pdfwrite :
我们希望 PDF 作为输出格式。-g................:
设置输出媒体大小(以像素为单位)。pdfwrite 的默认分辨率为 720 dpi。因此乘以 10 即可获得 PageOffset 的匹配值。-c "..............:
要求 Ghostscript 在主输入文件(需要跟在后面-f
)之前处理给定的 PostScript 代码片段。<</PageOffset ....:
设置介质上页面图像的移位。(当然,对于左页,移位[0 0]
没有实际效果。)-f ...............:
处理此输入文件。
最后一个命令实现了什么结果?
这个:
Output file: left-sections.pdf, page 1
+--------+ ^
| | |
| 5 | |
| |595 pt
| | |
| | |
| | |
+--------+ v
Output file: left-sections.pdf, page 2
+--------+ ^
| | |
| 2 | |
| |595 pt
| | |
| | |
| | |
+--------+ v
< 280 pt >
第二步
现在让我们对中心部分做类似的事情:
gswin32c.exe ^
-o center-sections.pdf ^
-sDEVICE=pdfwrite ^
-g2807x5950 ^
-c "<</PageOffset [280.67 0]>> setpagedevice" ^
-f myflyer.pdf
结果:
Output file: center-sections.pdf, page 1
+--------+ ^
| | |
| 6 | |
| |595 pt
| | |
| | |
| | |
+--------+ v
Output file: center-sections.pdf, page 2
+--------+ ^
| | |
| 3 | |
| |595 pt
| | |
| | |
| | |
+--------+ v
< 280 pt >
第三步
最后,正确的部分:
gswin32c.exe ^
-o right-sections.pdf ^
-sDEVICE=pdfwrite ^
-g2807x5950 ^
-c "<</PageOffset [561.34 0]>> setpagedevice" ^
-f myflyer.pdf
结果:
Output file: right-sections.pdf, page 1
+--------+ ^
| | |
| 1 | |
| |595 pt
| | |
| | |
| | |
+--------+ v
Output file: right-sections.pdf, page 2
+--------+ ^
| | |
| 4 | |
| |595 pt
| | |
| | |
| | |
+--------+ v
< 280 pt >
最后一步
现在我们将这些页面合并为一个文件:
pdftk.exe ^
A=right-sections.pdf ^
B=center-sections.pdf ^
C=left-sections.pdf ^
cat A1 B2 C2 A2 B1 C1 ^
output single-files-input.pdf
verbose
完成。这是所需的结果。6 个不同的页面,尺寸为 280.67x595。
结果:
+--------+ +--------+ +--------+ +--------+ +--------+ +--------+ ^
| | | | | | | | | | | | |
| 1 | | 2 | | 3 | | 4 | | 5 | | 6 | |
| | | | | | | | | | | | 595 pt
| | | | | | | | | | | | |
| | | | | | | | | | | | |
| | | | | | | | | | | | |
+--------+ +--------+ +--------+ +--------+ +--------+ +--------+ v
< 280 pt > < 280 pt > < 280 pt > < 280 pt > < 280 pt > < 280 pt >
答案2
刚刚遇到了同样的问题。我偶然发现了 briss,一个用于分离和裁剪 pdf 页面的开源 java GUI 工具:
http://sourceforge.net/projects/briss/
对我来说,它在 Linux 上运行得很好,尽管用户界面并不简单。它甚至可以处理页面大小不同的 PDF!
答案3
@peims,谢谢。这是您的方法的分步版本。我在想要为 Kindle DX 转换的文件上尝试了该方法,效果很好:
- 使用完整版Acrobat v9裁剪页面左侧,并将其保存为“left.pdf”:
- 使用裁剪工具标记页面的左侧。
- 右键单击,然后选择“设置裁剪框”。
- 选择“文档..裁剪页面”,并将裁剪应用于整个文档。
- 对右侧页面重复此操作,保存为“right.pdf”。
- 在此阶段,您有两个文档:“left.pdf”包含左侧页面,以及“right.pdf”包含右侧页面。
接下来,使用 pdftk.exe(来自http://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/)将结果交错成单个文件。将“pdftk.exe”、“left.pdf”和“right.pdf”复制到“D:\”,然后执行:
- D:>pdftk D:\left.pdf突发输出%05d_A.pdf
- D:>pdftk D:\right.pdf 突发输出 %05d_B.pdf
- D:>pdftk *_?.pdf cat 输出合并.pdf
注意:如果你将文件复制到“C:\”,由于安全权限问题,在 Win 7 下无法使用。如果你没有 D:\,则创建目录“C:\x”即可完成操作。
这些结果通常已经足够好了。但是,还有两个可选步骤可以改善输出。
- (可选的最后一步 1)在此阶段,文档非常大(我的文档从 7MB 膨胀到 80MB),因此您可以使用以下任一方法减小文件大小:
- “高级..PDF 优化器”或:
- “高级..预检”具有“与 Acrobat 5 兼容”设置。
- (可选的最后一步 2)所有页面的大小都不同。重复裁剪所有页面,使所有内容都具有统一的大小。
答案4
我使用以下脚本在 Mac 和 Linux 上处理扫描的书籍。这会占用大量内存。
#!/bin/bash
#
# This script processes scanned books. After scanning the books have been cropped with
# Preview. This does kind of a "soft crop" that we need to make a bit "harder".
#
# The second step is to take each page of the PDF and split this into two two pages,
# because each page of the scanned document actually contains two pages of the book.
#
#
FILE=`mktemp`.pdf
FILE2=`mktemp`.pdf
FILE3=`mktemp`.pdf
echo "Making a temporary copy of the input file."
cp $1 $FILE
#
# Start cropping
#
echo "Cropping the PDF"
# The first regex removes all boxes but CropBox. The second regex renames the CropBox as MediaBox
perl -pi.bak -e 's/\/(Media|Bleed|Art|Trim)Box[\n\l\f\s]*\[(.+?)\]//msg;' $FILE
perl -pi.bak -e 's/CropBox/MediaBox/g;' $FILE
echo "Validating the PDF"
#Run PDFTK to ensure that the file is OK
cat $FILE | pdftk - output $FILE2
#
# Done cropping, start splitting the pages
#
echo "Splitting the pages in two and changing to 200 dpi with imagemagick. Output goes to $FILE3"
convert -density 200 $FILE2 -crop 50%x0 +repage $FILE3
#
# Done spliting, copy the result in a new file
#
mv $FILE3 $1.pages.pdf