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的导出?相关推荐

  1. java spring maven pdf 导出

    2019独角兽企业重金招聘Python工程师标准>>> pdf表单模板 js : 渲染出动态的html ,其实就是一个a标签 Visitor.operateFormatter = f ...

  2. Java解析PDF文件(PDFBOX、itext解析PDF)导出PDF中的子图片,去除PDF中的水印

    前段时间,为了解析PDF,花了不少时间去学习PDFbox和itext,这两个都是处理PDF的开源库,有java和C#的.作为一个刚开始学习这两个开源库的,感觉百度上的资源还是太少了.我做的是一个关于P ...

  3. Java代码实现PDF中表格导出到Excel

    表格常见于 PDF 发票和财务报告中.您可能会遇到需要将 PDF 表格数据导出到 Excel 中的情况,以便您可以使用 MS Excel 提供的工具对数据进行分析.本文介绍了如何使用 Spire.Of ...

  4. java导出PDF、iText5导出漂亮表格PDF、导出指定格式水印PDF

    我们在项目当中经常要导出pdf文档,pdf文档还要按一定的格式导出,以下介绍导出pdf文档功能: 1)支持A4纸大小导出 2)指定文字显示的位置 3)支持表格展示数据 4)添加水印 开源下载 java ...

  5. Java实现文件批量导入导出实例(兼容xls,xlsx)

    <link href="https://csdnimg.cn/public/favicon.ico" rel="SHORTCUT ICON"> &l ...

  6. Java自动生成PDF并进行邮件群发

    这段时间,公司承办一个互联网峰会,需要对4000多位客户发送邀请函,其中包括一个pdf文件和一封手写信,PDF中将从公司数据库中读取所有客户姓名,自动生成到相应位置,前期尝试Java自动生成pdf文件 ...

  7. iText + Freemarker实现pdf的导出,支持页眉添加图片,及其他的基础功能

    本文为了记录自己的实现过程,具体的实现步骤是参考博文 https://www.cnblogs.com/youzhibing/p/7692366.html 来实现的,只是在他的基础上添加了页眉页脚及页眉 ...

  8. Java 实现word pdf在线预览

    Java 实现word pdf在线预览 最近项目有这个需求,查找了一些资料,在这整理一下. 首先,pdf的文件,浏览器本身支持预览,不需要做什么处理. controller: 简单说下思路:就是利用i ...

  9. aspose-word for java word转pdf 解决遇到的问题

    aspose-word for java word转pdf 解决遇到的问题 具体问题 在项目中使用aspose-word 把word转换为pdf 有次一份63页的文档转换出来的pdf为72页,正常情况 ...

最新文章

  1. 华章IT图书书讯(2012年第9期)
  2. 移动的验证码安全问题告诉移动网站后......,1860意指一般人不会这样做.
  3. c语言规定对使用的变量必须,C语言为什么要规定对所用到的变量要“先定义,后使用”...
  4. nebual的图数据结构
  5. 实战课堂:数据库高Library Cache Lock导致Hang的故障分析
  6. solr 高并发_预防帕金森病的运动并发症,比治疗更重要!
  7. 谷歌搜索363搜索引擎入口_SEO谷歌搜索引擎优化到底有啥好?
  8. eclipse中jsp文档无语法着色,安装Eclipse Java Web Developer Tools插件
  9. android 截屏 分享,Android应用内截图分享的实现记录
  10. hive if函数_数据仓库,Hive中使用 != 或 lt;gt;; 符号进行条件过滤时的坑
  11. 微型计算机系统王其藩,王其藩 系统动力学 附录Vensim模型集
  12. 使用C++实现“生命游戏“
  13. 微软CEO纳德拉:坚信Win10通用应用平台才是正道
  14. 【2.5TB,磁盘自费】535亿余次HTTP请求,来自IUB的Click数据集
  15. 效率源应邀出席“第九届刑侦、禁毒、反恐新技术新产品应用交流暨高峰论坛”
  16. Z变换 拉氏变换S z,r,w,s,Ts,jΩ关系
  17. 如何实现H5可视化编辑器的实时预览和真机扫码预览功能
  18. java面试常问问题及答案,附源代码
  19. 数据库——oracle
  20. 【IPv6】设置win10和win11允许访问IPv6站点

热门文章

  1. 跳频通信系统误码率matlab仿真,输出误码率
  2. mysql最大错误连接数_超过mysql最大连接的错误
  3. php authorize,php – Laravel中Request类中authorize方法的目的是什么?
  4. 【开源】使用C++实现的实时、可选房间、多人同房的你画我猜
  5. 1856 老赵的挑逗
  6. 鼠标移入之张嘴、闭眼
  7. mealy machine和moore machine
  8. 真相:朋友圈的“小黄图”从刷爆到被封的“惊魂七小时”
  9. 间隔时间计算公式_间隔
  10. Stable Diffusion WebUI 在电商场景生成 AI 模特搭配服装的方案探索