java根据PDF模板生成并导出

1.首先通过Adobe Acrobat pro软件打开pdf文件(注:如果没有这个软件可以通过我的百度云下载,链接:http://pan.baidu.com/s/1pL2klzt)如果无法下载可以联系博主。

2. 选择此处准备模板,添加角标

类似上图,然后保存

我是把模板上传到项目中,保存在doc目录下:

以上是准备工作,下面进入代码阶段

  1. 引入jar包依赖,我是maven项目

        <dependency>
			<groupId>com.itextpdf</groupId>
			<artifactId>itextpdf</artifactId>
			<version>5.5.1</version>
		</dependency>
		<dependency>
			<groupId>com.itextpdf</groupId>
			<artifactId>itext-asian</artifactId>
			<version>5.2.0</version>
		</dependency>

 以上两个是导出的核心包

接下来我缝了一个工具类:

import cn.boxiao.bxn.common.util.FileDownloadUtils;
import cn.boxiao.bxn.common.util.PropertiesAccessorUtil;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.Map;
public class PdfUtil {
    Logger LOG = LoggerFactory.getLogger(getClass());
    /**
     *
     * @param o 写入的数据
     * @param out 自定义保存pdf的文件流
     * @param templatePath pdf模板路径
     */
    // 利用模板生成pdf
    public  void fillTemplate(Map<String,Object> o,ServletOutputStream out,String templatePath) {
        PdfReader reader;
        ByteArrayOutputStream bos;
        PdfStamper stamper;
        try {
//此处的字体,服务要是在linux上,中文会出现导出填不上的情况,所以,此处字体必填
            BaseFont bf = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
            Font FontChinese = new Font(bf, 5, Font.NORMAL);
            reader = new PdfReader(templatePath);// 读取pdf模板
            //FileInputStream is = new FileInputStream(fileTemplate);
            bos = new ByteArrayOutputStream();
            stamper = new PdfStamper(reader, bos);
            AcroFields form = stamper.getAcroFields();

            java.util.Iterator<String> it = form.getFields().keySet().iterator();
            form.addSubstitutionFont(bf);
            while (it.hasNext()) {
                String name = it.next().toString();
                System.out.println(name);
                String value = o.get(name)!=null?o.get(name).toString():null;
                LOG.info("名字:{},标签:{}",value,name);
                form.setField(name,value);
            }
            stamper.setFormFlattening(true);// 如果为false那么生成的PDF文件还能编辑,一定要设为true
            stamper.close();
            LOG.info("插入成功");
            Document doc = new Document();
            Font font = new Font(bf, 32);
            PdfCopy copy = new PdfCopy(doc, out);
            doc.open();
            PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);
            copy.addPage(importPage);
            doc.close();

        } catch (IOException e) {
            LOG.error("利用模板导出PDF失败:{}",e);
        } catch (DocumentException e) {
            LOG.error("利用模板导出PDF失败:{}",e);
        }
    }
}

接下来是接口处controller层:

    /**
     * 导出pdf
     * @param response
     * @param educationId
     * @return
     */
    @RequestMapping(value = "/importpdf")
    @ResponseBody
    public Result<Map<String,Object>> importPdf(HttpServletResponse response,String educationId,HttpServletRequest request) {
        Map<String, Object> mapJson = new HashMap<>();
        ResultQuery esultQuery = resultQueryService.querybyNumber(educationId);
        if (esultQuery.getReadType()==0){
            resultQueryService.updateReadType(educationId,esultQuery.getStudentName(),new Date());
            LOG.info("{}:状态已修改为已读.",esultQuery.getStudentName());
        }
        mapJson.put("studentName",esultQuery.getStudentName()+"     同学:");
        mapJson.put("number",esultQuery.getEducationId());
        mapJson.put("idCard",esultQuery.getIdCard());
        mapJson.put("content",esultQuery.getBatch()+"  "+esultQuery.getMajorName()+"("+esultQuery.getWord()+")");
        response.reset();
        response.setCharacterEncoding("UTF-8");
        // 定义输出类型
        response.setContentType("application/PDF;charset=utf-8");
        response.setHeader("Content-Disposition", "attachment; filename=" + FileDownloadUtils.fileNameToUtf8String(request, "录取通知书.pdf"));
        try {
            ServletOutputStream out = response.getOutputStream();
            PdfUtil pdf = new PdfUtil();
            String fileTemplate = request.getSession().getServletContext().getRealPath("/resources/doc/fuzhonghigh.pdf");//读取项目中模板位置
            pdf.fillTemplate(mapJson ,out,fileTemplate);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return ResultUtil.success("导出成功");
    }

基本以上就是导出的全部了,有不清楚的,欢迎私信

附上借鉴博文地址:https://blog.csdn.net/TOP__ONE/article/details/65442390?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159667706419726869019940%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=159667706419726869019940&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-1-65442390.ecpm_v3_rank_business_v1&utm_term=pdf+%E6%A8%A1%E6%9D%BF&spm=1018.2118.3001.4187

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值