java pdf导出报表工具类

java pdf导出报表工具类

一、描述
       pdf导出报表工具,需要的jar包:itextpdf-5.1.2.jar 和 itext-asian-5.1.1.jar(解决中文乱码),需要转成pdf模板工具:Adobe Acrobat软件(制作pdf模板)。

二、代码实现

package com.lanshen.utils.lsjavaUtils;

import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
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;

/**
 * Created by Lanshen on 2019/11/29.
 *  * pdf导出报表工具
 * 需要的jar包:itextpdf-5.1.2.jar 和 itext-asian-5.1.1.jar(解决中文乱码)
 * 需要转成pdf模板工具:Adobe Acrobat软件(制作pdf模板)
 */
public class lsexitPdfUtils {

    /**
     * 利用模板生成pdf
     * @param map 模板中填充的参数值
     * @param fileName 导出的文件名
     * @param request
     */
    public static void createPdf(Map<String, String> map,String fileName,HttpServletRequest request) throws DocumentException, IOException{

        //获取根路径
        String realPath = request.getSession().getServletContext().getRealPath("");
        //模板路径
        String beginfile=realPath+"WebContent\\modelfiles\\aaa.pdf";
        //生成的新文件路径
        String endfile=realPath+"WebContent\\upload\\"+fileName;
        PdfReader reader;
        FileOutputStream outputStream;
        ByteArrayOutputStream byteArrayOutputStream;
        PdfStamper pdfStamper;

        //系统自带的字库,解决中文是否全解释可见
        BaseFont baseFont = BaseFont.createFont("C:/WINDOWS/Fonts/SIMSUN.TTC,1",BaseFont.IDENTITY_H, BaseFont.EMBEDDED);

        //pdf自带的字库
        //BaseFont baseFont = BaseFont.createFont("STSong-Light","UniGB-UNS2-H",BaseFont.NOT_EMBEDDED);
        //Font font = new Font(baseFont,12,Font.BOLD);

        try{
            //把输出流输出到目标文件上
            outputStream=new FileOutputStream(endfile);

            //通过pdf读工具读取模板文件的信息
            reader=new PdfReader(beginfile);

            //获取模板文件中的页数
            int pagecount = reader.getNumberOfPages();

            byteArrayOutputStream=new ByteArrayOutputStream();

            //创建pdf读对象
            pdfStamper=new PdfStamper(reader,byteArrayOutputStream);

            //获取模板pdf文件中区域对象
            AcroFields acroFields = pdfStamper.getAcroFields();

            //添加文字样式
            acroFields.addSubstitutionFont(baseFont);

            //取出所有的key值
            Set<String> keys = map.keySet();

            //遍历出key值,并对应找出value值,并动态写入到pdf中
            for(String key : keys){
                //动态对应模板中的name值写入内容
                if("name".equals(key.toString())){
                    String name = map.get(key.toString()).toString();
                    acroFields.setField("name",name);
                }

                if("sex".equals(key.toString())){
                    String sex = map.get(key.toString()).toString();
                    acroFields.setField("sex",sex);
                }

                if("tel".equals(key.toString())){
                    String tel = map.get(key.toString()).toString();
                    acroFields.setField("tel",tel);
                }

                if("mobile".equals(key.toString())){
                    String mobile = map.get(key.toString()).toString();
                    acroFields.setField("mobile",mobile);
                }
            }

            //如果为true,那么生成的PDF文件不能再编辑,如果为false,那么生成的PDF文件还能再编辑
            pdfStamper.setFormFlattening(true);
            //关闭pdf读对象
            pdfStamper.close();


            Document document=new Document();
            PdfCopy copy = new PdfCopy(document,outputStream);
            document.open();

            //还原模板文件相同页数
            for(int j=1;j<=pagecount;j++){
                PdfImportedPage importPage = copy.getImportedPage(new PdfReader(byteArrayOutputStream.toByteArray()),j);
                copy.addPage(importPage);
            }

            document.close();

        }catch(IOException e){
            e.printStackTrace();
        }catch(DocumentException e){
            e.printStackTrace();
        }

    }

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

        Map<String, String> map = new HashMap<String, String>();

        //向map实例中添加键值
        map.put("name","张三");
        map.put("sex","男");
        map.put("tel","020-1646977-445");
        map.put("mobile","12345678988");

        //createPdf(map);
    }
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值