我正在尝试缩放PDF,例如A4尺寸小到A4。
这适用于肖像文档。文档按比例放大,然后将填充添加到顶部。
在横向文档中,不会添加填充。因此,文档最终将是A4的正确高度,但不够宽,因为文档方面没有添加填充(正如我所希望的那样)。
这是我用它来处理A4肖像文档的原因:
gs \
-sOutputFile=output.pdf \
-sDEVICE=pdfwrite \
-sPAPERSIZE=a4 \
-dCompatibilityLevel=1.4 \
-dNOPAUSE \
-dBATCH \
-dPDFFitPage \
input.pdf
答案 0 :(得分:52)
您应该添加-dFIXEDMEDIA
开关:
gs \
-o output.pdf \
-sDEVICE=pdfwrite \
-sPAPERSIZE=a4 \
-dFIXEDMEDIA \
-dPDFFitPage \
-dCompatibilityLevel=1.4 \
input.pdf
如果您需要强制使用特定纸张/页面/介质尺寸并忽略文档中指定的纸张/页面/介质尺寸,则始终需要 -dFIXEDMEDIA
。因为PDF始终定义了纸张/页面/介质尺寸(PostScript可能具有,或者可能没有...)。
(我的-o ...
更短,可以节省一个添加-dBATCH -dNOPAUSE
- 但仅适用于更新版本的Ghostscript。)
答案 1 :(得分:7)
您的命令根本不进行任何缩放,它只需要一个PDF文件并将其转换为PDF文件。
我建议您尝试添加-dPDFFitPage,它将缩放PDF文件中的页面以匹配当前页面大小(在本例中由-sPAPERSIZE指定)。
这通常适用于具有指定纸张尺寸的打印机,因此可能无法与没有固定页面尺寸的pdfwrite设备一起使用,但尝试一下。
答案 2 :(得分:6)
通过指定点的大小而不使用-dPDFFitPage,似乎可以(最好)强制输出的大小。我得到了分数点大小,这很糟糕。以下是使用按需印刷服务进行A5打印。 "真" A5是420x595点。我发现使用-sPAPERSIZE = a5给出了小数点页面大小,但这可能是因为原始版本很难。
gs \
-o output.pdf \
-sDEVICE=pdfwrite \
-dDEVICEWIDTHPOINTS=419 -dDEVICEHEIGHTPOINTS=595 \
-dFIXEDMEDIA \
-dCompatibilityLevel=1.4 \
input.pdf
为了测试这一点,我发现使用PDFshuffler我能够导出单个页面,然后使用pdfinfo我能够获得这些页面的精确大小。这证实明确使用设备参数有帮助。
答案 3 :(得分:6)
首先,感谢发布在这里的所有人。
我有一个名为pdfScale的小脚本,它吸收了这里发布的部分答案。所以我决定回复我的2美分。我正在使用Kurt和Tim的答案。更像Tim的相似之处。我已经玩了几天了,这是我对这里发布的方法的部分结论:
使用-sPAPERSIZE
在PS点设置纸张尺寸-dDEVICEWIDTHPOINTS
,-dDEVICEHEIGHTPOINTS
-dDEVICEWIDTH
,-dDEVICEHEIGHT
代替较长的积分版本,但他们似乎都做同样的事情(两者都得分)。因为我的bash脚本已经能够获取源页面大小,并且我喜欢能够设置自定义页面大小的想法,所以我决定专注于以点数设置页面大小。我还在我的脚本中包含了GS Paper Sizes(名称和大小)。所以获得这些信息也很容易。
如前所述,使用-dFIXEDMEDIA
似乎是两种情况都必须的。
这就是我的方法(以脚本方式)
当我尝试修复自动轮播问题时,I found this other Kurt response。
这是关于使用-dAutoRotatePages
。只需复制他的部分答案:
-dAutoRotatePages=/None
- 保留每页的方向; -dAutoRotatePages=/All
- 根据一种"多数决定&#34 ;; -dAutoRotatePages=/PageByPage
- 单独自动轮换页面。我的脚本默认为PageByPage
,但可以调整。它在我的测试中运作良好。使用-dAutoRotatePages
似乎也减少了预翻页面大小的需要,即使它不是一回事。我保留了两种选择。
我的小应用程序最初是为了缩放PDF而创建的(不改变页面大小)。然后我现在添加了一个,另一个或两个的功能。我仍然无法在一次GS电话会议中完成所有工作。
这就是我要求调整大小,将变量更改为实际值。这适用于A4纵向尺寸PageByPage
自动旋转:
gs \
-q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dSAFER \
-dCompatibilityLevel="1.5" -dPDFSETTINGS="/printer" \
-dColorConversionStrategy=/LeaveColorUnchanged \
-dSubsetFonts=true -dEmbedAllFonts=true \
-dDEVICEWIDTHPOINTS=595 -dDEVICEHEIGHTPOINTS=842 \
-dAutoRotatePages='/PageByPage' \
-dFIXEDMEDIA -dPDFFitPage \
-sOutputFile='../myOutputFile.pdf' \
-f '../input.pdf'
请注意,我还在使用-dFIXEDMEDIA
和-dPDFFitPage
。因为这适合页面,我的脚本的另一部分可能很方便在调整大小后缩放PDF内的内容(特别是如果PDF的比例发生了很大变化)。这是我在脚本中调整大小后(在混合模式下)总是运行缩放的原因之一。
关于使用Paper Name时的分数问题,在我将转换从mm /英寸舍入到点之前,我已经发生了这种情况。在我开始围绕它们之后,它们似乎永远是所需要的。看起来很奇怪,GS会为这些价值奠定基础。
所以我的结论是,困难的部分是找到一个解决方案,在不同的文档上使用不同的大小和方向。我仍然不确定我是否使用了正确的解决方案。但是,通过让用户更改翻转检测和GS自动旋转,我希望至少能够为大多数情况提供解决方案。
我还在这个过程中重建了大部分代码,现在很容易阅读。如果您想自己自动执行此类任务,可能需要检查它。当然,缩放/调整PDF大小也很有用:
https://github.com/tavinus/pdfScale
PS:pdfScale的起源on this StackOverflow thread。
答案 4 :(得分:-1)
pstops的功能令人遗憾,这是一个非常有用的包 缩放和组合postscript页面似乎不可用 对于pdfs。有一个名为pdftopdf的程序,但确实如此(就我而言) 可以看到)做与pstops相同的事情。 你可以制作一个ps文件(我在evince中打印到文件),使用pstops,和 那么ps2pdf,但这很笨拙。