如何减小扫描的 PDF 文件的文件大小?

tam*_*mym 562 pdf compression

我有一个 72.9MB 的 PDF 文件,我需要将其缩小到 500KB 以下。

该文件是我扫描的 JPEG 图像,然后转换为 pdf。

小智 804

使用以下ghostscript命令:

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook \
-dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf
Run Code Online (Sandbox Code Playgroud)

总结-dPDFSETTINGS

  • -dPDFSETTINGS=/screen质量较低,尺寸较小。( 72 dpi )
  • -dPDFSETTINGS=/ebook为了更好的质量,但稍大的 pdf。( 150 dpi )
  • -dPDFSETTINGS=/prepress输出类似于 Acrobat Distiller“印前优化”设置(300 dpi
  • -dPDFSETTINGS=/printer选择类似于 Acrobat Distiller“打印优化”设置 ( 300 dpi ) 的输出
  • -dPDFSETTINGS=/default 选择旨在用于广泛用途的输出,可能以更大的输出文件为代价

参考:https://www.ghostscript.com/doc/current/VectorDevices.htm#PSPDF_IN

特定于 PostScript 和 PDF 输入的控件和功能

-dPDFSETTINGS=configuration

将“蒸馏器参数”预设为四个预定义设置之一:

  • /screen 选择类似于 Acrobat Distiller(最高版本 X)“屏幕优化”设置的低分辨率输出。
  • /ebook 选择类似于 Acrobat Distiller(最高版本 X)“电子书”设置的中等分辨率输出。
  • /printer 选择类似于 Acrobat Distiller“打印优化”(最高版本 X)设置的输出。
  • /prepress 选择类似于 Acrobat Distiller“印前优化”(最高版本 X)设置的输出。
  • /default 选择旨在用于广泛用途的输出,可能会以更大的输出文件为代价。

每个这些的确切设置,包括它们的 DPI 值,显示在此表中的几十个选项中:https : //www.ghostscript.com/doc/current/VectorDevices.htm#distillerparams

  • 这是这个问题的正确答案(压缩主要是位图数据的 pdf)。我发现“屏幕”设置对我来说质量太低,但“电子书”运行良好,将 33Mb 的基于扫描的 PDF 减少到 3.6Mb,并保持其可读性。此处列出了`-dPDFSETTINGS` 选项的其他选项:http://milan.kupcevic.net/ghostscript-ps-pdf/,将它们包含在此答案中可能是个好主意。 (49认同)
  • 这应该是公认的答案。ghostscript 是 unices * the * PDF、XPS 和 PS 实现,基本上可以完成所有提供最佳质量的工作...... (17认同)
  • @Sina:实际上有一个 Nautilus 脚本,它带有一个简单的基于 Zenity 的 GUI,它利用这个 gs 命令及其所有质量级别选项:https://launchpad.net/compress-pdf (9认同)
  • gs 可用配置参数:http://ghostscript.com/doc/current/Ps2pdf.htm (7认同)
  • 在 17.10 上,它把 42 mb pdf 变成了 127 mb :( (4认同)
  • 还可以制作一个 Nautilus 脚本来为每个文件访问此功能。 (2认同)

don*_*oey 226

我最喜欢的方法是将 PDF 转换为 PostScript,然后再转换回来。不过,它并不总是有效,但是当它有效时,结果很好:

ps2pdf input.pdf output.pdf
Run Code Online (Sandbox Code Playgroud)

正如评论中所建议的,这也直接适用于 PDF。

一些用户在使用电子书设置时也报告了更多成功,如下所示:

ps2pdf -dPDFSETTINGS=/ebook input.pdf output.pdf
Run Code Online (Sandbox Code Playgroud)

  • 尽管这种方法成为我最喜欢的压缩 pdf 文件的解决方案,但它打破了文档可能具有的 url 链接(@Michael D 的方法不会发生这种情况)。除此之外,我能想到的就是运行这个片段!(: (18认同)
  • ps2pdf 将把 pdf 作为输入,所以你可以一步完成:`ps2pdf intput.pdf output.pdf` (11认同)
  • 这绕过密码保护......只是说 (4认同)
  • 它没有用(84 MB→82 MB),但是 @PabloBianchi 建议的 `ps2pdf -dPDFSETTING=/ebook in.pdf out.pdf` 导致 272 kB !非常感谢 ! (4认同)
  • @don.joey 无法理解为什么,因为只是扩展了你的答案。这里主要的是:`ps2pdf`也使用ghostscript,所以你可以使用`-dPDFSETTINGS=/ebook`之类的东西。 (2认同)

v2r*_*v2r 217

aking1012 是对的。有了关于可能的嵌入图像、超链接等的更多信息,回答这个问题会容易得多!

这里有几个脚本和命令行解决方案。请按您认为合适的方式使用。

  • 非常感谢您的建议,ghostscript shell 创造了奇迹并将其缩小到 460KB :) (25认同)
  • 收缩pdf效果很好! (7认同)
  • 我推荐您shrinkpdf.sh 脚本,您可以自定义代码以使用您想要的ppi 值(默认为72)并准确达到您需要牺牲最低质量的文件大小。这使我能够上传最大 11 MB 的扫描文档。3 MB 的大小而不会损失很多质量。 (4认同)
  • OP 所指的 ghostscript shell 在哪里 https://askubuntu.com/questions/113544/how-can-i-reduce-the-file-size-of-a-scanned-pdf-file#comment134224_113547? (4认同)

som*_*onr 177

如果您有一个带有扫描图像pdf,您可以使用convert(ImageMagick) 创建一个带有jpeg 压缩的 pdf (您可以在任何 pdf 上使用此方法,但您会丢失所有文本信息)。

例如:

convert -density 200x200 -quality 60 -compress jpeg input.pdf output.pdf
Run Code Online (Sandbox Code Playgroud)

根据您的需要调整参数

  • -密度:以 dpi 为单位的像素密度(例如 100x100)。更高的像素密度可提高质量和尺寸
  • -质量:压缩比。对于 jpg,它介于 1 到 100 之间,其中 100 质量最好,但压缩率最低
  • -compress:压缩算法。由于压缩伪影,jpeg压缩可能不是最佳选择。您可以选择 BZip、Fax、Group4、JPEG、JPEG2000、无损、LZW、RLE 或 Zip 作为备用压缩方法(有些只允许黑白图像)。

我能够为扫描/拍摄的文档实现很高的压缩率(取决于设置)。根据文档来源,您可能希望降低颜色深度(-depth参数)。

  • 对于您感兴趣的是文本而不是图像并且保留深度不是问题的扫描文档,jpeg 压缩不是一个好主意,因为伪影往往非常明显。如果你使用 `pdfimages input.pdf pages` 来提取 pbm 文件,那么你可以这样做: `for page in *.pbm; 做转换 $page -compress Group4 -type bilevel TIFF:- | 转换 - output.pdf`。任何 OCR 都会丢失,所以我通常会做`pdfsandwich output.pdf`,这似乎进一步减小了文件大小。 (3认同)
  • 这种方法最终在幕后使用了`gs`。 (2认同)
  • 我不得不使用双破折号作为运行命令`--density --quality --compress` 与`-density -quality -compress` 的选项。 (2认同)
  • 如果图像质量不是最关心的问题(并且您只是想让那个 dang 电子邮件附件足够小以供发送),则也可以添加“-resize 50%”,根据扫描时使用的 DPI 更改百分比 (2认同)

小智 55

我需要缩小包含文档全彩色扫描的 PDF。就文件而言,我的每一页都是全彩色图像。它们是包含文本和图像的页面图像,但它们是通过扫描到图像而创建的。

我使用了以下 ghostscript 命令和另一个线程中的一个组合。

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dDownsampleColorImages=true \
-dColorImageResolution=150 -dNOPAUSE  -dBATCH -sOutputFile=output.pdf input.pdf
Run Code Online (Sandbox Code Playgroud)

这将图像分辨率降低到 150dpi,将我的文件大小减少了一半。查看文档,几乎没有明显的图像质量损失。文本在我的 2012 Nexus7 上仍然完全可读。

  • +1 用于下采样图像但将文本保留为向量。在不使我的文本像素化的情况下在侧面产生了巨大的变化。 (5认同)
  • 太棒了,可以用这个命令调整分辨率 - 这给了我比仅仅使用 dPDFSETTINGS=\screen 更好的结果 (2认同)

Oli*_*Oli 33

这是重写扫描的 pdf的脚本

#!/bin/sh

gs  -q -dNOPAUSE -dBATCH -dSAFER \
    -sDEVICE=pdfwrite \
    -dCompatibilityLevel=1.3 \
    -dPDFSETTINGS=/screen \
    -dEmbedAllFonts=true \
    -dSubsetFonts=true \
    -dColorImageDownsampleType=/Bicubic \
    -dColorImageResolution=72 \
    -dGrayImageDownsampleType=/Bicubic \
    -dGrayImageResolution=72 \
    -dMonoImageDownsampleType=/Bicubic \
    -dMonoImageResolution=72 \
    -sOutputFile=out.pdf \
     $1
Run Code Online (Sandbox Code Playgroud)

您可以对其进行一些自定义以使其更具可重用性,但如果您只有一个 pdf,则只需将其替换$1为您的 pdf 文件名并将其塞入终端即可。


Jav*_*era 26

我通常使用 ps2pdf 来执行此操作(更简单的语法),如下所示:

ps2pdf -dPDFSETTINGS=/ebook BiggerPdf SmallerPDF
Run Code Online (Sandbox Code Playgroud)

我使用以下 python 脚本来减小生产服务器 (8.04) 目录中所有 pdf 文件的大小。所以它应该工作。

#!/usr/bin/python

import os

for fich in os.listdir('.'):
        if fich[-3:]=="pdf":
                os.system("ps2pdf -dPDFSETTINGS=/ebook %s reduc/%s" % (fich,fich))
Run Code Online (Sandbox Code Playgroud)

  • -dPDFSETTINGS=/printer 选项做 50% 调整大小。电子书做 90% 调整大小。 (3认同)

小智 26

  1. 我使用LibreOffice Draw打开 pdf。
  2. 然后我“导出为pdf”
  3. 并将“jpeg 压缩质量”设置为 50%,将“图像分辨率”设置为 150 dpi

这将有一个很好的结果。

  • 最坏的解决方案!它完全搞乱了我的文件! (4认同)
  • 对于我来说,这个解决方案是最好的,只需要根据自己想要做什么来配置它。为我工作,将“jpeg 压缩质量”设置为 83%,将“图像分辨率”设置为 150 dpi (3认同)

小智 17

最适合我的是

convert -compress Zip -density 150x150 input.pdf output.pdf
Run Code Online (Sandbox Code Playgroud)

其他方法:

#### gs
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf $INPUTFILE

### pdf2ps && ps2pdf
pdf2ps input.pdf output.ps && ps2pdf output.ps output.pdf

### Webservice
http://compress.smallpdf.com/de
Run Code Online (Sandbox Code Playgroud)

问候


小智 11

我强烈推荐pdfsizeopt

这是减少大小比以前的CLI和GUI的软件,我已经试过的方面更有效(包括convertgspdftk等) -尽管可能较慢的pngout激活- ,并且没有他们的一些问题(不严重像素化/退化的图像,不会丢失元数据,例如目录等)。

现在,如果您需要达到一定的尺寸,无论后果如何(包括将图像降级到不可读的程度),它可能不是您需要的工具,而是作为一种始终有效的首选解决方案,以减少不必要的大尺寸在不损失可读性、信息和可接受的图像质量的情况下,我认为这是最好的选择。(注意:我倾向于在 Adob​​e Acrobat 中首次进行矢量化 OCR 后使用它[该功能以前称为“CleanScan”],这会对某些扫描的文本文档产生巨大的尺寸影响。)


我推荐通用的 Unix 安装

  1. 安装所有必需的依赖项:
  1. 下载并安装可执行文件:

     curl -L -o https://raw.githubusercontent.com/pts/pdfsizeopt/master/pdfsizeopt.single
     chmod +x pdfsizeopt.single
     cp pdfsizeopt.single /usr/local/bin/pdfsizeopt
    
    Run Code Online (Sandbox Code Playgroud)

用法:

pdfsizeopt original.pdf [compressed.pdf]
Run Code Online (Sandbox Code Playgroud)

找到这篇文章的Mac用户(或 Linuxbrew 用户)请注意:有一个 Homebrew 安装公式:

brew install --HEAD pts/utils/pdfsizeopt
Run Code Online (Sandbox Code Playgroud)

  • 多么奇妙的软件宝石!非常感谢您推荐这个:-) (2认同)

小智 6

控制压缩质量:

#!/bin/sh
INPUT=$1; shift
OUTPUT=$1; shift
GS_BIN=/usr/bin/gs
QFACTOR="0.40"

# Image Compression Quality
#
# Quality HSamples VSamples QFactor
# Minimum [2 1 1 2] [2 1 1 2] 2.40
# Low     [2 1 1 2] [2 1 1 2] 1.30
# Medium  [2 1 1 2] [2 1 1 2] 0.76
# High    [1 1 1 1] [1 1 1 1] 0.40
# Maximum [1 1 1 1] [1 1 1 1] 0.15 

${GS_BIN} -dBATCH -dSAFER -DNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=${OUTPUT} -c "<< /ColorImageDict << /QFactor ${QFACTOR} /Blend 1 /HSample [1 1 1 1] /VSample [1 1 1 1] >> >> setdistillerparams" -f ${INPUT}
Run Code Online (Sandbox Code Playgroud)

  • 注意“转变”。第一个参数是输入文件,第二个参数是输出文件,其余参数将按原样传递给“gs”。 (2认同)

Ant*_*llo 6

对我来说,gsscreen选项太糟糕了,而且ebook太大了。

我的原始文档包含彩色文本和黑白图像(取决于页面)。

我提出的最佳解决方案是:

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dDownsampleColorImages=true -dDownsampleGrayImages=true -dDownsampleMonoImages=true -dColorImageResolution=130 -dGrayImageResolution=130 -dMonoImageResolution=130 -r130 -dNOPAUSE  -dBATCH -sOutputFile=output_lr.pdf input.pdf
Run Code Online (Sandbox Code Playgroud)

请注意,压缩级别不是线性的。如果我指定 135,它不会被压缩,我确实发现 130 是(在我的情况下)实现压缩的最大分辨率。


小智 5

我自己刚刚遇到了这个问题。如果使用简单扫描,请为低分辨率扫描选择文本模式,您无需担心命令行内容。就是说。


小智 5

由于当我在谷歌中搜索时,这个链接是我的第一个链接,所以我想我应该再添加一个可能性。对于从 Inkscape (15 mb) 导出的 pdf,上述解决方案都不适合我,但我最终能够通过在 GIMP 中打开它并再次导出为 pdf 将其缩小到 1 mb。

另一个接近的选项(但文本有点模糊)是 ImageMagick 的转换实用程序:

convert -compress Zip input.pdf output.pdf
Run Code Online (Sandbox Code Playgroud)


小智 5

我面临着同样的问题,很高兴找到这个线程。具体来说,我有一个从扫描图像生成的 pdf,需要将其字节大小减少 6 倍。

不幸的是,上面的解决方案都不起作用:(。然后我意识到在扫描仪-> jpeg-> pdf过程中的某个地方页面的大小已经膨胀了大约4倍。我扫描的文档都是信纸大小的,但pdf的大小为

identify -verbose doc_orig.pdf | grep "Print size"
 Print size: 35.4167x48.7222
Run Code Online (Sandbox Code Playgroud)

我最终使用“转换”命令获得了所需的结果,该命令同时执行调整大小和压缩步骤:

convert -density 135x135 -quality 70 -compress jpeg -resize 22.588% doc_orig.pdf doc_lowres.pdf
Run Code Online (Sandbox Code Playgroud)

请注意,doc_orig 的密度为 72x72 dpi。


Gab*_*les 5

参考这个答案这个答案,在尝试了一堆答案之后,做了一堆研究和实验,我想出了以下几点。请注意,我已经删除了-dCompatibilityLevel=1.4此处其他一些答案中使用的命令部分,因为此表表明1.51.7已在今天(2020 年 12 月 27 日)自动用于此设置,并且无需覆盖这些值。

使用 Ghostscript ( gs) 压缩input.pdfoutput.pdf

3 主要压缩级别:
注意:您还可以添加-dQUIET以抑制所有输出到标准输出。请参阅:https : //www.ghostscript.com/doc/current/Use.htm

  1. 低压缩300 dpi(大文件)
    gs -sDEVICE=pdfwrite -dPDFSETTINGS=/printer -dNOPAUSE -dBATCH \
    -sOutputFile=output.pdf input.pdf
    
    Run Code Online (Sandbox Code Playgroud)
  2. [最佳测试]中等压缩(推荐):150 dpi(中等文件大小)
    gs -sDEVICE=pdfwrite -dPDFSETTINGS=/ebook   -dNOPAUSE -dBATCH \
    -sOutputFile=output.pdf input.pdf
    
    Run Code Online (Sandbox Code Playgroud)
  3. 高压缩率72 dpi(小文件大小——在某些情况下可能会产生颗粒状或不可读的结果,因此请尝试并试一试)
    gs -sDEVICE=pdfwrite -dPDFSETTINGS=/screen  -dNOPAUSE -dBATCH \
    -sOutputFile=output.pdf input.pdf
    
    Run Code Online (Sandbox Code Playgroud)

您还可以time在命令前面添加以查看需要多长时间(这适用于任何Linux 命令)。示例输出:

$ time gs -sDEVICE=pdfwrite -dPDFSETTINGS=/ebook -dNOPAUSE -dBATCH -sOutputFile=out.pdf in.pdf
GPL Ghostscript 9.50 (2019-10-15)
Copyright (C) 2019 Artifex Software, Inc.  All rights reserved.
This software is supplied under the GNU AGPLv3 and comes with NO WARRANTY:
see the file COPYING for details.
Processing pages 1 through 15.
Page 1
Loading NimbusSans-Regular font from /usr/share/ghostscript/9.50/Resource/Font/NimbusSans-Regular... 5205104 3852122 2872760 1487237 3 done.
Page 2
Page 3
Page 4
Page 5
Page 6
Page 7
Page 8
Page 9
Page 10
Page 11
Page 12
Page 13
Page 14
Page 15

real    0m1.326s
user    0m1.142s
sys     0m0.048s
Run Code Online (Sandbox Code Playgroud)

如果添加-dQUIET到命令中,则不会显示任何Ghostscript 输出,并且您会得到以下信息(time在前面使用时):

$ time gs -sDEVICE=pdfwrite -dPDFSETTINGS=/ebook -dNOPAUSE -dBATCH -dQUIET -sOutputFile=out.pdf in.pdf

real    0m1.018s
user    0m0.976s
sys     0m0.040s
Run Code Online (Sandbox Code Playgroud)

您还可以使用ps2pdf,它是 的包装器gs,并产生非常相似但不完全相同的结果。但是,我更喜欢gs直接使用,如上所示。

  1. 低压缩:300 dpi(大文件)
    ps2pdf -dPDFSETTINGS=/printer input.pdf output.pdf
    
    Run Code Online (Sandbox Code Playgroud)
  2. 中等压缩(推荐):150 dpi(中等文件大小)
    ps2pdf -dPDFSETTINGS=/ebook   input.pdf output.pdf
    
    Run Code Online (Sandbox Code Playgroud)
  3. 高压缩率:72 dpi(小文件大小——在某些情况下可能会产生颗粒状或不可读的结果,请尝试并试一试)
    ps2pdf -dPDFSETTINGS=/screen  input.pdf output.pdf
    
    Run Code Online (Sandbox Code Playgroud)

PDF压缩测试

gspdf2searchablepdf此处对我的脚本的输出测试上述命令,我看到以下内容:

  1. 低压缩:没有显着影响,因为我的脚本已经生成了 300 dpi 的输出 PDF。因此,一个3.8 MB 3 pg 的输入 PDF 导致输出 PDF 为~3.8MB
  2. [BEST] 中等压缩:很好地压缩文件!阿 3.8 MB 3 PG输入PDF导致的输出PDF 〜0.95MB
  3. 高压缩:可能太多了。一个3.8 MB 3 pg 的输入 PDF 导致输出 PDF 为~0.37MB,但在我的特定测试中是完全不可读的,因为输入 PDF 开始时的分辨率已经有些差。如果您从高质量/高分辨率输入 PDF 开始,您可能会获得更好的可读结果。

Ghostscript ( gs) 文档:

对于所有可用的-d(“ define”)PDFSETTINGS,请参见此处:https : //www.ghostscript.com/doc/current/VectorDevices.htm#PSPDF_IN 。我已经引用了下面的那部分内容,但我已将每个设置的 DPI 值添加为粗体,如从此处的表中获取的。您可以参考该表来查看gs为每个PDFSETTINGS选项选择的数十个较低级别的设置。

特定于 PostScript 和 PDF 输入的控件和功能

-dPDFSETTINGS=configuration

将“蒸馏器参数”预设为四个预定义设置之一:

  • /screen (72 dpi)选择类似于 Acrobat Distiller(最高版本 X)“屏幕优化”设置的低分辨率输出。
  • /ebook (150 dpi)选择类似于 Acrobat Distiller(最高版本 X)“电子书”设置的中等分辨率输出。
  • /printer (300 dpi)选择类似于 Acrobat Distiller“打印优化”(最高版本 X)设置的输出。
  • /prepress (300 dpi)选择类似于 Acrobat Distiller“印前优化”(最高版本 X)设置的输出。
  • /default (72 dpi)选择旨在用于各种用途的输出,可能会以更大的输出文件为代价。

您还可以在此页面上查看各种选项的定义:https : //www.ghostscript.com/doc/current/Use.htm

-dNOPAUSE
禁用每页末尾的提示和暂停。通常,-dBATCH当在打印机上或文件上产生输出时,应该使用它(连同);对于另一个程序正在“驱动”Ghostscript 的应用程序,它也可能是可取的。

-dBATCH
导致 Ghostscript 在处理了命令行上命名的所有文件后退出,而不是进入交互式循环读取 PostScript 命令。相当于放在-c quit命令行的末尾。

-dQUIET
禁止对标准输出进行常规信息注释。当前将设备输出重定向到标准输出时,这是必需的。