java动态生成pdf文件的方法

java动态生成pdf文件



前言

java开发过程中难免会遇到生成文件的需求,这里简单介绍一下关于pdf格式的文件的动态生成方法


一、生成pdf模板

既然要动态生成文件了,肯定要先设计模板,设置变量,如此才能进行下一步操作。

1.首先,你需要生成一个pdf文件,介绍一个在线工具(https://app.xunjiepdf.com/) 当然,你也可以用word直接另存,但是可能会达不到预期的效果

2.模板设计好之后就是进行设置变量了,在线工具和下载软件的方式都可以 介绍两种:

2.1 https://www.pdfescape.com/open/(简单试用就好,使用效果并不是很友好,可以设置的字体也很少)

2.2工具下载 Adobe Acrobat Pro DC(非常友好了,而且设置各种字体、大小) 还有其他的很多在线工具和软件就不介绍了。

二、使用步骤

1.使用jar包

自行下载,也可根据我最后提供的网址进行下载
iText-2.1.7.jar、itextasian-2.1.7.jar、itext-rtf-2.1.7.jar
或者通过maven引入

maven依赖:

        <dependency>
            <groupId>com.lowagie</groupId>
            <artifactId>itext</artifactId>
            <version>2.1.7</version>
        </dependency>
        <dependency>
            <groupId>cn.lesper</groupId>
            <artifactId>iTextAsian</artifactId>
            <version>3.0</version>
        </dependency>
        <dependency>
            <groupId>com.lowagie</groupId>
            <artifactId>itext-rtf</artifactId>
            <version>2.1.7</version>
        </dependency>

2.pdf实现方法

代码如下(示例):

package com.example.random.testpackage.service;

import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import com.lowagie.text.pdf.AcroFields;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfStamper;

public class TestDemo {
    public static void main(String[] args) throws Exception {
        export();
        System.out.println("生成完成");
    }

    public static void export(){
        try {
            // pdf模板所在路径,就是网站制作好后下载的pdf模板路径
            String fileName = "E:\\download.pdf";
            PdfReader reader = new PdfReader(fileName);
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            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());

            //必须要调用这个,否则文档会出现你不想出现的东西
            ps.setFormFlattening(true);
            ps.close();

            //生成pdf路径存放的路径
            OutputStream fos = new FileOutputStream("D:/result.pdf");
            fos.write(bos.toByteArray());
            fos.flush();
            fos.close();
            bos.close();
        }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();
        }
    }

    /**
     * 填充数据源
     * 其中data存放的key值与pdf模板中的文本域值相对应
     */
    public static Map<String, String> data() {
        Map<String, String> data = new HashMap<String, String>();
        data.put("reqName", "申请人");
        data.put("reqDept", "申请部门");
        return data;
    }
}

参考文章:https://www.cnblogs.com/pxblog/p/13261187.html


总结

以上便是动态生成pdf文件的方法啦,并不是很复杂,只是在设置字体上耽误了不少时间。
我的功能要比这个复杂一些,是将模板放置在项目中,然后通过浏览器的方式下载。也遇到不少问题:比如pdf模板编译后损坏、下载后显示空白但通过pdf工具可以查看等。所幸都解决了,有兴趣的小伙伴可以等待我的更新哟。

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值