如何使用Ghostscript将PDF的大小精确调整为8.5 x 11英寸?

mer*_*011 3 pdf ghostscript

考虑这个PDF。我正在尝试使用以下命令将其转换为标准字母大小(8.5 x 11)。

gs -dFIXEDMEDIA -dBATCH -dNOPAUSE -sPAPERSIZE=letter \
   -dPDFFitPage -q -sDEVICE=pdfwrite -sOutputFile=out.pdf \
    dean08mapreduce.pdf
Run Code Online (Sandbox Code Playgroud)

这是pdfinfo输出。

Producer:       GPL Ghostscript 9.10
CreationDate:   Mon Nov 17 18:25:01 2014
ModDate:        Mon Nov 17 18:25:01 2014
Tagged:         no
Form:           none
Pages:          7
Encrypted:      no
Page size:      596.225 x 792 pts
Page rot:       0
File size:      126908 bytes
Optimized:      no
PDF version:    1.4
Run Code Online (Sandbox Code Playgroud)

这是pdfinfo原始文件:

Producer:       Creo Normalizer JTP
CreationDate:   Fri Dec 21 09:09:07 2007
ModDate:        Fri Dec 21 14:46:23 2007
Tagged:         no
Form:           AcroForm
Pages:          7
Encrypted:      no
Page size:      603 x 801 pts
Page rot:       0
File size:      235239 bytes
Optimized:      yes
PDF version:    1.3
Run Code Online (Sandbox Code Playgroud)

请注意,输出具有正确的高度,但没有正确的宽度。实际上8.3 x 11,不是8.5 x 11

我在这里这里都尝试过解决方案,但都没有达到我的要求。

如何强制PDF准确8.5 x 11

我不介意是否要在两边添加一点空白。

Ken*_*enS 5

双重转换不是一个好计划,您可能会在每个步骤中引入问题,特别是因为PostScript不支持PDF的图形模型(特别是它不支持透明性)

您的问题是原始PDF文件包含一个CropBox,由Ghostscript pdfwrite设备保留。pdfinfo的输出告诉您PDF文件的大小,同时考虑了CropBox。MediaBox实际上是612x792,即恰好是8.5x11,这正是您想要的。

给出高度不同的原因是,因为新的MediaBox位于原始CropBox的内部,所以它是所给出的两个盒子的交集。

如果您不希望保留CropBox,则必须构造一个新的CropBox Page或PAGES pdfmark并将其作为PostScript发送。这并非完全不平凡。在您的情况下,每个页面都有一个CropBox(不是整个文档的默认值),因此您需要在每个页面上覆盖CropBox。为此,您需要定义一个/ EndPage过程,该过程使用pdfmark设置所需的CropBox,并处理PDF文件之前发送该过程。

这个 :

gs -sDEVICE=pdfwrite \
   -dDEVICEWIDTHPOINTS=612 -dDEVICEHEIGHTPOINTS=792 -dFIXEDMEDIA \
   -sOutputFile=out.pdf \
   -c "<</EndPage {0 eq {[/CropBox [0 0 612 792] /PAGE pdfmark true}{false}ifelse}>> setpagedevice" \
   -f dean08mapreduce.pdf
Run Code Online (Sandbox Code Playgroud)

为我工作。