项目使用itext生成pdf,因为原有项目不容易改动,所以需要使用PdfGraphics2D来替代Graphics2D绘制内容。但是很快发现无法使用PdfGraphics2D.drawString绘制中文。
初步猜测应该是编码问题,网上搜了很多方法,都是在使用itext自身绘制文本的api时,使用BaseFont装载字体,以解决中文绘制的问题。但是这个不适合我们的情况。最终找到PdfGraphics2D的一个构造函数可以传递FontMapper,这才是解决之道。
关键部分:
FontMapper fm = new AsianFontMapper(AsianFontMapper.ChineseSimplifiedFont, AsianFontMapper.ChineseSimplifiedEncoding_H);
PdfGraphics2D pdfG = new PdfGraphics2D(pdfCB, size.getWidth(), size.getHeight(), fm);
pdfG.drawString("中文测试abc123", posX, posY);
完整示例:
FileOutputStream fo = new FileOutputStream(filePath);
Rectangle size = new Rectangle(500, 1200);
Document doc = new Document(size);
PdfWriter pdfWriter = PdfWriter.getInstance(doc, fo);
doc.open();
PdfContentByte pdfCB = pdfWriter.getDirectContent();
FontMapper fm = new AsianFontMapper(AsianFontMapper.ChineseSimplifiedFont, AsianFontMapper.ChineseSimplifiedEncoding_H);
PdfGraphics2D pdfG = new PdfGraphics2D(pdfCB, size.getWidth(), size.getHeight(), fm);
pdfG.drawString("中文测试abc123", 30, 100);
pdfG.dispose();
pdfG = null;
doc.close();
pdfWriter.close();
fo.close();
doc = null;
pdfWriter = null;
fo = null;