我觉得生成的 PDFpdflatex
太大了。例如,我的 50 页书没有插图,大小为 500KB。我觉得应该在 50K 甚至更小。文件.tex
加起来只有 40KB。有人知道为什么最终的 PDF 这么大吗?有没有办法压缩它以使其变小?
答案1
一种常见的方法是让Ghostscript(gs
)使用 创建 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
。