![将图像作为 base64 字符串嵌入到 tex 文件中?](https://linux22.com/image/300344/%E5%B0%86%E5%9B%BE%E5%83%8F%E4%BD%9C%E4%B8%BA%20base64%20%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%B5%8C%E5%85%A5%E5%88%B0%20tex%20%E6%96%87%E4%BB%B6%E4%B8%AD%EF%BC%9F.png)
本网站上一个常见的问题是如何将图像直接嵌入 .tex 源文件中,而无需将图像放在单独的文件中。此类问题的示例(通常标记为重复)如下
- 将pdf图片源代码直接包含到LaTeX文件中
- 使用编码算法嵌入图像
- 是否可以在 TeX 文档中嵌入 Base64 编码图像?
- 直接嵌入图像
- 在 tex 文档中嵌入图像数据(png 或 pdf)
- ...
不幸的是,这些答案都有些过时了。特别是,
- 许多用户(几年前)回应说“用户根本不应该想要这个”,而是将多个文件作为 zip/tar 存档发送。然而,在这个 .tex 文件的自动生成变得越来越频繁的时代,单文件纯文本生成比多文件和/或二进制文件容易得多(尤其是在使用预定义框架时),这种说法不再成立。
- 提供此类功能的软件包 https://gist.github.com/mikeashley/258731不再存在。另一个包https://github.com/zerotoc/pdfinlimg提供此功能,但仅适用于位图图像(png/jpg),不适用于 svg/eps/pdf/其他矢量格式,并将其编码为 HEX,与 base64 相比非常浪费。
因此,我想重新提出这个问题并再次提出这个问题:如何创建一个命令 \includebase64image 使得
\includebase64image{png}{iVBORw0KGgokIA...}
\includebase64image{pdf}{weEGE2ewFWE58q...}
得出的结果为\includegraphicx{a file with content type #1 and contents #2}
,即给定内容和类型的图像出现在生成的PDF文件中的当前位置?
答案1
如果你有一个命令行 base64 解码器(base64 -d
此处)并允许
pdflatex --shell-escape
要运行外部命令,那么除了标准图形包之外您不需要任何其他东西。
这里我包含一个 base64 编码的 pdf 图像。
\documentclass{article}
\begin{filecontents*}{\jobname.64}
JVBERi0xLjUKJbXtrvsKMyAwIG9iago8PCAvTGVuZ3RoIDQgMCBSCiAgIC9GaWx0ZXIgL0ZsYXRl
RGVjb2RlCj4+CnN0cmVhbQp4nJWTO1LEMAyG+5xCNYXQy69j7BFoWIpsAdx/Bjlksx4nZE0VWSP/
3y9Z+ZwIY46SAjRBThRyhq8rvL4RXL8nAlFDTQw3jxTZvAxmkCKohSEKclzOaCF5SV6KZ/iY3l8c
IZSyKTSBFmGvdASBkqFZce0H50BrTdTqsNBW8cKapNpeA66qXfFts6rEGKP9w7zfKJGhCaJokNKb
vw9GyStcaD5kHvfgQ3HzsAW/PXSCz2bfw1btIMH9Pb7JCsmA+YbVvsvZ1DmonzMYJeRUx86p+F4Z
GGfMXHXvGRXBEkPNrLdUGP0zwzSwNuxGPTK/k6nu5ZpQUTSRI9ne3dAL7zkVoGCaUIo2DTUt/gU6
+9U6/xtIJSzkocmdrVNnfAyw6+3ZUg3Ma4ftX25hXKYfzwLt9wplbmRzdHJlYW0KZW5kb2JqCjQg
MCBvYmoKICAgMzA1CmVuZG9iagoyIDAgb2JqCjw8CiAgIC9FeHRHU3RhdGUgPDwKICAgICAgL2Ew
IDw8IC9DQSAxIC9jYSAxID4+CiAgID4+Cj4+CmVuZG9iago1IDAgb2JqCjw8IC9UeXBlIC9QYWdl
CiAgIC9QYXJlbnQgMSAwIFIKICAgL01lZGlhQm94IFsgMCAwIDI5Mi4zODk5MjMgNDM3LjI5MzI0
MyBdCiAgIC9Db250ZW50cyAzIDAgUgogICAvR3JvdXAgPDwKICAgICAgL1R5cGUgL0dyb3VwCiAg
ICAgIC9TIC9UcmFuc3BhcmVuY3kKICAgICAgL0NTIC9EZXZpY2VSR0IKICAgPj4KICAgL1Jlc291
cmNlcyAyIDAgUgo+PgplbmRvYmoKMSAwIG9iago8PCAvVHlwZSAvUGFnZXMKICAgL0tpZHMgWyA1
IDAgUiBdCiAgIC9Db3VudCAxCj4+CmVuZG9iago2IDAgb2JqCjw8IC9DcmVhdG9yIChjYWlybyAx
LjExLjIgKGh0dHA6Ly9jYWlyb2dyYXBoaWNzLm9yZykpCiAgIC9Qcm9kdWNlciAoY2Fpcm8gMS4x
MS4yIChodHRwOi8vY2Fpcm9ncmFwaGljcy5vcmcpKQo+PgplbmRvYmoKNyAwIG9iago8PCAvVHlw
ZSAvQ2F0YWxvZwogICAvUGFnZXMgMSAwIFIKPj4KZW5kb2JqCnhyZWYKMCA4CjAwMDAwMDAwMDAg
NjU1MzUgZiAKMDAwMDAwMDcwNSAwMDAwMCBuIAowMDAwMDAwNDE5IDAwMDAwIG4gCjAwMDAwMDAw
MTUgMDAwMDAgbiAKMDAwMDAwMDM5NyAwMDAwMCBuIAowMDAwMDAwNDkxIDAwMDAwIG4gCjAwMDAw
MDA3NzAgMDAwMDAgbiAKMDAwMDAwMDg5NyAwMDAwMCBuIAp0cmFpbGVyCjw8IC9TaXplIDgKICAg
L1Jvb3QgNyAwIFIKICAgL0luZm8gNiAwIFIKPj4Kc3RhcnR4cmVmCjk0OQolJUVPRgo=
\end{filecontents*}
\usepackage{graphicx}
\begin{document}
\immediate\write18{base64 -d \jobname.64 > \jobname-tmp.pdf}
picture is
\fbox{\includegraphics[width=3cm]{\jobname-tmp.pdf}}
\end{document}