由于有许多小彩色框,PDF 大小较大

由于有许多小彩色框,PDF 大小较大

底部有附加信息

我本来打算\colorbox以逐字模式使用 es,每个字母一个,但这会显著增加 pdf 的大小(通过生成latex+dvipdfmxpdflatex类似,我对它进行了进一步测试)。

绘制黄色规则似乎比绘制字母字形更简单,但从简单的测试来看,当 PDF 需要绘制许多字母时,它比绘制许多小规则时更经济。有没有办法知道pdflatex某些东西会被反复使用,将其存储在某个地方,并在需要时经济地使用指向它的指针?我猜有点像自动从部分嵌入的字体中拾取的字形。

在下面的排序中MWE,我发现当我有数千份相同类型的彩色框副本时,pdf 文件大小并不离谱,大约 4 个字节切换到黄色,绘制一个矩形,切换回正常颜色,还不错。但它仍然比编码绘制字母所需的要多得多X。有没有办法获得更紧凑的 PDF?

(我尝试过ps2pdf,在这里是可以的,但在实际情况下无法减少从 dvipdfmx 获取的文件大小;事实上文件大小从 1.1M 变为 1.5M)。

\documentclass{article}
\usepackage{color}
\begin{document}

Hello.

% 28367 bytes for 4000 boxes
% 19844 bytes for 2000 boxes
% 15558 bytes for 1000 boxes
% 11658 bytes for 100 boxes
% 11167 bytes for 1 box
% about 4.4 bytes per colored box.
\newsavebox{\mybox}
\sbox{\mybox}{\colorbox{yellow}{\phantom{X}}}

\count255 4000
\noindent\loop
\usebox{\mybox}
%\colorbox{yellow}{\phantom{X}}
\advance\count255 by -1
\ifnum\count255>0
\repeat

% 11695 bytes for 1000 X
% 12272 bytes for 2000 X
% 12895 bytes for 3000 X
% 13057 bytes for 4000 X
% 13603 bytes for 5000 X
% \sbox{\mybox}{X}
% \count255 5000
% \noindent\loop
% \usebox{\mybox}
% \advance\count255 by -1
% \ifnum\count255>0
% \repeat

\end{document}

pdfxform我在这里报告我当时所做的测试wipet 的回答出现了。我使用了以下测试文件。这是现在在旧的 TL2010 上。在其他默认设置下,PDF 是 PDF 1.5 文件。我得到了26907带有单词Hello4000黄色框的字节\usebox,并23972使用方式得到了字节\pdfxform

然后在我的实际用例中,再次TL2010(并且dvipdfmx从那时起不断发展)我得到以下数量级:

  1. 对于没有任何框而只有字母(在 monotype 中)的源,dvipdfmx生成的文件有大约580000字节,而一个pdflatex文件有大约760000字节(文档正文中使用的字体主要是newtxtt我添加到我的 中的字体TL2010)。

  2. 当我完成所有彩色框时,dvipdfmx现在的重量约为930000字节(但在家里它约为1050000字节)和pdflatex一个1122000字节。

  3. 如果我现在做这\pdfxform件事,我会得到一个1090000字节文件。

结论:不可否认的是,这样做确实有一些好处,但pdflatex+\pdfxform在我的例子中,它产生的文件仍然比 更大dvipdfmx。而当我不使用任何彩色框时,我的dvipdfmx文件会40%小一些……

通过添加框增加的文件大小约为350k(对于两种编译路径而言),并且使用为\pdfxform我节省了约30k,这很好但仍然令人沮丧。

\documentclass{article}
\usepackage{color}

\begin{document}

Hello.

\fboxsep0pt

\newsavebox{\mybox}
\sbox{\mybox}{\colorbox{yellow}{\strut\phantom{X}}}

% USE OF A BOX
% gives pdf file of 26907 bytes
% This is a 1.5 PDF file pdfTeX-1.40.11  (TL2010)
\count255 4000
\noindent\loop
\penalty0
\usebox{\mybox}%
\advance\count255 by -1
\ifnum\count255>0
\repeat

% % USE OF \pdfxform
% % gives pdf file of 23972 bytes
% \pdfxform\mybox % attention, empties box register

% \count255 4000
% \noindent\loop
% \penalty0
% \hbox{\pdfrefxform \pdflastxform}%
% \advance\count255 by -1
% \ifnum\count255>0
% \repeat

