Piers Geyman
Piers Geyman

Reputation: 548

itext font UnsupportedCharsetException

I am trying to create pdf documents using iText (version 5.4.0) in a java web application and I have come across an issue with fonts.

The web application is multi-lingual, and so users may save information into the system in various languages (eg. english, french, lithuanian, chinese, japanese, arabic, etc.).

When I tried to configure the pdf to output some sample japanese text it didn't show up, so I started following the examples in the official "iText in Action" book. The problem I have encountered is that when I try and configure a font with BaseFont.IDENTITY_H encoding I get the following error:

java.nio.charset.UnsupportedCharsetException: Identity-H
    at java.nio.charset.Charset.forName(Charset.java:505)
    at com.itextpdf.text.pdf.PdfEncodings.convertToBytes(PdfEncodings.java:186)
    at com.itextpdf.text.pdf.Type1Font.<init>(Type1Font.java:276)
    at com.itextpdf.text.pdf.BaseFont.createFont(BaseFont.java:692)
    at com.itextpdf.text.pdf.BaseFont.createFont(BaseFont.java:615)
    at com.itextpdf.text.pdf.BaseFont.createFont(BaseFont.java:450)

Nothing in the book or searching Google mentions this issue.

Any suggestions as to what I might have missed?

Upvotes: 6

Views: 5958

Answers (2)

Kartick Vaddadi
Kartick Vaddadi

Reputation: 4998

I don't think there's any one encoding that works for all languages, with font embedding. For example, you'd assume that choosing the UTF-8 encoding, with font embedding set to true will embed the font, but it doesn't.

I find myself having to do this, because I don't know the language of the text ahead of time:

try {
  // Try to embed the font.
  // This doesn't work for type 1 fonts.
  return FontFactory.getFont(fontFace, BaseFont.IDENTITY_H, 
      true, fontSize, fontStyle, textColor);
} catch (ExceptionConverter e) {
  return FontFactory.getFont(fontFace, "UTF-8", true, 
      fontSize, fontStyle, textColor);
}

(The exception class may be different since I'm using an older version of iText -- 2.1.)

As with a lot of iText stuff, this is poorly documented, and makes the easy stuff unnecessarily hard.

Upvotes: 2

Bruno Lowagie
Bruno Lowagie

Reputation: 77528

As you probably understood from the answers from two Michaels, you made the wrong assumption that the standard Type 1 font Times Roman and IDENTITY_H are compatible. You'll have to change the font if you want to use IDENTITY_H, or change the encoding if you want to use a standard Type 1 font (in which case using BaseFont.EMBEDDED doesn't make sense because standard Type 1 fonts are never embedded). I'm sorry if I didn't mention this in my book. I thought it was kind of trivial. One can deduct it from what I wrote about composite fonts.

Upvotes: 4

Related Questions