Mark Stephens Mark has been working with Java and PDF since 1999 and is a big NetBeans fan. He enjoys speaking at conferences. He has an MA in Medieval History and a passion for reading.

Interesting Java bugs – Not all TTF fonts work in Java

1 min read

I debugged a very tricky font issue today which is interesting because it covers a lot of font issues. So let me explain…

In theory a PDF font should embed all fonts (ie include the font data in the PDF file) unless it is one of the 8 font families the PDF file format includes (ie arial, courier, etc). But it does not enforce this so sometimes we can just have a random fonts in the PDF (say OCRB) with no information about it.

So how do we handle this case (especially in Java)?

Here is what we do if the font is not embedded.

1. See if there is a font file with the same name (ie OCRB.ttf or OCRB.otf) in the machines local font folder (ie C:/win/fonts on Windows, /Library/fonts on Mac).

2. See if the user has  setup any aliases (ie use ArialMT.tff for this font).

3. Ask Java if it has a font with this name and get Java to display it.

4. Use Lucida in Java to display it.

It turned out that on the machines having problems, the user had actually installed the font into the machine locally, which put a font file called OCRB______.ttf in the fonts sub-directory and also added the font OCRB to the list of fonts available to Java. So what happens on these machines was

1. No font called OCRB.tff to match

2. No alias

3. Ask Java if the font exists – yes it does. So we ask Java to display it. While Java has a font called OCRB, Java cannot actually use it. So we see no text.

When the user manually renamed the font to OCRB what then happens is it works. The pattern is now:-

1. Match on OCRB.tff and it works in our renderer.

To avoid renaming the file, we have the ability to set aliases, so we add to our code

FontMappings.setFontReplacements();           FontMappings.setSubstitutedFontAliases(“OCRB___”,new String[]{“OCRB”,”OCRBNEW”});

This means that the mapping is

1. No font called OCRB.tff to match

2. But we do have OCRB_____.ttf which we use for OCRB and OCRB

And if OCRB is not installed, we go to Lucida on stage 4.

The issue is that OCRB does not work with Java’s own font engine but it does with our font decoder (probably a CMAP issue).

There is still an issue that because the fonts are not embedded, the PDF will only view exactly as expected if you have your local machine setup which is really a flaw with Adobe not enforcing the PDF file spec…

This post is part of our “Fonts Articles Index” in these articles we explore Fonts.



Are you a Developer working with PDF files?

Our developers guide contains a large number of technical posts to help you understand the PDF file Format.

Do you need to solve any of these problems?

Display PDF documents in a Web app
Use PDF Forms in a web browser
Convert PDF Documents to an image
Work with PDF Documents in Java
Mark Stephens Mark has been working with Java and PDF since 1999 and is a big NetBeans fan. He enjoys speaking at conferences. He has an MA in Medieval History and a passion for reading.

WOFF 2.0: What is it, why is it coming,…

WOFF 2.0 is working its way towards being a standard recommended by the W3C, so it seems like a good time to look at...
Sam Howard
2 min read

Web fonts: A quick introduction to Wrapper and Glyph…

I was planning to write about WOFF 2.0 this week, and wanted to link to a previous article I’d written which explains the structure...
Sam Howard
1 min read