使用注意点
因为原来制作的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文件内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论