IText PDF简单示例

package com.exe.learn.demo.itextpdf;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.nio.charset.Charset;
import java.util.Map;

import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;

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 com.itextpdf.tool.xml.XMLWorkerFontProvider;
import com.itextpdf.tool.xml.XMLWorkerHelper;

import freemarker.template.Configuration;
import freemarker.template.Template;

public class ITextPdfDemo {

    private static final String DEST = "target/demo.pdf";
    private static final String FONT = "simhei.ttf";
    private static final String HTML = "template.html";
    private static final String FREEMARKET = "template_freemarker.html";
    private static final String PNG_PATH = "ukey4.png";
    private static final String FREEMARKETFS = "template_freemarker_fs.html";
    
    
    private static Configuration freemarkerCfg = null;
    
    static {
        freemarkerCfg =new Configuration();
        try {
            freemarkerCfg.setDirectoryForTemplateLoading(new File(getTemplateDir()));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) throws Exception {
        
        //中文内容写入PDF
        //chnPdfWrite();
        
        //使用HTML模板生成PDF
//        templateHtmlPdf();
        
        //使用freemarket模板生成PDF
        /*Map<String,Object> data = new HashMap<String, Object>();
        data.put("name","黑道秋水");
        String content = ITextPdfDemo.freeMarkerRender(data, FREEMARKET);
        ITextPdfDemo.createPdf(content, DEST);*/
        
        
        /*Map<String,Object> data = new HashMap();
        data.put("name","鬼彻");
        String content = ITextPdfDemo.freeMarkerRender(data, FREEMARKETFS);
        ITextPdfDemo.createPngPdf(content,DEST);*/
        
        
    }
    
    /**
     * 获取resources目录 
     */
    private static String getTemplateDir() {
        int index = propertiesFilePath(FREEMARKET).substring(1).lastIndexOf("/");
        return propertiesFilePath(FREEMARKET).substring(1).substring(0, index + 1);
    }
    
    /**
     * 填充freemarket数据
     */
    public static String freeMarkerRender(Map<String, Object> data, String htmlTmp) {
        Writer out = new StringWriter();
        try {
            // 获取模板,并设置编码方式
            Template template = freemarkerCfg.getTemplate(htmlTmp);
            template.setEncoding("UTF-8");
            // 合并数据模型与模板
            template.process(data, out);
            out.flush();
            return out.toString();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                out.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
        return null;
    }
    
    /**
     * 创建PDF文件
     */
    public static void createPdf(String content,String dest) throws IOException, DocumentException {
        Document document = new Document();
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));
        document.open();
        XMLWorkerFontProvider fontImp = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
        fontImp.register(FONT);
        XMLWorkerHelper.getInstance().parseXHtml(writer, document,new ByteArrayInputStream(content.getBytes()), null, Charset.forName("UTF-8"), fontImp);
        document.close();
  
    }
    
    
    
    /**
     * 带有中文的内容写入PDF
     */
    private static void chnPdfWrite() 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("ITextPdf demo, pdf中文示例", f1));
        document.close();
        writer.close();
    }
    
    /**
     * 获取项目中的resources文件路径
     * @return
     */
    private static String propertiesFilePath(String fileName) {
        return ITextPdfDemo.class.getClassLoader().getResource(fileName).getPath();
    }
    
    /**
     * 使用hmtl模板文件生成PDF
     */
    private static void templateHtmlPdf() throws FileNotFoundException, IOException, DocumentException {
        Document document = new Document();
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(DEST));
        document.open();
        XMLWorkerFontProvider fontImp = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
        fontImp.register(FONT);
        XMLWorkerHelper.getInstance().parseXHtml(writer, document,new FileInputStream(propertiesFilePath(HTML)), null, Charset.forName("UTF-8"), fontImp);
        document.close();
    }
    
    
    public static void createPngPdf(String content,String dest) throws IOException, DocumentException, com.lowagie.text.DocumentException {
        ITextRenderer render = new ITextRenderer();
        ITextFontResolver fontResolver = render.getFontResolver();
        fontResolver.addFont(FONT, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        render.setDocumentFromString(content);
        render.getSharedContext().setBaseURL("file://" + propertiesFilePath(PNG_PATH).substring(1));
        render.layout();
        render.createPDF(new FileOutputStream(dest));
    }
    
}

<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.11</version>
</dependency>
<dependency>
<groupId>com.itextpdf.tool</groupId>
<artifactId>xmlworker</artifactId>
<version>5.5.11</version>
</dependency>
<!-- freemarket support itext -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.19</version>
</dependency>

<!-- itext insert pic -->
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-pdf</artifactId>
<version>9.1.5</version>
</dependency>
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-pdf-itext5</artifactId>
<version>9.1.5</version>
</dependency>

 

使用itext生成PDF示例:中文内容生成PDF、HTML方式生成PDF、freemarket方式生成PDF、PDF插入图片

posted @ 2018-09-07 09:54  秋水秋色  阅读(1265)  评论(0编辑  收藏  举报