PDF文档生成(通用模板生成)

一、 准备模板

1.通过word生成文档
2.将word转为pdf模板
3.通过Adobe Acrobat DC ( 签名-》准备协议-》修改域设置对应字段别名)


协议书.png

二、 PDF生成主体代码

/**
     * 客户告知书PDF合成操作
     * @param signString
     * @param path
     * @param newPath
     * @param imagePath
     * @param customername
     * @param idtype
     * @param idNumer
     * @param mobile
     * @param mail
     * @param address
     * @param imageSeal
     * @return
     * @throws DocumentException
     * @throws IOException
     */
    public Map<String, Object> fillTemplate(String signString, String path, String newPath, String imagePath,String customername, String idtype, String idNumer, String mobile, String mail, String address, String imageSeal, int file_year,int file_month,int file_date) throws DocumentException, IOException {

        //返回值定义
        Map<String, Object> fileMap1 = new HashMap<>();

        // 模板路径

        String templatePath = path;

        // 生成的新文件路径
        String fileUUid1 = UUID.randomUUID().toString().replaceAll("-", "");
        if (!signString.equals("")) {
            fileUUid1 = signString + "@";
        }
        //文件
        String fileName = customername + fileUUid1 + ".pdf";
        String newPDFPath = newPath + fileName;

        PdfReader reader;
        FileOutputStream out;
        ByteArrayOutputStream bos;
        PdfStamper stamper;
        // 输出流
        out = new FileOutputStream(newPDFPath);
        // 读取pdf模板
        reader = new PdfReader(templatePath);
        bos = new ByteArrayOutputStream();
        stamper = new PdfStamper(reader, bos);
        AcroFields form = stamper.getAcroFields();
        //字体设置
        BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
        Font FontChinese = new Font(bf);
        form.addSubstitutionFont(bf);
        //方法三:使用资源字体(ClassPath)
        /*BaseFont baseFont = BaseFont.createFont("/SIMYOU.TTF,1",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED); */
        Map<String, Object> data = new HashMap<>();
        data.put("Text1", customername);
        data.put("Text2", idtype);
        data.put("Text3", idNumer);
        data.put("Text4", mobile);
        data.put("Text5", mail);
        data.put("Text6", address);
        //时间
        data.put("year", file_year);
        data.put("month", file_month);
        data.put("day", file_date);
        // 7遍历data 给pdf表单表格赋值
        for (String key : data.keySet()) {
            form.setField(key, data.get(key).toString());
        }
        // 如果为false那么生成的PDF文件还能编辑,一定要设为true
        stamper.setFormFlattening(true);

        //合成图片-----------------------------------
        int pageNo1 = form.getFieldPositions("Sign").get(0).page;
        int pageNo2 = form.getFieldPositions("Seal").get(0).page;

        Rectangle signRect1 = form.getFieldPositions("Sign").get(0).position;
        Rectangle signRect2 = form.getFieldPositions("Seal").get(0).position;

        float x1 = signRect1.getLeft();
        float y1 = signRect1.getBottom();

        float x2 = signRect2.getLeft();
        float y2 = signRect2.getBottom();
        // 读图片
        Image image = Image.getInstance(imagePath);
        Image image1 = Image.getInstance(imageSeal);
        // 获取操作的页面
        PdfContentByte under1 = stamper.getOverContent(pageNo1);
        PdfContentByte under2 = stamper.getOverContent(pageNo2);
        // 根据域的大小缩放图片
        image.scaleToFit(signRect1.getWidth(), signRect1.getHeight());
        image1.scaleToFit(signRect2.getWidth(), signRect2.getHeight());
        // 添加图片
        image.setAbsolutePosition(x1, y1);
        image1.setAbsolutePosition(x2, y2);

        under1.addImage(image);
        under2.addImage(image1);
        //-----------------------------
        stamper.close();
        
        Document doc = new Document();
        PdfCopy copy = new PdfCopy(doc, out);
        doc.open();
        //pdf模板总页数
        int pageNum = reader.getNumberOfPages();
        for (int i = 1; i <= pageNum; i++) {
            PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), i);
            copy.addPage(importPage);
        }
        doc.close();
        //获取生成文件大小
        File file = new File(newPDFPath);
        long fileSize = file.length();
        //封装返回值
        fileMap1.put("FILENAME", fileName);
        fileMap1.put("PATH", newPDFPath);
        fileMap1.put("FILEID", fileUUid1);
        fileMap1.put("SIZE", fileSize);
        //返回值
        return fileMap1;
    }

三、入参解读

String signString = " 签名id";
String path = "pdf模板路径";
String newPath = "生成pdf存放路径";
String imageSeal = "印章图片路径";
String customername = "姓名";
String idtype = "证件类型";
String idNumer = "证件号";
String mobile = "手机号";
String mail = "邮箱";
String address = "地址";
//生成当前日期
Calendar cal = Calendar.getInstance();
//年
int file_year = cal.get(Calendar.YEAR);
//月
int file_month = cal.get(Calendar.MONTH)+1;
//日
int file_date = cal.get(Calendar.DATE);
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容