iText使用总结:
中文乱码
方案1:
本方案需要下载iTextAsian.jar包来导入中文字体
BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
com.lowagie.text.Font cnFont = new com.lowagie.text.Font(bfChinese, 12, com.lowagie.text.Font.NORMAL);
Paragraph paragraph = new Paragraph("你好", cnFont);
方案2:
直接指定中文字体所在的路径,如下所示:
font = new Font(BaseFont.createFont("/usr/share/fonts/truetype/simsun.ttc,1",BaseFont.IDENTITY_H, BaseFont.EMBEDDED));
方案2的兼容性不是很好,建议采用方案1。
【注意】
如果iText版本在5.0以上,在导入iTextAsian.jar后会出现如下所示的异常:
Font 'STSong-Light' with 'UniGB-UCS2-H' is not recognized.
原因:
iText5以上就改了命名空间了。是 com/itextpdf/text/pdf/fonts/
但是iTextAsian还没有改。他的命名空间是 com/lowagie/text/pdf/fonts/
因此会报错。
解决方法:
1.用winrar解压iTextAsian.jar;
2. 将com文件夹下面的lowagie 修改为itextpdf;
3.进入cmd . 切换到iTextAsian目录;
4.执行命令 jar cvf iTextAsian.jar com/itextpdf/text/pdf/fonts/* ;
5.将生成的iTextAsian.jar文件替换原来的。
生成带图片的PDF(与JFreeChart相结合)
在项目中需要将JFreeChart生成的图表导出到PDF或word中,这时就需要JFreeChart 和iText相结合来使用了。
方案1:
JFreeChart生成图表后,对图表进行保存;
iText对上一步保存的图片进行读取,然后再将其写入PDF或Word中。
此种方案就内存和CPU消耗大,频繁的进行IO操作也会对磁盘产生影响,影响效率,因此不采用。
方案2:
代码如下:
Document document = new Document();
document.open();
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(filePath));
PdfContentByte cb = writer.getDirectContent();
PdfTemplate tp = cb.createTemplate(width, height);
Rectangle2D r2d = new Rectangle2D.Double(0, 0, width, height);
JFreeChart pieChart = ChartFactory.createPieChart();
Graphics2D g2d = tp.createGraphics(width, height, new DefaultFontMapper());
pieChart.draw(g2d, r2d);
Image image = Image.getInstance(tp);
在采用以上方案时,消耗内存较多,在数据量较大时,会出现内存溢出的状况;
频繁的进行绘制操作,影响效率。
方案3
代码如下:
JFreeChart pieChart = ChartFactory.createPieChart();
BufferedImage bufferedImage = pieChart.createBufferedImage(width, height);
Image lcImage = Image.getInstance((java.awt.Image) bufferedImage, null);
此方案较为简单,代码量少;
内存消耗较少,数据量较大时,不会出现内存溢出的状况;
经测试,在iText5.0以上版本中能够正常运行;
减少一些耗时的操作,推荐采用。
生成带图片的Word(与JFreeChart相结合)
生成带图片的word文件与生成PDF操作类似,但也不完全相同。
iText在对Word支持上稍弱,在最近的版本中更是将对word的操作封装成一个单独的类库,在使用上较为繁琐,因此在使用iText导出word文档时,采用的是iText2.0.8版本。
iText2.0.8版本在对word的支持上稍弱,在使用上与生成PDF方案稍有不同。
JFreeChart pieChart = ChartFactory.createPieChart();
BufferedImage bi = pieChart.createBufferedImage(width, height);
ByteArrayOutputStream out = new ByteArrayOutputStream();
ImageIO.write(bi, "png", out);
byte[] data = out.toByteArray();
Image scImage = Image.getInstance(data);
【注意】
如果使用生成PDF那套方案对BufferedImag进行强制转换,转换成的Image在导出的Word文件中显示不了,因此需要借助ImageIO将BufferedImage转换成byte[],然后再将byte[] 转换为Image;
需要注意的是,在 ImageIO.write(bi, “png”, out) 这一步中,中间的参数为生成的图片的类型,这里采用的是png,而不是jpg,如果采用的是jpg格式的话,在导出的word文件中,图片的颜色会发生变化,但是png格式的话,输出的图片不会出现上述问题,这一点值得注意。