Hello,
I have a little problem with pdf file generation using PDFBox 2.0.3 and I can't
find ways to solve it ...
I have a string which is generated by using random unicode symbols (Symbol
'U+22F2' is presented in the string for example.)
and take the following exception when make some actions with this string:
Caused by: java.lang.IllegalArgumentException: No glyph for U+22F2 in font
ArialUnicodeMS
at
org.apache.pdfbox.pdmodel.font.PDCIDFontType2.encode(PDCIDFontType2.java:401)
at
org.apache.pdfbox.pdmodel.font.PDType0Font.encode(PDType0Font.java:351)
at org.apache.pdfbox.pdmodel.font.PDFont.encode(PDFont.java:316)
at
org.apache.pdfbox.pdmodel.PDPageContentStream.showText(PDPageContentStream.java:414)
It's happened when I try to embed "Arial Unicode MS" font.
I tried to find this "wrong" symbols by using
org.apache.pdfbox.pdmodel.font.PDType0Font#hasGlyph but I saw that this symbol
has glyph (It's allowed in Identity-H encoding which is used for embedded
fonts).
I see that a lot of methods use PDCIDFontType2.encode and it has strange
behavior ...
It has the following block which throw exception if cid has 0 value
if (cid == 0)
{
throw new IllegalArgumentException(
String.format("No glyph for U+%04X in font %s", unicode,
getName()));
}
I read in https://www.microsoft.com/typography/otspec/cmap.htm that "Character
codes that do not correspond to any glyph in the font should be mapped to glyph
index 0. The glyph at this location must be a special glyph representing a
missing character, commonly known as .notdef."
When I deleted this block everything work fine and I saw special glyphs in
generated pdf.
Steps to reproduce:
1. Create document
PDDocument document = new PDDocument();
2. load Arial Unicode MS font:
PDType0Font pdfFont = PDType0Font.load(document,
document.getClass().getResourceAsStream("/ttf/arialuni.ttf"));
3. be sure that symbol has glyph
int codePoint = 0x22F2;
pdfFont.hasGlyph(codePoint)
4. catch strange exception
PDCIDFontType2 pdcidFontType2 =
(PDCIDFontType2)pdfFont.getDescendantFont();
pdcidFontType2.encode(codePoint);
Do you have any suggestions to solve this problem or should I create new issue?
Example is attached.
Ivan Pavlyukovets
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]