如何在 Ghostscript 的帮助下解决这个问题......

如何在 Ghostscript 的帮助下解决这个问题......

如何将每页双面的 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

相关内容