最近需要写一个抽取表结构的工具,类似于powerdesigner中的表图,其中有一步用到了itext这个第三方jar包来生成pdf文件,碰到了一个问题,记录于此。
问题描述:
工程使用maven构建,pom.xml中对于jar包的定义如下:
执行BaseFont bfChinesebfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);时报错:
"Font 'STSong-Light' with 'UniGB-UCS2-H' is not recognized."
解决
1. 首先尝试替换itext的包版本,他在maven中央库的位置是/maven2/com/lowagie/itext/,最高版本是4.2.2,但尝试后发现问题依旧。
2. 注意到itext-asian的包路径是com.itextpdf,于是继续找,发现/maven2/com/itextpdf/itextpdf中有itextpdf的各个版本,从5.0.6到5.5.6。
3. 搜索一些帖子,发现itext从5.x版本开始,改名为itextpdf,符合上面(1)和(2)对应的版本号。
4. 问题可以确定了,就是上面itext-asian和itext的版本不对应,改为:
再次运行,ok了。
有些文章提到了itextasian包名未更新也会导致这个问题,但我用的5.2.0这个包,解压后看到包名是正确的,也许新版本已经改了,这点不深究了。
摘要:
参考:
http://endual.iteye.com/blog/1623327
http://blog.csdn.net/wang12/article/details/5661106
http://bbs.csdn.net/topics/390283201
- package oliver.itext.demo;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.OutputStream;
- import com.itextpdf.text.Document;
- import com.itextpdf.text.DocumentException;
- import com.itextpdf.text.Font;
- import com.itextpdf.text.Paragraph;
- import com.itextpdf.text.pdf.BaseFont;
- import com.itextpdf.text.pdf.PdfWriter;
- /**
- * <b>PDF2Chinese。</b>
- * <p><b>详细说明:</b></p>
- * <!-- 在此添加详细说明 -->
- * 三种方法解决iText中文问题。
- * <p><b>修改列表:</b></p>
- * <table width="100%" cellSpacing=1 cellPadding=3 border=1>
- * <tr bgcolor="#CCCCFF"><td>序号</td><td>作者</td><td>修改日期</td><td>修改内容</td></tr>
- * <!-- 在此添加修改列表,参考第一行内容 -->
- * <tr><td>1</td><td>Oliver</td><td>2010-10-8 上午09:40:44</td><td>建立类型</td></tr>
- *
- * </table>
- * @version 1.0
- * @author Oliver
- * @since 1.0
- */
- public class PDF2Chinese
- {
- public static void main(String[] args) throws DocumentException, IOException
- {
- Document document = new Document();
- OutputStream os = new FileOutputStream(new File("chinese.pdf"));
- PdfWriter.getInstance(document,os);
- document.open();
- //方法一:使用Windows系统字体(TrueType)
- BaseFont baseFont = BaseFont.createFont("C:/Windows/Fonts/SIMYOU.TTF",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
- //方法二:使用iTextAsian.jar中的字体
- //BaseFont baseFont = BaseFont.createFont("STSong-Light",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
- //方法三:使用资源字体(ClassPath)
- BaseFont baseFont = BaseFont.createFont("/SIMYOU.TTF",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
- Font font = new Font(baseFont);
- document.add(new Paragraph("解决中文问题了!",font));
- document.close();
- }
- }