zoukankan      html  css  js  c++  java
  • java根据模板导出PDF(利用itext)

    一、制作模板

        1.下载Adobe Acrobat 9 Pro软件(pdf编辑器),制作模板必须使用该工具。

        2.下载itextpdf-5.5.5.jar、itext-asian-5.2.0.jar两个jar包。(说明:itextpdf-5.5.5.jar用于操作pdf;itext-asian-5.2.0.jar用于pdf中文处理)

        3.新建word文档,根据项目需求制作模板,然后另存为pdf格式的文件。

        4.Adobe Acrobat 9 Pro软件打开pdf模板文件,点击‘‘表单’’--“启动表单向导”--引入pdf模板文件--添加表单域或者在自动识别的表单域设置表单域名称。设置完成后保存pdf模板。

     模板设置如图所示:

      

       最终的模板如下所示:

    二、java代码

    package test;
    
    import java.io.ByteArrayOutputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Map;
    
    import com.itextpdf.text.Document;
    import com.itextpdf.text.DocumentException;
    import com.itextpdf.text.pdf.AcroFields;
    import com.itextpdf.text.pdf.BaseFont;
    import com.itextpdf.text.pdf.PdfCopy;
    import com.itextpdf.text.pdf.PdfImportedPage;
    import com.itextpdf.text.pdf.PdfReader;
    import com.itextpdf.text.pdf.PdfStamper;
    /**
     * 根据模板导出pdf(多页)
     * @author lyc
     *
     */
    public class TestPdf7 {
        // 利用模板生成pdf
            public static void fillTemplate() {
                // 模板路径
                String templatePath = "C:/Users/lyc/Desktop/proposalTemplate8.pdf";
                // 生成的新文件路径
                String newPDFPath = "C:/Users/lyc/Desktop/ceshi111.pdf";
                PdfReader reader;
                FileOutputStream out;
                ByteArrayOutputStream bos;
                PdfStamper stamper;
                try {
                    out = new FileOutputStream(newPDFPath);// 输出流
                    reader = new PdfReader(templatePath);// 读取pdf模板
                    bos = new ByteArrayOutputStream();
                    stamper = new PdfStamper(reader, bos);
                    AcroFields form = stamper.getAcroFields();
                    /*使用中文字体 */   
                    /*BaseFont bf = BaseFont.createFont(PDFTicket.class.getResource("/") +"org/csun/ns/util/simsun.ttc,1",   
                    BaseFont.IDENTITY_H,BaseFont.EMBEDDED);*/  
                    //BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
                    
                    BaseFont bf = BaseFont.createFont("C:/Windows/Fonts/simsun.ttc,1",   
                            BaseFont.IDENTITY_H,BaseFont.EMBEDDED);
                    ArrayList<BaseFont> fontList = new ArrayList<BaseFont>();   
                    fontList.add(bf);   
                    
    
                    form.setSubstitutionFonts(fontList);
                    //String[] str = { "123456789", "TOP__ONE", "男", "1991-01-01", "130222111133338888", "河北省保定市","nishi" };
                    //String[] str = { "123456789", "TOP__ONE", "22", "1991-01-01", "130222111133338888", "333","nishi" };
                    Map<String,Object> map = new HashMap<String,Object>();
                    init(map);
                    //int i = 0;
                    java.util.Iterator<String> it = form.getFields().keySet().iterator();
                    while (it.hasNext()) {
                        String name = it.next().toString();
                        System.out.println(name);
                        //form.setField(name, map.get(name).toString());
                        form.setField(name, "aa");
                    }
                    stamper.setFormFlattening(true);// 如果为false那么生成的PDF文件还能编辑,一定要设为true
                    stamper.close();
    
                    Document doc = new Document();
                    PdfCopy copy = new PdfCopy(doc, out);
                    doc.open();
                    int pageNum = reader.getNumberOfPages(); //pdf模板总页数
                    for(int i = 1;i <= pageNum;i++){
                        PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), i);
                        copy.addPage(importPage);
                    }
                    
                    doc.close();
    
                } catch (IOException e) {
                    e.printStackTrace();
                    System.out.println(1);
                } catch (DocumentException e) {
                    e.printStackTrace();
                    System.out.println(2);
                }
    
            }
    
            private static void init(Map<String, Object> map) {
                //String[] str = { "123456789", "刘向南", "男", "1991-01-01", "130222111133338888", "河北省保定市","nishi" };
                map.put("reversionId", "0009198181");
                map.put("proposalNo", "8324735439");
                map.put("proposalStatus", "拒保");
                map.put("riskName", "尊享人生");
                map.put("baozhang", "20年");
                map.put("jiaofei", "趸交");
                map.put("jine", "100000美元");
                map.put("baofei", "3421美元");
                map.put("xing1", "张");
                map.put("ming1", "三");
                map.put("pinyin", "ZHANG SAN");
                map.put("sex", "男");
                map.put("xing2", "张");
                map.put("ming2", "小六");
                map.put("xing3", "张");
                map.put("ming3", "三");
                map.put("company", "仁福香港保险中介有限公司");
                map.put("area", "西北财富管理事业部");
                map.put("dept", "第一营业部");
    
                
            }
    
            public static void main(String[] args) {
                fillTemplate();
            }
    
    }

    导出pdf文件如下所示:

    此处是main方法测试,如果应用到web项目中可参考下面的代码(与上面的代码几乎一致,加了响应另存为处理,导出pdf就会出现弹框):

    package com.test.www.web.controller;
    
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.io.UnsupportedEncodingException;
    import java.net.URLEncoder;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.Map;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.ModelMap;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import com.itextpdf.text.Document;
    import com.itextpdf.text.DocumentException;
    import com.itextpdf.text.pdf.AcroFields;
    import com.itextpdf.text.pdf.BaseFont;
    import com.itextpdf.text.pdf.PdfCopy;
    import com.itextpdf.text.pdf.PdfImportedPage;
    import com.itextpdf.text.pdf.PdfReader;
    import com.itextpdf.text.pdf.PdfStamper;
    
    @RequestMapping("/test1")
    @Controller
    public class TestPdfController_c {
        @RequestMapping("/testpdf")
        public void testpdf(
                HttpServletRequest request,
                HttpServletResponse response,
                ModelMap map) throws UnsupportedEncodingException{
            // 设置响应头,控制浏览器下载该文件
            response.setHeader("content-disposition", "attachment;filename="
                    + URLEncoder.encode("投保单详情.pdf", "UTF-8"));
            // 模板路径
            String templatePath = "C:/Users/lyc/Desktop/proposalTemplate8.pdf";
            // 生成的新文件路径
            //String newPDFPath = "C:/Users/lyc/Desktop/ceshi5.pdf";
            PdfReader reader;
            //FileOutputStream out;
            ByteArrayOutputStream bos;
            PdfStamper stamper;
            try {
                //out = new FileOutputStream(newPDFPath);// 输出流
                reader = new PdfReader(templatePath);// 读取pdf模板
                bos = new ByteArrayOutputStream();
                stamper = new PdfStamper(reader, bos);
                AcroFields form = stamper.getAcroFields();
                /*使用中文字体 */   
                /*BaseFont bf = BaseFont.createFont(PDFTicket.class.getResource("/") +"org/csun/ns/util/simsun.ttc,1",   
                BaseFont.IDENTITY_H,BaseFont.EMBEDDED);*/  
                //BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
                /*BaseFont bf = BaseFont.createFont("C:/Windows/Fonts/simsun.ttc,1",   
                        BaseFont.IDENTITY_H,BaseFont.EMBEDDED);*/
                /**
                 * PDF   Font   Name已设为STSong-Light(宋体),在PDF   Encoding中已选择GB-UCS2-H(Chinese   Simplified); 
                 * 导出pdf中文显示问题
                 */
                BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
                ArrayList<BaseFont> fontList = new ArrayList<BaseFont>();   
                fontList.add(bf);   
                form.setSubstitutionFonts(fontList);
                
                Map<String,Object> mapInfo = new HashMap<String,Object>();
                init(mapInfo);
                //int i = 0;
                java.util.Iterator<String> it = form.getFields().keySet().iterator();
                while (it.hasNext()) {
                    String name = it.next().toString();
                    System.out.println(name);
                    //form.setField(name, "aa"); //mapInfo.get(name).toString()
                    form.setField(name, mapInfo.get(name).toString());
    
                }
                stamper.setFormFlattening(true);// 如果为false那么生成的PDF文件还能编辑,一定要设为true
                stamper.close();
                
                // 创建输出流
                OutputStream out = response.getOutputStream();
                Document doc = new Document();
                PdfCopy copy = new PdfCopy(doc, out);
                //PdfWriter.getInstance(doc, out);
    
                doc.open();
                int pageNum = reader.getNumberOfPages(); //pdf模板总页数
                for(int i = 1;i <= pageNum;i++){
                    PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), i); //第i页
                    copy.addPage(importPage);
                }
                doc.close();
    
                //byte[] content = bos.toByteArray();
                //out.write(content);
                //FileInputStream in = content;
                /*doc.add(new Paragraph("Hello Kiran"));
                doc.add(new Paragraph(new Date().toString()));
                byte[] content = bos.toByteArray();*/
    
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println(1);
            } catch (DocumentException e) {
                e.printStackTrace();
                System.out.println(2);
            }
            
            
        }
        
        private static void init(Map<String, Object> map) {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            //String[] str = { "123456789", "刘向南", "男", "1991-01-01", "130222111133338888", "河北省保定市","nishi" };
            map.put("reversionId", "0009198181");
            map.put("proposalNo", "8324735439");
            map.put("proposalStatus", "拒保");
            map.put("riskName", "尊享人生");
            map.put("baozhang", "20年");
            map.put("jiaofei", "趸交");
            map.put("jine", "100000美元");
            map.put("baofei", "3421美元");
            map.put("xing1", "张");
            map.put("ming1", "三");
            map.put("pinyin", "ZHANG SAN");
            map.put("sex", "男");
            map.put("xing2", "张");
            map.put("ming2", "小六");
            map.put("xing3", "张");
            map.put("ming3", "三");
            map.put("company", "仁福香港保险中介有限公司");
            map.put("area", "西北财富管理事业部");
            map.put("dept", "第一营业部");
            map.put("date", sdf.format(new Date()));
        }
    }
  • 相关阅读:
    如何在。net中扩展本机消息框对话框
    一个显示角色映射的对话框
    键盘消息/加速器处理MFC对话框的应用程序
    立即显示WinForms使用如图所示()事件
    XFontDialog——定制CFontDialog第一部分:添加字体过滤器
    一个动画风格的对话框类
    类似vista的任务对话框
    简单而强大的可调整大小的对话框
    /etc/hosts
    /etc/sysconfig/network-scripts/ifcfg-ensxx
  • 原文地址:https://www.cnblogs.com/super-chao/p/7880693.html
Copyright © 2011-2022 走看看