itext解决中文字体

最近需要写一个抽取表结构的工具,类似于powerdesigner中的表图,其中有一步用到了itext这个第三方jar包来生成pdf文件,碰到了一个问题,记录于此。

 

问题描述:

工程使用maven构建,pom.xml中对于jar包的定义如下:

[java]  view plain  copy
  1. <span style="font-family:'Microsoft YaHei';font-size:14px;"><dependency>  
  2.    <groupId>com.lowagie</groupId>  
  3.    <artifactId>itext</artifactId>  
  4.    <version>2.1.7</version>  
  5.   </dependency>  
  6.   <dependency>  
  7.    <groupId>com.itextpdf</groupId>  
  8.    <artifactId>itext-asian</artifactId>  
  9.    <version>5.2.0</version>  
  10.   </dependency>  
  11. </span>  

执行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的版本不对应,改为:

[java]  view plain  copy
  1. <span style="font-family:'Microsoft YaHei';font-size:14px;"><dependency>  
  2.     <groupId>com.itextpdf</groupId>  
  3.     <artifactId>itextpdf</artifactId>  
  4.     <version>5.4.3</version>  
  5. </dependency></span>  

再次运行,ok了。

有些文章提到了itextasian包名未更新也会导致这个问题,但我用的5.2.0这个包,解压后看到包名是正确的,也许新版本已经改了,这点不深究了。

摘要:

[java]  view plain  copy
  1. <span style="font-family:'Microsoft YaHei';font-size:14px;">找到CJKFont类, 从中看到   
  2.    InputStream is = getResourceStream(RESOURCE_PATH + "cjkfonts.properties");   
  3.    cjkFonts.load(is);   
  4.    is.close();   
  5.    is = getResourceStream(RESOURCE_PATH + "cjkencodings.properties");   
  6.    cjkEncodings.load(is);   
  7.    is.close(); </span>  
[java]  view plain  copy
  1. <span style="font-family:'Microsoft YaHei';font-size:14px;">他的font和encoding文件都是从String RESOURCE_PATH = "com/itextpdf/text/pdf/fonts/"; 这里加载的,而老itextasian.jar的包名是com.lowagie.text.pdf.fonts, 应该是包名重新命名了, 而没有及时更新itextasian.jar, 改了一下itextasian.jar包路径, 重新运行程序, OK,搞定.   
  2.   
  3. ×××××××××××××××××××××××××××××××××××××××××××  
  4.   
  5. 更改iTextAsian.jar包名的方法如下  
  6. 1)使用winrar解压缩程序将原来的iTextAsian.jar解压,目录结构如下  
  7.   iTextAsian  
  8.       --com  
  9.          --lowagie  
  10.            --text  
  11.              --pdf  
  12.                --fonts  
  13.                  --...(字体属性文件)  
  14. 2)将加压后com目录下的包名lowagie更改为itextpdf  
  15. 3)在命令行转至iTextAsian目录,重新打包为iTextAsian.jar文件  
  16.   命令如下:  
  17.   jar cvf iTextAsian.jar com/itextpdf/text/pdf/fonts/*  
  18.   执行后,将新的iTextAsian.jar加入到classpath路径</span>  

 

参考:

http://endual.iteye.com/blog/1623327

http://blog.csdn.net/wang12/article/details/5661106

http://bbs.csdn.net/topics/390283201

















  1. package oliver.itext.demo;    
  2. import java.io.File;    
  3. import java.io.FileOutputStream;    
  4. import java.io.IOException;    
  5. import java.io.OutputStream;    
  6. import com.itextpdf.text.Document;    
  7. import com.itextpdf.text.DocumentException;    
  8. import com.itextpdf.text.Font;    
  9. import com.itextpdf.text.Paragraph;    
  10. import com.itextpdf.text.pdf.BaseFont;    
  11. import com.itextpdf.text.pdf.PdfWriter;    
  12. /**  
  13.  * <b>PDF2Chinese。</b>  
  14.  * <p><b>详细说明:</b></p>  
  15.  * <!-- 在此添加详细说明 -->  
  16.  * 三种方法解决iText中文问题。  
  17.  * <p><b>修改列表:</b></p>  
  18.  * <table width="100%" cellSpacing=1 cellPadding=3 border=1>  
  19.  * <tr bgcolor="#CCCCFF"><td>序号</td><td>作者</td><td>修改日期</td><td>修改内容</td></tr>  
  20.  * <!-- 在此添加修改列表,参考第一行内容 -->  
  21.  * <tr><td>1</td><td>Oliver</td><td>2010-10-8 上午09:40:44</td><td>建立类型</td></tr>  
  22.  *   
  23.  * </table>  
  24.  * @version 1.0  
  25.  * @author Oliver  
  26.  * @since 1.0  
  27.  */    
  28. public class PDF2Chinese    
  29. {    
  30.     public static void main(String[] args) throws DocumentException, IOException    
  31.     {    
  32.         Document document = new Document();    
  33.         OutputStream os = new FileOutputStream(new File("chinese.pdf"));    
  34.         PdfWriter.getInstance(document,os);    
  35.         document.open();    
  36.         //方法一:使用Windows系统字体(TrueType)    
  37.         BaseFont baseFont = BaseFont.createFont("C:/Windows/Fonts/SIMYOU.TTF",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);    
  38.             
  39.         //方法二:使用iTextAsian.jar中的字体    
  40.         //BaseFont baseFont = BaseFont.createFont("STSong-Light",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);    
  41.             
  42.         //方法三:使用资源字体(ClassPath)    
  43.         BaseFont baseFont = BaseFont.createFont("/SIMYOU.TTF",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);    
  44.             
  45.         Font font = new Font(baseFont);    
  46.         document.add(new Paragraph("解决中文问题了!",font));    
  47.         document.close();    
  48.     }    
  49. }    

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
iText 7是一款用于操作PDF的开源库,可以在多种不同的操作系统上使用,包括Linux。如果在使用iText 7在Linux上导出PDF时出现了文字字体空白的问题,可能是由于以下原因导致的: 1. 缺少中文字体: Linux系统默认情况下可能没有安装中文字体,这会导致在PDF中显示的文字出现空白。解决方法是在Linux系统上安装中文字体,例如通过执行命令 "apt-get install fonts-wqy-zenhei" 来安装文泉驿正黑字体。 2. 字体路径设置不正确:在使用iText 7时需要正确设置字体路径,确保能够找到所需的中文字体文件。可以通过使用setFont方法来设置字体路径和字体名称,例如: Font font = FontFactory.getFont("/path/to/font.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 或者 fontProvider.addFont("/path/to/font.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); 这样可以确保在导出PDF时能够正确地使用中文字体。 3. 字体嵌入设置不正确:可能在导出PDF时没有将中文字体正确地嵌入到PDF文件中。可以通过设置字体的嵌入模式来解决此问题,例如: font.setSubset(false); // 设置不进行字体子集化,将整个字体嵌入到PDF中。 这些可能是导致iText 7在Linux上导出PDF中文字体空白的常见问题和解决方法。根据具体的情况,可能需要根据以上涉及到的步骤进行检查和调整,以确保在Linux上正确地显示和嵌入中文字体

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值