Java 创建pdf

一、常用根据模板创建pdf两种方式

  1. (创建**.ftl模板**)文本复制到word -> 转html -> 写好模板参数 -> 转成.ftl
    (使用模板)获取.ftl文件 -> 填充参数 -> 转html -> 创建pdf

    将要生成pdf的文本复制到word,在要填充参数的地方写上${}(FTL语法),再转换成html(这里注意不要用word自带的另存为转成html,会出现字符编码、缺少标签等很多的问题),将html文件的后缀改成.ftl,这样这个.ftl文件就是搞好的pdf模板了。

  2. 直接创建pdf模板,使用Adobe Acrobat DC工具给pdf填充文本域,保存后即为模板。(使用模板)获取pdf模板 -> 填充参数 -> 创建pdf

这篇文章就先只介绍方式2(pdf模板创建pdf)


二、使用pdf模板创建pdf

1.创建PDF模板

工具资源https://download.csdn.net/download/qq_43647116/46414910

我使用的是Adobe Acrobat DC工具,以下操作为该软件的流程。
1.将要制作为模板的pdf用Adobe Acrobat DC打开,如下界面。
在这里插入图片描述
2.找到并点击准备表单,工具 ->表单和签名->准备表单,点击后选择开始即可。
在这里插入图片描述
在这里插入图片描述
3.添加文本域
工具会自动查找需要添加文本域的地方,还是挺智能的,也可以手动添加。如果添加图片,也要使用文本域,虽然有个图片域,但是使用图片域添加图片不能对图片进行缩放。
在这里插入图片描述
4.保存后就是项目中要用的pdf模板啦。

Java实现代码

所需依赖

<dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.13.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.itextpdf/itext-asian -->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>

代码

public class CreatePdf {
    public static void main(String[] args) throws Exception {
        createPdf();
    }

    /**
     * Adobe Acrobat Pro DC 创建模板
     *
     * @throws Exception
     */
    public static void createPdf() throws Exception {
        // 填充创建pdf
        PdfReader reader = null;
        PdfStamper stamp = null;
        String pdfTemplatePath = "D:\\idea\\workspace\\project\\project_1\\project\\test\\src\\main\\resources\\template.pdf";
        String createPath = "D:\\idea\\workspace\\project\\project_1\\project\\test\\src\\main\\resources\\";
        try {
            reader = new PdfReader(pdfTemplatePath);
            String time = new SimpleDateFormat("dd-HH-mm-ss").format(new Date());
            // 创建生成报告名称
            File stampFile = new File(createPath, time + ".pdf");
            stamp = new PdfStamper(reader, new FileOutputStream(stampFile));
            // 取出报表模板中的所有字段
            AcroFields form = stamp.getAcroFields();
            // 填充数据,对应文本域名称
            // form.setField("fill_1", "张三");
            // form.setField("fill_2", "21");
            form.setField("fill_3", "2021");
            form.setField("fill_4", "21");
            form.setField("fill_5", "91");
            // 实际项目中可以遍历map装入数据
            // for (Entry<String, String> entry : map.entrySet()) {
            //     form.setField(entry.getKey(), entry.getValue());
            // }
            // 插入图片
            int pageNo = form.getFieldPositions("image").get(0).page;
            Rectangle signRect = form.getFieldPositions("image").get(0).position;
            float x = signRect.getLeft();
            float y = signRect.getBottom();
            // 图片路径,url或绝对路径都可
            Image image = Image.getInstance("https://pics1.baidu.com/feed/f2deb48f8c5494ee9189fe82cd246ff89b257ede.jpeg?token=e5fe9ba1fd2d2324f8981468d8ad329a");
            // 获取操作的页面
            PdfContentByte under = stamp.getOverContent(pageNo);
            // 根据域的大小缩放图片
            image.scaleToFit(signRect.getWidth(), signRect.getHeight());
            // 添加图片
            image.setAbsolutePosition(x, y);
            under.addImage(image);

            // 这里true表示pdf可编辑
            stamp.setFormFlattening(true);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (stamp != null) {
                stamp.close();
            }
            if (reader != null) {
                reader.close();
            }
        }
    }

}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值