嵌入图像会导致生成的 PDF 大小激增

嵌入图像会导致生成的 PDF 大小激增

我在用

$ pdflatex --version
pdfTeX 3.14159265-2.6-1.40.18 (TeX Live 2017/Debian)
kpathsea version 6.2.3

编译出 30 页的 pdf 输出。其中 12 页如下所示(其余的只有文本):

在此处输入图片描述

所有项目均由以下代码生成:

\newcommand{\weapon}[8]
{
\begin{multicols}{2}
  \noindent \textbf{#2} \\
  Необходима сила: #3  \\
  Обсег: #4  \\
  Щети: #5  \\
  Свойства: #6  \\
  Маса: #7  \\
  Стойност: #8  \\
  \includegraphics[height=0.13\textheight]{../images/#1}~
\end{multicols}
\vspace{0.01cm}
}

这使得文件大小达到:

remote: warning: File build/elementaris-fantasy.pdf is 63.06 MB; this is larger than GitHub's recommended maximum file size of 50.00 MB

我使用的图像未缩放,其中一些非常大。

如何减小 PDF 文件的大小?PDF 的用途是打印在纸张上作为游戏的参考。

答案1

您可以使用\DeclareGraphicsRule在具有指定扩展名的文件上调用调整大小命令(外部)。由于使用调整大小后的图像文件,因此 pdf 将变得更小。

在下面的 MWE 中,尺寸被硬编码为 100px 的高度。可以在文档中的任何位置声明该规则,然后将其替换为虚拟规则,以避免在文档的其他部分调整 jpg 文件的大小。但请注意,转换是按文件缓存的,因此您不能包含已调整大小的图像,然后再包含来自同一文件的全尺寸图像。

示例图像取自 Wikipedia (https://commons.wikimedia.org/wiki/File:Bodiam-castle-10My8-1197.jpg)。

代码(编译用--shell-escape):

\documentclass{article}
\usepackage{graphicx}
\begin{document}
% remove these two lines to reduce the pdf filesize
Before \texttt{\textbackslash DeclareGraphicsRule}:\\
\includegraphics[scale=0.2]{Bodiam-castle-10My8-1197.jpg}

% resize rule
\DeclareGraphicsRule{.jpg}{jpg}{.jpg}{`convert -geometry x100 #1 `basename #1 .jpg`-jpg-converted-to.jpg}

After \texttt{\textbackslash DeclareGraphicsRule}:\\
\includegraphics[scale=1.0]{Bodiam-castle-10My8-1197.jpg}
% dummy rule
\DeclareGraphicsRule{.jpg}{jpg}{.jpg}{`convert #1 `basename #1 .jpg`-jpg-converted-to.jpg}
\end{document}

结果:

在此处输入图片描述

答案2

您可以使用 ghostscript 压缩 pdf。相关的命令行选项是-dPDFSETTINGS=(请参阅这个问题了解详情)。

我使用以下脚本进行压缩(至中等分辨率):

#!/bin/bash
INPUT="$1"
if [[ ! -f "$INPUT" ]]; then
   echo "File not exist \"$INPUT\""
   exit 1
fi
OUTPUT="$2"
if [[ -f "$2" ]]; then
    echo "File exists \"$2\""
    exit 1
fi
OUTPUT=${OUTPUT:-${INPUT%.*}.pdf}
[[ $# > 2 ]] && (echo "Extra arguments found: \"$*\""; exit 1)
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile="$OUTPUT" "$INPUT"

相关内容