【第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)依赖包引入

 <!-- itext pdf  -->
        <dependency>
            <groupId>com.lowagie</groupId>
            <artifactId>itext</artifactId>
            <version>4.2.2</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.11</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>

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<String, String> data) throws IOException, DocumentException {
            List<String> keys = new ArrayList<String>();
            Map<String, AcroFields.Item> 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<String> 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<String, String> 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<String, String> 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<BaseFont> fontList = new ArrayList<BaseFont>();
            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<String, String> data = new HashMap<String, String>();
//              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","lynhchun@126.com");
//            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<String, String> pdfData = Object2MapUtil.setConditionMap(commonAllData);
      //4 生成pdf
    byte[] bytes = PdfUtils.generatePDF("conf/"+getTemplate()+".pdf", pdfData);
   //2 生成文件 
    BaseResponse response = appFileService.upload(bytes,".pdf");

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容

  • 本文被少数派精选:点此查看 我一直有考虑如何选择一个无可挑剔的 PDF 应用,这也许是一个强迫症的自我修养,因为总...
    唐小筑阅读 14,597评论 2 7
  • 为了安全性,个人的github和公司的gitlab需要配置不同的SSH-Key。具体如下: 切换到系统的SSH目录...
    York_魚阅读 7,637评论 0 3
  • 我刚开始读时候看着简 爱二字,想着它可能就是有关于爱情的一般鸡汤小说,结果是一个人名,是一个失去双亲孤苦伶仃,被舅...
    我不喜欢做强迫自己的事阅读 526评论 0 0
  • 前些日子和友人探讨了一番关于永恒的认识,最后我和她各执一端,谁也说服不了谁。最后结束争论的时候,我还在心里诽...
    惟危阅读 660评论 0 2
  • 爱笑的女孩子运气不会太差 可况你笑起来还那么美 摄影/后期:空花 @_空花 出镜:不染 转载请联系作者,侵权必究,谢谢。
    寒空花阅读 180评论 0 2