PNG and Poppler

· 528 words · 2 minute read

前段时间碰到一个问题:xelatex 生成出来的 pdf,用阅读器(atril)打开, 图片看不见。

编译的时候,有报警信息如:

Overfull \hbox (170.25pt too wide) in paragraph at lines 2169--2170

图片确实偏大,但 orgmode 导出为 tex 的时候,图片会自动设置[width=.9\linewidth],而且搜索结果显示这个报警并不重要。

Poppler or not? 🔗

进一步试验发现,基于 poppler 的 PDF 浏览器,稍大一点的那两张图片都没显示。包括 atril, evince, qpdfview, okular 等等。

Firefox, Chrome, SumatraPDF, mupdf, foxit 都没问题。我很喜欢 mupdf,可惜 mupdf 不能显示 PDF 文档的书签栏,且原生 X11 的复制、粘贴并不鼠标友好。

pdfimage 🔗

poppler-utils 里包含了一个工具 pdfimage,用来抓取 PDF 文档里的图片。试验了一下,生成 PDF 文档时一共嵌入 6 张 PNG 图片,但却解出来 11 张 PPM 图片。而不能显示的两张大图各自对应一张同样大小但全黑的 PPM。

jpg? 🔗

用 ImageMagick 自带的 convert 工具把两张 png 转换成 jpg,重新编译一下 PDF,这回 atril 能正确显示那两张图了。

png again? 🔗

把 jpg 重新转换成 png,令人意外的是,这回生成出来的 PDF 也 OK. 用 pdfimage 提取图片,发现也正常的提取了 6 张图片。

Color depth 🔗

对比了一下,原图 PNG 是 16-bit RGBA,转化成 jpg 再转回去的 PNG 是 8-bit RGB.

所以问题可能在于:

  • poppler 处理 PDF 内嵌的 16 bit PNG 有问题(因为 mupdf 没问题);
  • 或者,XeTeX 处理 PNG 有问题(因为嵌入的图片比引入的多)。
comments powered by Disqus