# Embedding images in tex file as base64 strings?

A commonly asked question on this site is how to embed images directly in a .tex source file, without the need for the image to exist in a separate file. Examples of such questions (often marked as duplicate) are

Unfortunately, the answers are all quite a bit outdated. In particular,

• Many users responded (years ago) that "the user should simply not want this" and send multiple files as a zip/tar archive instead. However, in this time and age where automatic generation of .tex file becomes more frequent, and single-file text-only generation is much easier (especially when using predefined frameworks) than multifile and/or binary, that argument no longer holds.
• A package providing such functionality https://gist.github.com/mikeashley/258731 no longer exists. Another package https://github.com/zerotoc/pdfinlimg provides this functionality but only for bitmap images (png/jpg), not for svg/eps/pdf/other vector formats, and encodes it as HEX which is pretty wasteful compared to base64.

Therefore I would like to reopen this question and ask this again: how can one create a command \includebase64image such that

\includebase64image{png}{iVBORw0KGgokIA...}
\includebase64image{pdf}{weEGE2ewFWE58q...}


yields the result of \includegraphicx{a file with content type #1 and contents #2}, namely the image whose content and type are given, appearing at the current location in the generated PDF file?

## 1 Answer

If you have a command line base64 decoder (base64 -d here) and allow

pdflatex --shell-escape


to run external commands then you do not need anything other than the standard graphics package.

Here I include a base64 encoded pdf image.

\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}

• Interesting! Would command line access be necessary here? I was looking at tex.stackexchange.com/questions/8729/… where they seem able to produce binary files without special command line necessities, but I do not really understand what's happening nor manage to reproduce it properly. – user53964 Oct 24 '14 at 20:20
• @user53964 writing binary files from classic tex is impossible, with luatex it's OK, with enctex extensions on pdftex it might be possible but you'd have to set up special tcx files that allowed arbitrary bytes to be printed and really it's all very fragile, and I'm not convinced it is possible in general and write18 is rather easy (if allowed) so unless it's an absolute hard requiement that that is not allowed.... – David Carlisle Oct 24 '14 at 20:40
• Thanks @DavidCarlisle for this answer :-) I use Python for dynamically generating the LaTeX Code for publishing books/workbooks etc. Needed this for latex_code shared via API endpoints. I've created a public Github gist for this - gist.github.com/psjinx/ac0230fefe263918e627 – pankaj28843 Aug 19 '15 at 2:29