专栏名称: OSC开源社区
OSChina 开源中国 官方微信账号
目录
相关文章推荐
程序员的那些事  ·  趣图:当我调试其他程序员的代码之时 ·  2 天前  
OSC开源社区  ·  四名CEO ,扬言要打造新一代基础软件技术栈 ·  6 天前  
程序员的那些事  ·  微信 Linux ... ·  1 周前  
51好读  ›  专栏  ›  OSC开源社区

电子凭证 —— Java 生成 Pdf

OSC开源社区  · 公众号  · 程序员  · 2017-05-11 08:36

正文

点击图片报名上海、南京源创会 #


Java生成Pdf技术方案,通过Html模板引擎进行数据渲染,通过iText生成Pdf,通过Jpedal生成图片。解决CSS样式兼容问题,中文字体问题等。


1.背景


在某些业务场景中,需要提供相关的电子凭证,比如网银/支付宝中转账的电子回单,签约的电子合同等。方便用户查看,下载,打印。目前常用的解决方案是,把相关数据信息,生成对应的pdf文件返回给用户。



本文源码:

http://git.oschina.net/lujianing/java_pdf_demo



2.iText


iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。 


iText 官网:http://itextpdf.com/

iText 开发文档:

http://developers.itextpdf.com/developers-home


iText目前有两套版本iText5和iText7。iText5应该是网上用的比较多的一个版本。iText5因为是很多开发者参与贡献代码,因此在一些规范和设计上存在不合理的地方。iText7是后来官方针对iText5的重构,两个版本差别还是挺大的。不过在实际使用中,一般用到的都比较简单,所以不用特别拘泥于使用哪个版本。比如我们在http://mvnrepository.com/中搜索iText,出来的都是iText5的依赖。


来个最简单的例子:


添加依赖:

    com.itextpdf

    itextpdf

    5.5.11


测试代码:JavaToPdf

package com.lujianing.test;

 

import com.itextpdf.text.Document;

import com.itextpdf.text.DocumentException;

import com.itextpdf.text.Paragraph;

import com.itextpdf.text.pdf.PdfWriter;

 

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

 

/**

 * Created by lujianing on 2017/5/7.

 */

public class JavaToPdf {

 

    private static final String DEST = "target/HelloWorld.pdf";

 

 

    public static void main(String[] args) throws FileNotFoundException, DocumentException {

        Document document = new Document();

        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(DEST));

        document.open();

        document.add(new Paragraph("hello world"));

        document.close();

        writer.close();

    }

}


运行结果:




3.iText-中文支持


iText默认是不支持中文的,因此需要添加对应的中文字体,比如黑体simhei.ttf


可参考文档:

http://developers.itextpdf.com/examples/font-examples/using-fonts#1227-tengwarquenya1.java


测试代码:JavaToPdfCN

package com.lujianing.test;

 

import com.itextpdf.text.Document;

import com.itextpdf.text.DocumentException;

import com.itextpdf.text.Font;

import com.itextpdf.text.FontFactory;

import com.itextpdf.text.Paragraph;

import com.itextpdf.text.pdf.BaseFont;

import com.itextpdf.text.pdf.PdfWriter;

 

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

 

/**

 * Created by lujianing on 2017/5/7.

 */

public class JavaToPdfCN {

 

    private static final String DEST = "target/HelloWorld_CN.pdf";

    private static final String FONT = "simhei.ttf";

 

 

    public static void main(String[] args) throws FileNotFoundException, DocumentException {

        Document document = new Document();

        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(DEST));

        document.open();

        Font f1 = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

        document.add(new Paragraph("hello world,我是鲁家宁", f1));

        document.close();

        writer.close();

    }

}


输出结果:




4.iText-Html渲染


在一些比较复杂的pdf布局中,我们可以通过html去生成pdf


可参考文档:

http://developers.itextpdf.com/examples/xml-worker-itext5/xml-worker-examples


添加依赖:

    com.itextpdf.tool

    xmlworker

    5.5.11

 


添加模板:template.html

   

   

Title