考虑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
。我已经尝试了解决方案here和here,但是都没有达到我的要求。
如何强制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
为我工作。