使用 imagemagick 无损旋转 PDF 文件

Posted

技术标签:

【中文标题】使用 imagemagick 无损旋转 PDF 文件【英文标题】:Lossless rotation of PDF files with imagemagick 【发布时间】:2016-11-11 21:36:30 【问题描述】:

我想使用 CLI 工具旋转名为 08-file.pdf 的 351K PDF。我试过imagemagick:

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

但原汁原味:

遭受严重退化:

I've tried adding the -density 300x300 argument,但是结果是一个250万的文件,比原来大了近一个数量级,是巨大的浪费。

知道如何吗?

【问题讨论】:

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

我在使用 imagemagik/convert 转换/更改 pdf 文件时总是遇到不好的结果(分辨率不好或文件很大)。使用选项 -compress -density -quality 总是令人沮丧和浪费时间(但我不是专家)。

提案一:pdftk

所以我会推荐 pdftk(你可能需要通过 apt-get install 来安装它)

试试:

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

对于旧版本的 pdftk (v

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 manual

#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

这是一个使用 GUI(图形用户界面)修改 pdf 文件的工具箱。

代码是开源和多平台的。

【讨论】:

convert 确实有效,并且可以无损压缩(实际上根据编码减小了文件大小)。【参考方案2】:

请使用-compress lossless 选项:

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

来自文档: https://www.imagemagick.org/script/command-line-options.php#compress

Lossless 是指无损 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

【讨论】:

使用 -compress 无损的转换会降低质量。我更喜欢在 GIMP 中打开文件,旋转它,然后使用“打印为文件”选项打印它。这是我发现的最好的解决方法。 -compress jpeg 为我工作。我的问题是文件大小。

以上是关于使用 imagemagick 无损旋转 PDF 文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 ImageMagick 将 PNG 文件转换为 PDF 时出现粗糙的边缘

如何使用 Imagemagick 替换单个 PDF 页面?

通过 ImageMagick 或 GhostScript 命令行旋转 .EPS 文件

Imagemagick、雪豹和 PDF 转换

使用 PHP 进行无损图像旋转

ImageMagick 和 PHP 正确旋转图像