Java如何实现Pdf的导出?
Java如何实现Pdf的导出?
在某些场景中,我们需要从数据库或其他来源获取的数据信息,动态的导出Pdf文件,如准考证的打印等。这时我们需要借助第三方依赖包—itextpdf 来实现此需求。
一、制作PDF模板
1、在Word内制作模板
因为PDF常用的软件不支持编辑,所以先用Word工具,如WPS或者Office新建一个空白Word文档,里面制作出自己想要的样式。
2、将Word转换成PDF形式
将设置好的Word文档转换成PDF形式,保存起来。
3、编辑PDF准备表单
用Adobe Acrobat DC 软件打开保存好的PDF模板文件,点击右下角的更多工具按钮
进入到此页面,点击“准备表单”按钮。
接下来进行详细的配置数据源(注意,配置的数据源字段必须与Java中的实体类对象的字段名保持一致)
另外注意:在要显示图像的区域,点击鼠标右键,选择文本域,设定好图像的显示位置,并指定数据源字段
配置完成之后保存,留作模板使用。
二、编写代码
在准备好PDF模板之后,即可以开始编写代码来实现PDF的导出
1、导入依赖
<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13</version>
</dependency>
2、实体类
import lombok.Data;/*** @since 2021/7/11 15:33*/
@Data
public class AdmissionCard {/*** 准考证号*/private String no;/*** 考生姓名*/private String name;/*** 考生性别*/private String sex;/*** 身份证号*/private String idCard;/*** 学习工作单位*/private String school;/*** 报考单位*/private String enterSchool;/*** 报考专业*/private String major;/*** 报考点*/private String enterName;/*** 考试地点*/private String examAddress;/*** 考生头像*/private String studentImg;
}
3、Service层代码的实现
/*** @since 2021/7/11 16:12*/
public interface PdfCustomService {/*** 生成准考证PDF* @param admissionCard 准考证信息* @param response 响应*/void generatorAdmissionCard(AdmissionCard admissionCard, HttpServletResponse response) throws UnsupportedEncodingException, FileNotFoundException;
}
import cn.ecut.file.pdf.entity.AdmissionCard;
import cn.ecut.file.pdf.service.PdfCustomService;
import com.itextpdf.text.Document;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;/*** @since 2021/7/11 16:12*/
@Service
@Slf4j
public class PdfCustomServiceImpl implements PdfCustomService {@Overridepublic void generatorAdmissionCard(AdmissionCard admissionCard, HttpServletResponse response) throws UnsupportedEncodingException, FileNotFoundException {// 模板名称String templateName = "准考证-模板.pdf";String path = "";// 获取操作系统名称,根据系统名称确定模板存放的路径String systemName = System.getProperty("os.name");if(systemName.toUpperCase().startsWith("WIN")){path = "D:/pdf/";}else {path = "/usr/local/pdf/";}// 生成导出PDF的文件名称String fileName = admissionCard.getName() + "-硕士准考证.pdf";fileName = URLEncoder.encode(fileName, "UTF-8");// 设置响应头response.setContentType("application/force-download");response.setHeader("Content-Disposition","attachment;fileName=" + fileName);OutputStream out = null;ByteArrayOutputStream bos = null;PdfStamper stamper = null;PdfReader reader = null;try {// 保存到本地// out = new FileOutputStream(fileName);// 输出到浏览器端out = response.getOutputStream();// 读取PDF模板表单reader = new PdfReader(path + templateName);// 字节数组流,用来缓存文件流bos = new ByteArrayOutputStream();// 根据模板表单生成一个新的PDFstamper = new PdfStamper(reader, bos);// 获取新生成的PDF表单AcroFields form = stamper.getAcroFields();// 给表单生成中文字体,这里采用系统字体,不设置的话,中文显示会有问题BaseFont font = BaseFont.createFont("C:/WINDOWS/Fonts/SIMSUN.TTC,1", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);form.addSubstitutionFont(font);// 装配数据Map<String, Object> data = new HashMap<>(15);data.put("no", admissionCard.getNo());data.put("name", admissionCard.getName());data.put("sex", admissionCard.getSex());data.put("idCard", admissionCard.getIdCard());data.put("school", admissionCard.getSchool());data.put("enterSchool", admissionCard.getEnterSchool());data.put("examAddress", admissionCard.getExamAddress());data.put("major", admissionCard.getMajor());data.put("enterName", admissionCard.getEnterName());data.put("studentImg", admissionCard.getStudentImg());// 遍历data,给pdf表单赋值for(String key : data.keySet()){// 图片要单独处理if("studentImg".equals(key)){int pageNo = form.getFieldPositions(key).get(0).page;Rectangle signRect = form.getFieldPositions(key).get(0).position;float x = signRect.getLeft();float y = signRect.getBottom();String studentImage = data.get(key).toString();//根据路径或Url读取图片Image image = Image.getInstance(studentImage);//获取图片页面PdfContentByte under = stamper.getOverContent(pageNo);//图片大小自适应image.scaleToFit(signRect.getWidth(), signRect.getHeight());//添加图片image.setAbsolutePosition(x, y);under.addImage(image);}// 设置普通文本数据else {form.setField(key, data.get(key).toString());}}// 表明该PDF不可修改stamper.setFormFlattening(true);// 关闭资源stamper.close();// 将ByteArray字节数组中的流输出到out中(即输出到浏览器)Document doc = new Document();PdfCopy copy = new PdfCopy(doc, out);doc.open();PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);copy.addPage(importPage);doc.close();log.info("*****************************PDF导出成功*********************************");}catch (Exception e){e.printStackTrace();}finally {try {if (out != null) {out.flush();out.close();}if (reader != null) {reader.close();}}catch (Exception e){e.printStackTrace();}}}
}
4、Controller层的实现
import cn.ecut.file.pdf.entity.AdmissionCard;
import cn.ecut.file.pdf.service.PdfCustomService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import javax.servlet.http.HttpServletResponse;
import java.io.FileNotFoundException;
import java.io.UnsupportedEncodingException;/*** @since 2021/7/11 16:39*/
@RestController
@Api(value = "PDF相关操作接口", tags = "PDF相关操作接口")
@RequestMapping("/pdf")
public class PdfController {@Autowiredprivate PdfCustomService pdfCustomService;@ApiOperation(value = "导出PDF")@PostMapping("/admissioncard")public void generatorAdmissionCard(@RequestBody AdmissionCard admissionCard, HttpServletResponse response){try {pdfCustomService.generatorAdmissionCard(admissionCard, response);} catch (UnsupportedEncodingException | FileNotFoundException e) {e.printStackTrace();}}
}
三、测试效果
请求接口,动态传递数据从而导出不同数据的PDF文档
下载响应的PDF文档
结果正确,完美实现PDF的动态导出
Java如何实现Pdf的导出?相关推荐
- java spring maven pdf 导出
2019独角兽企业重金招聘Python工程师标准>>> pdf表单模板 js : 渲染出动态的html ,其实就是一个a标签 Visitor.operateFormatter = f ...
- Java解析PDF文件(PDFBOX、itext解析PDF)导出PDF中的子图片,去除PDF中的水印
前段时间,为了解析PDF,花了不少时间去学习PDFbox和itext,这两个都是处理PDF的开源库,有java和C#的.作为一个刚开始学习这两个开源库的,感觉百度上的资源还是太少了.我做的是一个关于P ...
- Java代码实现PDF中表格导出到Excel
表格常见于 PDF 发票和财务报告中.您可能会遇到需要将 PDF 表格数据导出到 Excel 中的情况,以便您可以使用 MS Excel 提供的工具对数据进行分析.本文介绍了如何使用 Spire.Of ...
- java导出PDF、iText5导出漂亮表格PDF、导出指定格式水印PDF
我们在项目当中经常要导出pdf文档,pdf文档还要按一定的格式导出,以下介绍导出pdf文档功能: 1)支持A4纸大小导出 2)指定文字显示的位置 3)支持表格展示数据 4)添加水印 开源下载 java ...
- Java实现文件批量导入导出实例(兼容xls,xlsx)
<link href="https://csdnimg.cn/public/favicon.ico" rel="SHORTCUT ICON"> &l ...
- Java自动生成PDF并进行邮件群发
这段时间,公司承办一个互联网峰会,需要对4000多位客户发送邀请函,其中包括一个pdf文件和一封手写信,PDF中将从公司数据库中读取所有客户姓名,自动生成到相应位置,前期尝试Java自动生成pdf文件 ...
- iText + Freemarker实现pdf的导出,支持页眉添加图片,及其他的基础功能
本文为了记录自己的实现过程,具体的实现步骤是参考博文 https://www.cnblogs.com/youzhibing/p/7692366.html 来实现的,只是在他的基础上添加了页眉页脚及页眉 ...
- Java 实现word pdf在线预览
Java 实现word pdf在线预览 最近项目有这个需求,查找了一些资料,在这整理一下. 首先,pdf的文件,浏览器本身支持预览,不需要做什么处理. controller: 简单说下思路:就是利用i ...
- aspose-word for java word转pdf 解决遇到的问题
aspose-word for java word转pdf 解决遇到的问题 具体问题 在项目中使用aspose-word 把word转换为pdf 有次一份63页的文档转换出来的pdf为72页,正常情况 ...
最新文章
- 华章IT图书书讯(2012年第9期)
- 移动的验证码安全问题告诉移动网站后......,1860意指一般人不会这样做.
- c语言规定对使用的变量必须,C语言为什么要规定对所用到的变量要“先定义,后使用”...
- nebual的图数据结构
- 实战课堂:数据库高Library Cache Lock导致Hang的故障分析
- solr 高并发_预防帕金森病的运动并发症,比治疗更重要!
- 谷歌搜索363搜索引擎入口_SEO谷歌搜索引擎优化到底有啥好?
- eclipse中jsp文档无语法着色,安装Eclipse Java Web Developer Tools插件
- android 截屏 分享,Android应用内截图分享的实现记录
- hive if函数_数据仓库,Hive中使用 != 或 lt;gt;; 符号进行条件过滤时的坑
- 微型计算机系统王其藩,王其藩 系统动力学 附录Vensim模型集
- 使用C++实现“生命游戏“
- 微软CEO纳德拉:坚信Win10通用应用平台才是正道
- 【2.5TB,磁盘自费】535亿余次HTTP请求,来自IUB的Click数据集
- 效率源应邀出席“第九届刑侦、禁毒、反恐新技术新产品应用交流暨高峰论坛”
- Z变换 拉氏变换S z,r,w,s,Ts,jΩ关系
- 如何实现H5可视化编辑器的实时预览和真机扫码预览功能
- java面试常问问题及答案,附源代码
- 数据库——oracle
- 【IPv6】设置win10和win11允许访问IPv6站点
热门文章
- 跳频通信系统误码率matlab仿真,输出误码率
- mysql最大错误连接数_超过mysql最大连接的错误
- php authorize,php – Laravel中Request类中authorize方法的目的是什么?
- 【开源】使用C++实现的实时、可选房间、多人同房的你画我猜
- 1856 老赵的挑逗
- 鼠标移入之张嘴、闭眼
- mealy machine和moore machine
- 真相:朋友圈的“小黄图”从刷爆到被封的“惊魂七小时”
- 间隔时间计算公式_间隔
- Stable Diffusion WebUI 在电商场景生成 AI 模特搭配服装的方案探索