Java使用Word模板导出PDF及PDF盖章

主要步骤流程:

1、设计word模板

2、将模板转为PDF

3、使用Adobe Acrobat 设计表单

4、pdf内容填写输出

一、使用word设计模板
二、将模板转为PDF(跳过)
三、使用Adobe Acrobat 设计表单

1、使用打开pdf

2、选择工具的准备表单

3、填写文本域名称

4、如果有需要插入图片选择图片,并将外框和颜色选为无颜色

三、内容填写输出

XML 复制代码
       <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.13</version>
        </dependency>
 
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>
 
        <dependency>
            <groupId>com.itextpdf.tool</groupId>
            <artifactId>xmlworker</artifactId>
            <version>5.5.13</version>
        </dependency>
 
        <dependency>
            <groupId>fr.opensagres.xdocreport</groupId>
            <artifactId>fr.opensagres.poi.xwpf.converter.pdf-gae</artifactId>
            <version>2.0.1</version>
        </dependency>
java 复制代码
/**
     * 输出pdf
     * @param templatePath 模板
     * @param exportPath 新文件
     * @param data 文本
     * @param images 图片
     * @throws IOException 
     */
    public static void generateTempPDF(String templatePath,String exportPath,Map<String, String> data ,Map<String, String> images) throws IOException {
        PdfReader reader = null;
        PdfStamper ps = null;
        OutputStream fos = null;
        ByteArrayOutputStream bos = null;
        try {
            //模板路径templatePath
            reader = new PdfReader(templatePath);
            bos = new ByteArrayOutputStream();
            ps = new PdfStamper(reader, bos);
            // 使用中文字体
            BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            ArrayList<BaseFont> fontList = new ArrayList<>();
            fontList.add(bf);
            AcroFields fields = ps.getAcroFields();
            fields.setSubstitutionFonts(fontList);
            fillData(fields, data);//渲染
            //插入图片
            if (EmptyUtils.isNotEmpty(images)) {
                fillImage(fields, ps,images);
            }
            //必须要调用这个,否则文档不会生成的
            ps.setFormFlattening(true);
            if(ps != null){
                ps.close();
            }
            //生成pdf路径存放的路径
            fos = new FileOutputStream(exportPath);
            fos.write(bos.toByteArray());
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if(fos!=null){
                fos.flush();
                fos.close();
            }
            if (bos != null){
                bos.close();
            }
            if(reader != null){
                reader.close();
            }
        }
    }

    private static void fillImage(AcroFields fields, PdfStamper ps, Map<String, String> images) {
        try {
            for (String key : images.keySet()) {
                String value = images.get(key);
                // 为字段赋值,注意字段名称是区分大小写的
                insertImage(fields, ps, key, value);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 填充模板中的数据
     */
    public static void fillData(AcroFields fields, Map<String, String> data) {
        try {
            for (String key : data.keySet()) {
                String value = data.get(key);
                // 为字段赋值,注意字段名称是区分大小写的
                fields.setField(key, value);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * pdf模板插入图片
     * @param form
     * @param stamper
     * @param filedName
     * @param url
     * @return
     */
    public  static boolean insertImage(AcroFields form, PdfStamper stamper, String filedName, String url) {
        try {
            int pageNo = form.getFieldPositions(filedName).get(0).page;
            Rectangle signRect = form.getFieldPositions(filedName).get(0).position;
            float x = signRect.getLeft();
            float y = signRect.getBottom();

            Image image = Image.getInstance(url);
            // 获取操作的页面
            PdfContentByte under = stamper.getOverContent(pageNo);
            // 根据域的大小缩放图片
            image.scaleToFit(signRect.getWidth(), signRect.getHeight());
            // 添加图片
            image.setAbsolutePosition(x, y);
            under.addImage(image);
        }catch (Exception e){
            return false;
        }
        return true;
    }
相关推荐
我只会写Bug啊20 小时前
Vue文件预览终极方案:PNG/EXCEL/PDF/DOCX/OFD等10+格式一键渲染,开源即用!
前端·vue.js·pdf·excel·预览
帧栈1 天前
SpringBoot + iTextPDF + Acrobat 构建动态PDF表单的完整实践
spring boot·后端·pdf
红鼻子时代1 天前
从零开始构建PDF文档生成器(二)- 添加页眉页脚
pdf·页眉页脚·canvas绘制
Source.Liu2 天前
【pdf-rs】color.rs 文件解析
pdf
ceffans2 天前
PDF文档中表格以及形状解析-后续处理(线段生成最小多边形)
c++·windows·算法·pdf
Source.Liu2 天前
【printpdf】color.rs 文件解析
rust·pdf
乘风!3 天前
前端Jquery,后端Java实现预览Word、Excel、PPT,pdf等文档
pdf·word·excel·jquery
我有一棵树3 天前
浏览器使用 <embed> 标签预览 PDF 的原理
pdf·embed
蜀中廖化3 天前
小技巧:ipynb转pdf
pdf·小工具·python to pdf
Eiceblue3 天前
使用 Python 向 PDF 添加附件与附件注释
linux·开发语言·vscode·python·pdf