itext5生成多个PDF并合并

news/2025/3/19 16:15:55/文章来源:https://www.cnblogs.com/aeolian/p/18781213

PDF批量生成并合并为1个PDF

单个生成

    /*** 根据id查询数据* @param id 数据id* @return*/private Map<String, String> queryEntityDataById(String id) {//根据id查询Box entity = BoxService.getById(id);Map<String, String> data = new HashMap<String, String>();//显示内容//iddata.put("id", entity.getJdKh());//动态生成当前时间的yymmddhh格式DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyMMddHH");String currentDate = LocalDateTime.now().format(formatter);data.put("date", currentDate);//二维码内容data.put("imsi", entity.getImsi());data.put("imei", entity.getImei());String type = entity.getType();if (type == null || type.isEmpty()) {type = "A";}data.put("type", type);return data;}//根据数据生成PDFprivate void generatePdfForData(Map<String, String> data, ByteArrayOutputStream outputStream) throws Exception {// Load the PDF templateInputStream templateStream = getClass().getResourceAsStream("/template/ddentitytemplate.pdf");PdfReader reader = new PdfReader(templateStream);PdfStamper stamper = new PdfStamper(reader, outputStream);AcroFields form = stamper.getAcroFields();String fontPath = File.separator + "font" + File.separator + "micosoftyh.ttf";BaseFont bfChinese = BaseFont.createFont(fontPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);Map<String, AcroFields.Item> fields = form.getFields();for (String k : fields.keySet()) {form.setFieldProperty(k, "textfont", bfChinese, null);form.setFieldProperty(k, "textsize", Float.valueOf("55"), null);form.setFieldProperty(k, "textstyle", com.itextpdf.text.Font.BOLD, null);form.setFieldProperty(k, "textalign", Element.ALIGN_MIDDLE, null);}//特殊文本框字体大小重置form.setFieldProperty("$serialnumber$", "textsize", Float.valueOf("40"), null);//标签内容//IDform.setField("$id$", data.get("id"));//日期form.setField("$date$", data.get("date"));//二维码String qrContent = String.format("ID:%s\n" +"IMSI:%s\n" +"IMEI:%s\n" +"type:%s",data.get("id"), data.get("imsi"), data.get("imei"),data.get("type"));PdfContentByte cb = stamper.getOverContent(1);generateQRcode(qrContent, cb);stamper.setFormFlattening(true);stamper.close();reader.close();}

返回PDF

/*** 根据ID批量生成pdf并合并* @param ids ids集合* @return 可直接访问的pdf流文件*/@GetMapping("/generateMergePdfStream")public ResponseEntity<ByteArrayResource> generateMergePdfStream(@RequestParam String ids) {long startTime = System.currentTimeMillis();System.out.println("开始生成PDF: " + startTime);try {String[] idArray = ids.split(",");ByteArrayOutputStream mergedOutputStream = new ByteArrayOutputStream();Document mergedDocument = new Document();PdfSmartCopy copy = new PdfSmartCopy(mergedDocument, mergedOutputStream);mergedDocument.open();for (String id : idArray) {Map<String, String> data = queryEntityDataById(id.trim());ByteArrayOutputStream pdfOutputStream = new ByteArrayOutputStream();generatePdfForData(data, pdfOutputStream);System.out.println("生成的PDF文件大小: " + pdfOutputStream.size());PdfReader reader = new PdfReader(new ByteArrayInputStream(pdfOutputStream.toByteArray()));copy.addDocument(reader);reader.close();pdfOutputStream.close();}mergedDocument.close();ByteArrayResource resource = new ByteArrayResource(mergedOutputStream.toByteArray());HttpHeaders headers = new HttpHeaders();headers.add("Content-Disposition", "inline; filename=merged.pdf");long generationEnd = System.currentTimeMillis();System.out.println("PDF生成与合并完成,总耗时: " + (generationEnd - startTime) + " 毫秒");return ResponseEntity.ok().headers(headers).contentType(MediaType.APPLICATION_PDF).body(resource);} catch (Exception e) {e.printStackTrace();return ResponseEntity.status(500).build();}}

文件保存在本地通过http接口访问pdf文件

application.properties

#访问jar包位置的同级files文件,可以直接通过http://IP:port/files下的文件名访问
spring.web.resources.static-locations=file:./files/

合并PDF并保存

    /*** 生成合并的pdf文件保存到服务器下面* application.properties下面需要配置spring.web.resources.static-locations=file:./files/* jar包运行的文件夹目录* @param ids ids集合* @return 可直接访问的http://IP:Port/*.pdf*/@GetMapping("/generateentityLogPdf")public ResponseEntity generateMergeSavePdf(@RequestParam String ids, HttpServletRequest request) {try {// 分割idsString[] idArray = ids.split(",");// 输出流ByteArrayOutputStream mergedOutputStream = new ByteArrayOutputStream();Document mergedDocument = new Document();PdfCopy copy = new PdfCopy(mergedDocument, mergedOutputStream);mergedDocument.open();for (String id : idArray) {//根据id查询pdf所需要数据Map<String, String> data = queryEntityDataById(id.trim());// 根据id生成pdf数据流ByteArrayOutputStream pdfOutputStream = new ByteArrayOutputStream();generatePdfForData(data, pdfOutputStream);// 将生成的pdf数据流PdfReader reader = new PdfReader(new ByteArrayInputStream(pdfOutputStream.toByteArray()));copy.addDocument(reader);reader.close();}mergedDocument.close();//保存文件路径String currentDateDir = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));// 获取运行目录下的 files 目录路径String filePath = System.getProperty("user.dir") + File.separator + "files" + File.separator + currentDateDir;File directory = new File(filePath);// 检查目录是否存在,不存在则创建if (!directory.exists()) {directory.mkdirs();}// 保存文件名Random random = new Random();int randomNumber = random.nextInt(1000);String fileName = System.currentTimeMillis() + "_" + randomNumber + ".pdf";File file = new File(directory, fileName);try (FileOutputStream fos = new FileOutputStream(file)) {fos.write(mergedOutputStream.toByteArray());fos.flush();System.out.println("文件保存成功:" + file.getAbsolutePath());} catch (IOException e) {e.printStackTrace();}//返回直接访问pdf的urlString ip = request.getServerName();int port = request.getServerPort();String fileUrl = "http://" + ip + ":" + port + "/" + currentDateDir + "/" + fileName;return ResponseEntity.ok(fileUrl);} catch (Exception e) {e.printStackTrace();return ResponseEntity.status(500).build();}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/901574.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker 容器修改端口映射

目录查看容器信息查看容器的端口映射情况,在容器外执行查找要修改容器的容器Id全称修改要端口映射的容器的配置文件查看容器信息 docker ps -a查看容器的端口映射情况,在容器外执行 docker port 容器ID 或者 docker port 容器名称查找要修改容器的容器Id全称 docker inspect …

Allure的下载安装以及自动生成测试报告

一、下载Allure压缩包 访问此链接:https://repo.maven.apache.org/maven2/io/qameta/allure/allure-commandline/ 根据你个人的需求,下载对应的allure版本即可,哪个兼容就下载哪个,需要哪个下载哪个。 比如,小编自己就随便下载了一个版本 下载完成之后,将下载好的安装包解…

referrerpolicy-以最小的成本实现系统的图片上传

背景 系统上传图片一般有以下三种方案:购买云存储(比如 AWS S3、阿里云 OSS、腾讯云 COS),获取图片URL 直接将图片上传到服务器,存储在本地作为静态资源 使用第三方的图片服务(比如有道、博客园),借用对方资源结合本系统需求:自建博客尽可能减少预算,方案1放弃;方案…

grafana创建下拉框

grafana如何创建下拉框: 1.在dashabord中进行配置: 1.1进入你想要添加下拉框的dashboard中,点击Edit1.2 点击Settings 1.3 选择Variables-》Add New variable 1.4 选择variable type,输入变量的name,label 选择数据源data source 写入sql,点击Run query可以立马查看到查询出…

一次100W+数据级别的渲染优化

组织架构的列表页有关于公司人员架构的树形结构展示,某大客户有10万员工,造成组织架构的列表渲染卡顿,用户点击经常造成页面崩溃。 需求背景:左边是树形目录,多层级展示,层级结构未作限制。点击左边目录会展示对应的列表,点击右边对应用户的组织属性,也会联动左边的目录…

小程序 反编译

背景 小程序测试难点,数据包加密?有签名存在?导致测试受阻 工具 wedecode wedecode https://github.com/biggerstar/wedecode1.首次使用,源码安装方式 git clone https://github.com/biggerstar/wedecode npm install # 如果 npm 安装很慢, 可以使用右侧命令换国内的淘宝…

日志文件必须输出到控制台才香对吗

在实际工作中发现很多人喜欢将日志输出到控制台,有的甚至直接只是输出到控制台,都不输出到日志文件中。 这种操作看似人畜无害,实际上直接影响着系统的性能,很多时候还难以排查,这里我从实际举例都背后原因来分析为什么这么做并不香。通常的日志配置 这里我们使用经常使用…

C#通过FTP获取服务端文件

一、简介实际需求是在前端修改了配置文件后,由上位机统一分发给所有设备,因为下位机支持FTP协议,因此选用FTP来实现文件传输功能。 二、准备工作 1、FTP服务搭建FTP服务端选用FileZilla Server,免费开源,简单好用,可以下载中文版的。下载地址:下载 - FileZilla中文网,也…

20242942 2024-2025-2 《网络攻防实践》实验三

1.实验内容 (1)动手实践tcpdump 使用tcpdump开源软件对在本机上访问www.tianya.cn网站过程进行嗅探,回答问题:你在访问www.tianya.cn网站首页时,浏览器将访问多少个Web服务器?他们的IP地址都是什么? (2)动手实践Wireshark 使用Wireshark开源软件对在本机上以TELNET方式…

Oracle OCP认证没落了吗?

Oracle OCP认证没落了吗? Oracle的OCP认证是数据库领域必考的一个认证,但随着国产化的发展,国内很多企业开发了自己的数据库产品,这种情况对很多人造成了错误的认识:OCP被淘汰了吗?不然,从行业需求、技术趋势、认证体系变化等角度综合分析,Oracle OCP证书并未完全“没…

查看dll文件的publicKeyToken

输入: SN -T "C:\Program Files (x86)\Kingdee\K3Cloud\WebSite\bin\log4net.dll"

把 DeepSeek 接入电话系统后,不知疲倦的智能客服向我们走来了

我们基于deepseek和Freeswitch做了一个智能电话客服。 它会基于给定的FAQ知识库来回答问题,自动进行语音识别和语音合成。 语音识别我们采用的是开源的FunAsr,语音合成采用的是第三方商用的API接口。我们接下来介绍下它的内部组成部分。【 第一阶段】当电话拨通电话后,电话服…