使用ImageMagick实现PDF文件的无损旋转

21

我想使用CLI工具旋转一个大小为351K的PDF文件,文件名为08-file.pdf。我已经尝试使用imagemagick

convert 08-file.pdf -rotate 90 08-file-rotated.pdf

但原始质量:

enter image description here

遭受了严重的降级:

enter image description here

我尝试添加-density 300x300参数,但结果是一个2.5M的文件,几乎比原始文件大一个数量级,这是一种巨大的浪费。

有什么方法可以使用imagemagick无损旋转PDF文件吗?


ImageMagick 不能直接处理PDF文件。在其“支持的格式”页面上有一条注释,说明它“使用ghostScript来转换文件”,大概是将其转换为一个简单的位图,以便进行后续处理。然后,结果可以写入各种位图格式中,其中PDF只是其中的一种。请使用专门设计用于处理PDF的工具。 - Jongware
我会直接尝试使用Ghostscript。 - Bonzo
Imagemagick和Ghostscript都会将PDF转换为光栅图像。因此,如果您旋转PDF并尝试写回PDF,则原始PDF将被光栅化、旋转,然后将光栅结果放入矢量PDF外壳中。这不是一个好的方法。如果您想提高质量,请在读取PDF之前增加密度,然后适当调整大小。convert -density 288 08-file.pdf -rotate 90 -resize 25% 08-file-rotated.pdf。但我建议您寻找纯PDF矢量工具来完成此操作。由于您没有发布原始PDF,因此我们无法对其进行测试。 - fmw42
2个回答

17

我一直无法很好地使用imagemagik/convert转换/修改pdf文件(分辨率低或文件过大)。尝试使用选项-compress -density -quality总是让人沮丧而浪费时间(但我不是专家)。

建议1:pdftk

因此,我建议您使用pdftk(您可能需要通过apt-get install安装它)。

尝试:

pdftk  08-file.pdf cat 1-endright output 08-file-rotated.pdf

对于旧版pdftk(v<3),旋转仅由一个字母表示: N:0,E:90,S:180,W:270,L:-90,R:+90,D:+180。相同的命令是:

pdftk  08-file.pdf cat 1-endR output 08-file-rotated.pdf

在这个网站上的另一篇文章中,我简单地解释了语法。

pdftk input.pdf cat 1-endsouth output output.pdf
#     \_______/     \___/\___/        \________/
#     input file    range  |          output file
#                         direction

你还可以查看https://linux.die.net/man/1/pdftk

编辑于2020年:

方案2: qpdf

我找到了另一个等效的替代品: qpdf,更易记且功能更强大

请访问QPDF手册

#Syntax (you can rotate only some pages of the document -- see the manual --
qpdf --rotate=[+|-]angle[:page-range]

# Example
qpdf in.pdf out.pdf --rotate=+180

其他值得考虑的选项

pdfjam

PDF操作工具(CLI) 如果您的系统上没有安装pdftk,则可以考虑使用。

pdfjam看起来与pdftk非常相似。

pdfsam

这是一个带有图形用户界面的工具箱,用于修改pdf文件。

代码开源且跨平台。

输入图像描述


convert 能够正常工作,而且可以无损压缩(实际上取决于编码方式,可以减小文件大小)。 - jeffmcneill

4
请使用-compress lossless选项:
convert -rotate 90 -compress lossless 08-file.pdf 08-file-rotated.pdf

从文档中可以看到:

https://www.imagemagick.org/script/command-line-options.php#compress

无损是指无损JPEG,只有在JPEG库已经打了补丁支持它的情况下才可用。

另一个选择是使用以下命令:

jhead -cmd "jpegtran -progressive -perfect -rotate 270 &i > &o" Image-0001.jpeg

它将输出写入临时文件,成功后会覆盖原始文件:

Cmd:jpegtran -progressive -perfect -rotate 270″ Image-0001.jpeg″>″h1xQ6q″

修改:Image-0001.jpeg


6
使用“-compress lossless”选项进行转换会降低质量。我更喜欢在GIMP中打开文件,旋转它,然后使用“Print as File”选项打印。这是我找到的最佳解决方法。 - ghosh'.
“-compress jpeg” 对我有用。我的问题是文件大小。 - Victor Basso

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接