Java使用Freemarker和iText生成PDF文件

项目里需要实现客户下载pdf文件的一个需求,在经过比较之后决定使用Freemarker+iText解决这个问题。在整个实现过程中遇到不少问题,总结一下贴出来吧,也许今后用得上。

 

使用的jar:iText2.0.8、core-renderer、iTextAsian

问题1:iText的版本问题

           最初使用的是iText 2.1.7版本,但是发现这句话总是会报错,具体报错就不贴了,记得是无法找到一个方法

          

Java代码   收藏代码
  1. ITextRenderer renderer = new ITextRenderer();  

          后来换了2.0.8以后这个问题不在出现,也许是和其他jar有冲突吧。

          iTextAsian是解决中文和日文输出的问题。

 

问题2:字体样式

      看到网上有不少讨论这个问题的帖子,使用这两个技术时,感觉蛮简单

 

      在后台:

Java代码   收藏代码
  1. ITextFontResolver fontResolver = renderer.getFontResolver();  
  2. fontResolver.addFont(fontDir1, BaseFont.IDENTITY_H,  
  3.             BaseFont.NOT_EMBEDDED);  
  4. fontResolver.addFont(fontDir2, BaseFont.IDENTITY_H,  
  5.             BaseFont.NOT_EMBEDDED);  

     另外在freemarker中,使用css加上字体即可:

 

Java代码   收藏代码
  1. body {  
  2.     font-family: SimSun;        
  3.     font-size:14px;       
  4.     font-style:italic;   
  5.     font-weight:500;  
  6. }  
  7.   
  8. .heiti  
  9. {  
  10.    font-family: simsun-bold;     
  11. }  

 

 

问题3:图片问题

     之前生成的pdf总是无法显示图片,无论把图片放在ftl文件的什么位置,在ftl中写什么样子的路径都不好使,

问题解决

Java代码   收藏代码
  1. renderer.setDocumentFromString(str);  
  2.               
  3. // 解决图片的相对路径问题     
  4. renderer.getSharedContext().setBaseURL("file:/D:/images/");   
Java代码   收藏代码
  1.     
  2. renderer.layout();  
  3. renderer.createPDF(os);  
  4. os.close();  

   当然这里的路径最好设置为资源文件中的值,这样在上线后即便修改也无需重新部署。

 

你可能感兴趣的:(Java使用Freemarker和iText生成PDF文件)