itext font UnsupportedCharsetException

匿名 (未验证) 提交于 2019-12-03 00:59:01

问题:

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?

回答1:

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.



回答2:

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.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!