当前位置: 代码网 > it编程>编程语言>Java > java导出pdf文件的详细实现方法

java导出pdf文件的详细实现方法

2025年03月15日 Java 我要评论
使用注意点因为原来制作的pdf表单内容过于复杂,下面代码只包含前两行的操作。本次操作需要前端向后端发起请求,后端返回数据给前端用于下载,所以没有在本地进行保存。第 1 步制作pdf模板需要的pdf编辑

使用注意点

因为原来制作的pdf表单内容过于复杂,下面代码只包含前两行的操作。

本次操作需要前端向后端发起请求,后端返回数据给前端用于下载,所以没有在本地进行保存。

第 1 步制作pdf模板需要的pdf编辑软件基本上都需要钱,可以去买一个

第 2 步获取的pdf导出的中文需要的文件,如果pdf输出的内容有中文就需要去弄一下这个文件,在代码中用于读取设置中文字体

包含内容

1、导出pdf

2、设置斜体水印

1、制作pdf模板

先将需要的pdf模板通过word制作出来,然后导出为pdf

使用adobe acrobat dc 打开并制作模板(其他pdf编辑软件也可以)

选择打开前面导出的pdf模板

点击准备表单

点击之后,可以针对没一个位置进行编辑,选中双击就可以进行编辑了,要注意,每个位置的名字都需要是唯一的

全部赋值后保存即可

2、获取pdf导出中文需要的文件

获取中文字体需要的文件

在电脑这个路径下选择下载一个就行

3、实现

pom依赖

<dependency>
    <groupid>com.itextpdf</groupid>
    <artifactid>itext7-core</artifactid>
    <version>7.2.3</version>
    <type>pom</type>
</dependency>

<dependency>
    <groupid>org.apache.pdfbox</groupid>
    <artifactid>pdfbox</artifactid>
    <version>2.0.24</version>
</dependency>

controller接口

    @getmapping("/exportpdf/{applyid}")
    public responseentity<byte[]> exportpdf(@pathvariable("applyid") string applyid, httpservletresponse response) throws ioexception,parseexception,exception {

        byte[] res = applyservice.exportpdf(applyid);
        httpheaders headers = new httpheaders();
        headers.add("content-disposition", "attachment; filename=filled_form.pdf");
        headers.add("content-type", "application/pdf");

        return responseentity.ok()
                .headers(headers)
                .body(res);
    }

service具体实现

	public static byte[] exportpdf1() throws exception {
        string inputtemplatename = "template";
        try {
            pdfbytes = null;
            map<string, string> map = new hashmap<>();
            simpledateformat sdf = new simpledateformat("yyyy-mm-dd");

            // map预填数据,用于后面读取输出到pdf文件上
            map.put("department-1", "研发中心");
            map.put("submitdate-1", sdf.format(new date()));
            map.put("submitperson-1", "张三");
            map.put("travelperson-1", "李四");
            map.put("receiveperson-1","王五");

            // 设置中文字体
            pdffont chinesefont = pdffontfactory.createfont("src/main/resources/file/simsun.ttc,0");

            // 模板路径
            string templatepath = "src\\main\\resources\\file\\" + inputtemplatename + ".pdf";

            // 重点,这一个关联了reader 和 writer
            bytearrayoutputstream bytearrayoutputstream = new bytearrayoutputstream();

            // 读取文件
            fileinputstream pdfinputstream = new fileinputstream(new file(templatepath));
            // 定义 reader 和writer
            pdfreader reader = new pdfreader(pdfinputstream);
            pdfwriter writer = new pdfwriter(bytearrayoutputstream,new writerproperties().setstandardencryption(
                    null,
                    null,
                    encryptionconstants.allow_printing, // 允许打印
                    encryptionconstants.encryption_aes_128 // 加密方式
            ));

            // 根据 reader 和writer 创建 pdfdocument
            pdfdocument pdfdocument = new pdfdocument(reader,writer);

            // 下面是给文件添加水印,不需要的可以直接删掉
            // 获取 pdf 模板页数
            int numberofpages = pdfdocument.getnumberofpages();

            // 遍历每一页并添加水印
            for (int i = 1; i <= numberofpages; i++) {
                pdfpage page = pdfdocument.getpage(i);

                // 获取页面尺寸(在这里我没有用)
                int pagewidth = (int) math.floor(page.getpagesize().getwidth());
                int pageheight = (int) math.floor(page.getpagesize().getheight());

                // 创建一个 pdfcanvas 对象
                pdfcanvas canvas = new pdfcanvas(page);

                // 保存当前坐标系状态
                canvas.savestate();

                // 水印内容旋转
                double angle = math.toradians(45);
                double cos = math.cos(angle);
                double sin = math.sin(angle);
                canvas.concatmatrix(cos, sin, -sin, cos, 0, 0);

                // 设置水印的字体和透明度
                canvas.setfontandsize(pdffontfactory.createfont(), 20);
                canvas.setfillcolorrgb(0.75f, 0.75f, 0.75f);  // 灰色
                canvas.setlinewidth(2);

                // 正常应该根据获取到的页面尺寸进行 x y 轴的遍历并
                // 但是我这边没有铺满,就自己设置了遍历的范围
                for (int x = -90; x < 2000; x += 300) {
                    for (int y = -190; y < 2000; y += 200) {
                        // 绘制水印文字
                        canvas.begintext();
                        canvas.settextmatrix(x, y);  // 设置水印位置
                        canvas.showtext("watermark text this is just a test");  // 水印文字内容
                        canvas.endtext();
                    }
                }

                // 恢复坐标系状态
                canvas.restorestate();

            }

            // form 可以理解为把pdf文件看做一个form表单,以key value键值对保存
            pdfacroform form = pdfacroform.getacroform(pdfdocument, true);

            // 遍历上面预填的 map 并将值根据 key 赋值到form
            for (map.entry<string, string> entry : map.entryset()) {
                form.getfield(entry.getkey()).setvalue(entry.getvalue());
                form.getfield(entry.getkey()).setfont(chinesefont).setfontsize(8);
            }
            pdfdocument.close();
            // 返回文件流
            pdfbytes = bytearrayoutputstream.tobytearray();

            return pdfbytes;

        } catch (exception e) {
            e.printstacktrace();
        }finally {
            return pdfbytes;
        }
    }

4、前端发起请求并生成下载链接

	exportpdf(applyid) {
      exportpdf(applyid).then(res => {
        // 创建一个 blob 对象,指定类型为 pdf 文件
        const blob = new blob([res.data], { type: 'application/pdf' });

        // 创建一个 url 对象,指向 blob 数据
        const url = url.createobjecturl(blob);

        // 创建一个下载链接
        const link = document.createelement('a');
        link.href = url;
        link.download = 'generated_with_form.pdf'; // 设置下载文件名

        // 模拟点击下载链接
        link.click();

        // 下载完成后释放 url 对象
        url.revokeobjecturl(url);
      })
    },

总结 

到此这篇关于java导出pdf文件的详细实现方法的文章就介绍到这了,更多相关java导出pdf文件内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com