【第13期】springboot: springboot操作pdf

原创文章,转载请注明原文章地址,谢谢!

一、pdf模板制作

1)word编辑模板

image

2)转成pdf模板

这个比较简单,wps另存为pdf格式就行

  1. 编辑pdf模板字段

    pdf的编辑一般的软件就不行了,需要下载一个专业软件Adobe Acrobat DC,网上有破解版的,也可以关注“村中一少”公众号,回复“Adobe Acrobat DC”获取下载地址。

image
 安装成功后,右键使用Adobe Acrobat编辑打开pdf文件,以“编辑表单”模式打开,对pdf字段编辑
image
image
image
image

然后,对其中的变量字段进行修改,改成和程序中的实体对象字段对应,这一步很重要,切记。

image

双击后,修改文本属性,可以设置字体大小、字体类型以及其它的,自己操作一遍就ok了。

二、springboot对接pdf

1)依赖包引入

 
        
            com.lowagie
            itext
            4.2.2
        
        
            com.itextpdf
            itextpdf
            5.5.11
        
        
            com.itextpdf
            itext-asian
            5.2.0
        

2)pdf工具类

import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
​
import java.io.*;
import java.util.*;
​
public class PdfUtils {
            /**
         * @param fields
         * @param data
         * @throws IOException
         * @throws DocumentException
         */
        private static void fillData(AcroFields fields, Map data) throws IOException, DocumentException {
            List keys = new ArrayList();
            Map formFields = fields.getFields();
            for (String key : data.keySet()) {
                if(formFields.containsKey(key)){
                    String value = data.get(key);
                    fields.setField(key, value); // 为字段赋值,注意字段名称是区分大小写的
                    keys.add(key);
                }
            }
            Iterator itemsKey = formFields.keySet().iterator();
            while(itemsKey.hasNext()){
                String itemKey = itemsKey.next();
                if(!keys.contains(itemKey)){
                    fields.setField(itemKey, " ");
                }
            }
        }
​
        /**
         * @param templatePdfName
         *            模板pdf名称
         * @param generatePdfPath
         *            生成pdf路径
         * @param data
         *            数据
         */
        public static String generatePDF(String templatePdfName, String generatePdfPath, Map data) {
            OutputStream fos = null;
            ByteArrayOutputStream bos = null;
            try {
                byte[] bytes =generatePDF(templatePdfName,data);
                fos = new FileOutputStream(generatePdfPath);
                fos.write(bytes);
                fos.flush();
                return generatePdfPath;
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (fos != null) {
                    try {
                        fos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return null;
        }
​
    /**
     * @param templatePdfName
     *            模板pdf名称
     * @param data
     *            数据
     */
    public static byte[] generatePDF(String templatePdfName,  Map data) {
        ByteArrayOutputStream bos = null;
        try {
            InputStream istemplate =PdfUtils.class.getClassLoader().getResourceAsStream(templatePdfName);
            PdfReader reader = new PdfReader(istemplate);
            bos = new ByteArrayOutputStream();
            /* 将要生成的目标PDF文件名称 */
            PdfStamper ps = new PdfStamper(reader, bos);
            /* 使用中文字体 */
            BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
            ArrayList fontList = new ArrayList();
            fontList.add(bf);
            /* 取出报表模板中的所有字段 */
            AcroFields fields = ps.getAcroFields();
            fields.setSubstitutionFonts(fontList);
            fillData(fields, data);
            /* 必须要调用这个,否则文档不会生成的  如果为false那么生成的PDF文件还能编辑,一定要设为true*/
            ps.setFormFlattening(true);
            ps.close();
​
            return bos.toByteArray();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (bos != null) {
                try {
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }
​
​
//        public static void main(String[] args) {
//            Map data = new HashMap();
//              data.put("sex", "男");
//              data.put("payType", "微信");
//              data.put("receiptCode","20010001");
//              data.put("realName","nnn");
//              data.put("age","30");
//              data.put("examType","统考");
//              data.put("college","科技大学");
//              data.put("major","计算机");
//
//            data.put("email","[email protected]");
//            data.put("qqWx","616690485");
//            data.put("parentPhone","13453457219");
//            data.put("phone","15392687219");
//
//            data.put("targetMajor","计算机科学与技术");
//            data.put("examDate","2019");
//            data.put("tutorType","暑假冲刺班");
//            data.put("courseName","英语、数学");
//
//            data.put("createTime","2019-04-18 16:26:30");
//            data.put("payAmountWord","二百元整");
//            data.put("payAmount","200");
//            data.put("createBy","nnn");
//            data.put("chargePerson","nnn");
//            data.put("remark","无");
//            data.put("financeUser","nnn");
//
//            data.put("payStatus","(全额)");
//
//
//
//            generatePDF("e:\\\\ky2.pdf",
//                    "e:\\ky3.pdf", data );
//        }
​
    }
​

service

 // 构造pdf字段
    Map pdfData = Object2MapUtil.setConditionMap(commonAllData);
      //4 生成pdf
    byte[] bytes = PdfUtils.generatePDF("conf/"+getTemplate()+".pdf", pdfData);
   //2 生成文件 
    BaseResponse response = appFileService.upload(bytes,".pdf");

在程序中调用成功后,就ok了

你可能感兴趣的:(【第13期】springboot: springboot操作pdf)