Embedding fonts into PDF files using Ghostscript
Misc Estimated reading time: ~3 minutes
I wanted to publish my master’s thesis using the Lulu Marketplace. If you upload a PDF file to Lulu a requirement is that all fonts are embedded. I thought that this was no problem because I had configured my Latex distribtion to embed all fonts when producing PDF files (if you want to know how to do this read on here). But I was wrong.
The Lulu upload
system insisted that my PDF file did not have all fonts embedded. I used the
pdffonts
utility (it comes with Poppler)
to check if there were really some fonts missing. And Lulu was right, some
fonts were not embedded in the PDF file.
The problem was that some of the PDF figures which I included in my thesis did
not embed the used fonts themselves and pdflatex
does not embed fonts in
included PDF files. I searched the web for solutions and quickly found out that
missing fonts can be embedded into a PDF file using Ghostscript. So I tried the
various found ghostscript command lines on the PDF file of my thesis. But the
fonts of the included PDF figures were not embedded. I had to find out that
Ghostscript behaves much the same like pdflatex
when embedding fonts. Missing
fonts in “nested” PDF files are not embedded. The solution is that you have to
embed the missing fonts in the PDF figures prior to processing them with
pdflatex
. To embed missing fonts into a PDF file you can use this command:
$ gs -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=<output file> -c ".setpdfwrite <</NeverEmbed [ ]>> setdistillerparams" -f <input file>
After I have used this command on all my PDF figures and reran pdflatex
Lulu
accepted my master’s thesis. This command line is pretty cryptic so I will
loose a few words about it. You can either directly use a command called
ps2pdf
or use gs with the correct options. That’s how I did it. ps2pdf
is
just a script which calls ps2pdf12
, ps2pdf13
or ps2pdf14
which in turn
finally invoke the gs
program with some specific options set. In summary, the
used options cause Ghostscript to produce a PDF file from the input and to
immeditely return after it has finished. To understand the used ghostscript
command one has to check various manuals:
- Documentation of the Acrobat Distiller 5 parameters: The ps2pdf utility from Ghostscript 8 vastly corresponds to Acrobat Distiller 5. Though the documentation of ps2pdf lists all the supported Acrobat Distiller 5 parameters and their default values the parameters itself are not described. An explanation of the parameters can only be found in the Adobe document about the Acrobat Distiller Parameters for version 5.
- Documentation of the ps2pdf command: As already
mentioned, the
ps2pdf
utility is a work-alike for nearly all the functionality (but not the user interface) of Adobe’s Acrobat Distiller product (it converts PostScript files to PDF files). The Ghostscript options which are specific to the handling of PDF files are documented in this document. - Documentation of the gs program: This document documents the generic Ghostscript options.
When the default PDF profile is used (ps2pdf
option -dPDFSETTINGS
) only one
thing has to be changed in order for all fonts to be embedded. Parameters like
EmbedAllFonts
or SubsetFonts
are already correctly set. The only exception
is the NeverEmbed
parameter. This is an array which specifies which fonts
will never be embedded. When using the default, screen or ebook PDF profile it
includes the 14 standard fonts (Courier, Helvetica, and Times families, Symbol,
and ZapfDingbats). The NeverEmbed array can not be specified on the command
line. To specify it you must use PostScript by passing the -c command-line
parameter to ghostscript as described.
A note about Netcup (advertisement)
Netcup is a German hosting company. Netcup offers inexpensive, yet powerfull web hosting packages, KVM-based root servers or dedicated servers for example. Using a coupon code from my Netcup coupon code web app you can even save more money (6$ on your first purchase, 30% off any KVM-based root server, ...).