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

gs -dFIXEDMEDIA -dBATCH -dNOPAUSE -sPAPERSIZE=letter \
   -dPDFFitPage -q -sDEVICE=pdfwrite -sOutputFile=out.pdf \
    dean08mapreduce.pdf


这是输出中的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


这是原件上的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


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

我已经尝试了解决方案herehere,但是都没有达到我的要求。

如何强制PDF精确地为8.5 x 11

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

最佳答案

双重转换不是一个好计划,您可能会在每个步骤中引入问题,尤其是因为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


为我工作。

10-08 03:19