我需要一种方法来缩小并压缩批量 PDF 文件。我更愿意在 Windows 上执行此操作,但如果这意味着更顺畅的工作流程,Linux 也可以。
我知道有 NitroPDF 和 Acrobat 等程序可以实现这一点,但我担心这必须逐个文件进行。这些程序也不便宜,我宁愿不买它们,只为了使用一两个功能。
背景信息:我使用 CamScanner 将收据和发票数字化,以便记入帐户(FreeAgent)。CamScanner pdf 均为 A4 大小,多页文件通常会超过 2MB 附件限制。
答案1
我在这里建议使用命令行工具,它可以轻松地使用 Windows、Linux、OS X 等内置脚本语言中的循环进行批处理。
图像魔术师支持 PDF 并具有resize
选项及其转变工具。我个人从未使用过它,但你可以尝试使用它。
旋转 PDF
$ convert -rotate 270 -density 300x300 -compress lzw in.pdf out.pdf
这假设 PDF 是基于 TIFF 的。密度参数很重要,因为否则 ImageMagick 会降低图像的采样率(出于某种原因)。添加压缩选项有助于保持 PDF 的整体大小较小,而不会损失质量。
对于多页 PDF,您可能需要使用pdftk
,然后使用mogrify
使用 ImageMagick 来转换每个页面:
$ pdftk in.pdf burst $ mogrify -rotate 270 -density 300x300 -compress lzw pg_*.pdf $ pdftk pg*.pdf cat output out.pdf $ rm pg*.pdf
要使用 ImageMagick 转换 PDF 文件,您需要GhostScript已安装。
ImageMagick 可以转换多页 PDF。虽然mogrify
可以就地转换,但我建议您使用,convert
这样您就可以在发生意外时保留原始文件。
我对您提供的示例 PDF 进行了一些测试。对我来说效果很好:
convert -density 200 -compress jpeg -quality 20 test.pdf test2.pdf
密度默认为72
DPI。通过将其设置得更高,我们可以获得更高的分辨率,因此质量可以接受。它在 上看起来还不错150
,而且有点小,但如果你想满足一系列 PDF 的要求,它200
应该可以。
JPEG 压缩应该自动选择一个级别或默认为,92
范围为1
到,其中 为最佳。设置为,它看起来几乎和原始图像一样好(稍微模糊一点,底部的小文本有点难以阅读,但无论如何它原本就是如此)。100
100
20
这些选项将为您带来1.7MB取样至0.5MB,同时保持其可读性。您可以进行一些实验。
如果您想要更小的尺寸(文件和图像/PDF 的尺寸),您可以使用-resize #%
,例如-resize 75%
。但是,在您的示例 PDF 上,这会使底部的小字体几乎无法阅读。
如果空间仍然紧张,尤其是多页 PDF,您可以通过将文件添加到 ZIP(或其他)存档来进一步压缩。这样可以将测试 PDF 上的文件大小降低到 0.43MB(降低 JPEG 压缩质量的效果要大得多)。您还可以使用pdftk
, 作为@glallen在他的编辑中建议,或者拆分档案并在另一端重新组合。
2MB 也是一个相当小的附件限制,你可能需要考虑其他电子邮件提供商。从记忆中,GMail 每封电子邮件提供超过 10MB 的空间。
这些选项以及其他选项均有完整记录在他们的网站上。
答案2
因此convert
,ImageMagick 将生成栅格化 PDF,许多人都希望保持矢量图形和文本不变,这样只压缩嵌入的图像。因此,进行压缩的良好替代方法是使用gs
包中的ghostscript
使用示例:
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile=out.pdf in.pdf
在上面的命令参数中:-dPDFSETTINGS=/ebook
很重要。它可以有 3 个值:
-dPDFSETTINGS=/screen (screen-view-only quality, 72 dpi images)
-dPDFSETTINGS=/ebook (low quality, 150 dpi images)
-dPDFSETTINGS=/printer (high quality, 300 dpi images)
-dPDFSETTINGS=/prepress (high quality, color preserving, 300 dpi imgs)
-dPDFSETTINGS=/default (almost identical to /screen)