\end{document}

最后一点信息:在我的实际用例中,文档目前有大约 100150页,每页有 5 到 10 个单词,其字母具有黄色背景,实际上我可以数出它们:32297方框!因此,对于每个这样的黄色矩形,惩罚约为 100010个字节,使用\pdfxform并没有太大的改善。

152我已经在实际使用带有方框的页面文档的案例上重新进行了测试32297。为了使其更简洁,我删除了逐字字母,并对具有32297相同字母宽度的 strutbox、彩色或非彩色(这是xcolor和颜色 yellow)进行了比较。添加彩色框的成本:

  1. 195303使用 dvipdfmx 时的字节数,
  2. 232110使用 pdflatex 时字节数,
  3. 194208使用 pdflatex+ 时字节\pdfxform

因此,看起来dvipdfmxpdflatex+\pdfxform的效率相同,每个彩色框的成本约为6字节。我不知道为什么当在文件中完成此操作而不执行其他操作时,3.2每个彩色框的成本会更高。

我还发现了一些奇怪的事情\pdfxform。使用这个测试文件:

\documentclass{article}
%\usepackage{xcolor}    
\begin{document}

Hello.

%\fboxsep0pt

\newsavebox{\mybox}
\sbox{\mybox}
  %{\colorbox{yellow}{\strut\phantom{X}}}
  {\strut\phantom{X}}% NO COLOR!

% USE OF \pdfxform

\pdfxform\mybox 

\count255 32297
\noindent\loop
\penalty0
\hbox{\pdfrefxform \pdflastxform}%
\advance\count255 by -1
\ifnum\count255>0
\repeat

\end{document}

我获得大约114000字节,如果使用则大致相同\colorbox。但是如果我 使用该\pdfxform机制,然后使用彩色盒子,其pdf重量约为140000字节,但是当生产时没有颜色而只有空盒子,那么它就只有16572字节。

在我的大文件中,使用\pdfxform彩色框会得到951744字节,使用非彩色框会得到951711字节。但是,不使用时,彩色(字节)和非彩色(字节)情况pdfxform之间存在很大差异。953646721543

答案1

以下是使用的解决方案\pdfxform

\setbox0=\hbox{\colorbox{yellow}{\phantom{X}}}
\pdfxform0  \mathchardef\myboxnum=\pdflastxform
\def\mybox{\pdfrefxform\myboxnum}

\count255 4000
\noindent\loop
\mybox\
\advance\count255 by -1
\ifnum\count255>0
\repeat

MWE 的未压缩 PDF(\pdfcompresslevel=0)有 673757 个字节,而相同使用\pdfxform有 170255 个字节,压缩率为 3.95。MWE 创建的一个黄色框在 PDF 中看起来像:

0 0 1 0 k 0 0 1 0 K
0 0 1 0 k 0 0 1 0 K
q
1 0 0 1 150.281 642.291 cm
0 0 13.45 12.785 re f
Q
0 0 1 0 k 0 0 1 0 K
0 g 0 G
0 0 1 0 k 0 0 1 0 K
0 g 0 G
0 g 0 G
0 g 0 G

显然,颜色处理非常无效(color.sty这是宏包造成的)。

另一方面,当\pdfxform使用时,相同的黄色框表示为:

q
1 0 0 1 150.281 642.291 cm
/Fm1 Do
Q

这里使用了指针。但是,每个框都必须应用由连接矩阵 (cm) 实现的当前点的移位。另一方面,PDF 规范对字体中字符的打印进行了更优化:字符之间的当前点会“自动”移位。

编辑:我做了第三个实验进行比较。为了尽量减少 PDF 中的垃圾,在没有宏支持的情况下手动使用颜色:

\count255 4000
\noindent\loop
\hbox{\pdfliteral{0 0 1 0 k}\rlap{\vrule height2ex width.7em}\pdfliteral{0 g}\kern.7em}
\advance\count255 by -1
\ifnum\count255>0
\repeat

现在,未压缩的 PDF 有 250322 个字节,一个黄色框如下所示:

1 0 0 1 10.205 0 cm
0 0 1 0 k
q
0 0 6.974 8.579 re f
Q
0 g

MWE 与第三种解决方案的压缩比为 2.7。不使用\pdfxform。仅省略了无效的宏包并手动设置颜色。

相关内容