如何使 pdfLaTeX 生成的 PDF 变得更小?

如何使 pdfLaTeX 生成的 PDF 变得更小?

我觉得生成的 PDFpdflatex太大了。例如,我的 50 页书没有插图,大小为 500KB。我觉得应该在 50K 甚至更小。文件.tex加起来只有 40KB。有人知道为什么最终的 PDF 这么大吗?有没有办法压缩它以使其变小?

答案1

一种常见的方法是让Ghostscriptgs)使用 创建 PDF 后对其进行优化和压缩pdflatex

Ghostscript 已安装在大多数 Linux 发行版中,并且可轻松用于其他平台(Windows 和二进制文件,MacOS 通过 MacPorts)。事实上,几乎所有你能在互联网上找到的 PDF 大小优化工具(Acrobat 除外)内部都使用 Ghostscript——所以你也可以直接调用它。

有很多可用的选项;我个人使用以下选项:

 gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.5 -dNOPAUSE -dQUIET -dBATCH -dPrinted=false -sOutputFile=foo-compressed.pdf foo.pdf

我主要用它进行投影演示,这样可以将文件大小减少 60% 到 70%。(10 MiB 的讲义大小变为 3 到 4 MiB。)

编辑2020-02-06:添加-dPrinted=false以保存超链接。
编辑2020-09-10:自 2010 年起,默认输出 PDF 1.5,-dCompatibilityLevel从 1.4更改为 1.5。pdflatex

答案2

这是上述脚本的修订版本。基本内容没有改变,但现在它以合理的方式处理路径等,如果新文件小于原始文件(而不是 0),则自动将新文件复制到旧文件上。它还提供了一些关于节省空间的信息。由于某些未知原因,再次运行它可以产生更小的输出,但通常不会太大。第一次运行可以大大加快速度。

例如:

ekl@Taro:~/Documents⟫ optpdf techResume.pdf 
Saving 1245351 bytes (now 6% of old)
ekl@Taro:~/Documents⟫ optpdf techResume.pdf 
Saving 31 bytes (now 99% of old)
ekl@Taro:~/Documents⟫ optpdf techResume.pdf 
Saving 7 bytes (now 99% of old)
ekl@Taro:~/Documents⟫ optpdf techResume.pdf 
Didn't make it smaller! Keeping original

给它提供长路径是合法的,但它目前不喜欢文件名中有空格。抱歉。让 shell 脚本在所有情况下都正确处理这个问题很麻烦,所以不要这样做。

以下是代码:

#!/bin/bash
#
# optpdf file.pdf
#   This script will attempt to optimize the given pdf

file="$1"
filebase="$(basename "$file" .pdf)"
optfile="/tmp/$$-${filebase}_opt.pdf"
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dNOPAUSE -dQUIET -dBATCH \
        -sOutputFile="${optfile}" "${file}"

if [ $? == '0' ]; then
    optsize=$(stat -c "%s" "${optfile}")
    orgsize=$(stat -c "%s" "${file}")
    if [ "${optsize}" -eq 0 ]; then
        echo "No output!  Keeping original"
        rm -f "${optfile}"
        exit;
    fi
    if [ ${optsize} -ge ${orgsize} ]; then
        echo "Didn't make it smaller! Keeping original"
        rm -f "${optfile}"
        exit;
    fi
    bytesSaved=$(expr $orgsize - $optsize)
    percent=$(expr $optsize '*' 100 / $orgsize)
    echo Saving $bytesSaved bytes \(now ${percent}% of old\)
    rm "${file}"
    mv "${optfile}" "${file}"
fi

享受!

答案3

有一个很棒的脚本可以缩小 PDF:https://github.com/pts/pdfsizeopt。我已经用了好几年了,推荐一下。主要效果是压缩嵌入的字体。如果字体很大,比如 Linux Libertine,这个功能就非常有用。这个脚本会将这样的 PDF(如果不包含图片)缩小到 10% 的大小!

在 Windows 下使用它需要仔细安装才能获得所有必要的 *.dll 文件。

脚本偶尔会因错误消息而退出。最常见的原因是 Multivalent 出现问题。只需使用命令 避免使用 multivalent 即可pdfsizeopt.py --use-multivalent=false ...

如果您包含由 pdftex 制作的其他 PDF,则会出现另一个问题。有时(尤其是使用 Linux Libertine 时),所包含 PDF 中的斜体字母会出现乱码。我们可以通过在 *.tex 文件的第一行中添加以下内容来避免这种情况:\pdfinclusioncopyfonts=1

相关内容