Java导出Pdf格式表单
前言
作为开发人员,工作中难免会遇到复杂表单的导出,接下来介绍一种通过Java利用模板便捷导出Pdf表单的方式
模拟需求
需求:按照下面格式导出pdf格式的学生成绩单

准备工作
- Excel软件
- Adobe Acrobat XI Pro软件
模板制作
第一步:利用Excel制作出上述表单,设置好字体、行高、列宽等,如下:

第二步:按照给定模板做好Excel表单后,删除需要后期填充的数据

第三步:打开Adobe Acrobat XI Pro软件,开始依据Excel模板制作PDF模板
1、单击创建、选择创建表单按钮

2、选择从现有文档创建,选择前面制作的Excel模板



3、点击工具,编辑表单


4、此时表单中只有一个文本域,我们可以点击添加新的文本域的形式来添加表头和结尾。也可以在pdf上添加一些其他控件。制作完成后如下:

5、可以通过鼠标在域中右键和属性中修改域的位置,字体、颜色、换行等


6、将制作好的表单保存
项目实现
第一步:创建基于maven的Java项目

第二步:引入itext的pom依赖
<!-- itextpdf依赖 -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.10</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
第六步:将上面制作的pdf模板放到Resources目录下,编写PdfUtils工具类
package com.whw.pdf;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.*;
import java.io.*;
import java.util.ArrayList;
public class PdfUtils {
public static void exportMapMZydPdf(String templatePath,String savePath,String fileName) throws DocumentException {
ByteArrayOutputStream byteArrayOutputStream = null;
PdfReader pdfReader = null;
FileOutputStream fileOutputStream=null;
try {
fileOutputStream=new FileOutputStream(savePath+"//"+fileName);
byteArrayOutputStream = new ByteArrayOutputStream();
pdfReader = new PdfReader(templatePath);
PdfStamper pdfStamper = new PdfStamper(pdfReader, byteArrayOutputStream);
//获取模板所有域参数
AcroFields acroFields = pdfStamper.getAcroFields();
//解决中文字体不显示的问题
BaseFont baseFont = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
ArrayList<BaseFont> fontArrayList = new ArrayList<BaseFont>();
fontArrayList.add(baseFont);
acroFields.setSubstitutionFonts(fontArrayList);
acroFields.setField("head", "xxx同学成绩单");
acroFields.setField("yuwen", "116");
acroFields.setField("shuxue", "115");
acroFields.setField("yingyu", "110");
acroFields.setField("zhengzhi", "89");
acroFields.setField("lishi", "90");
acroFields.setField("shengwu", "85");
acroFields.setField("dili", "83");
acroFields.setField("yinyue", "78");
acroFields.setField("tiyu", "88");
acroFields.setField("meishu", "80");
acroFields.setField("xiguan", "优秀");
acroFields.setField("nengli", "优秀");
acroFields.setField("xuexi", "优秀");
acroFields.setField("jl", "优秀");
acroFields.setField("weisheng", "良好");
acroFields.setField("pingyu", " 在校表现优秀。你关心同学,有很强的集体荣誉感,对待工作细致负责,学习上也比较踏实。老师相信你还有很大潜力没有挖掘出来,你要相信自己,不断挑战自我,加油!");
acroFields.setField("jc", "三号学生");
acroFields.setField("school", "xx市第一高级中学");
pdfStamper.setFormFlattening(true);//如果为false那么生成的PDF文件还能编辑,一定要设为true
pdfStamper.flush();
pdfStamper.close();
//设置纸张,可以在Excel制作是设定好纸张大小
Document doc = new Document(PageSize.A5);
PdfCopy copy = new PdfCopy(doc,fileOutputStream);
doc.open();
PdfImportedPage importPage = copy.getImportedPage(new PdfReader(byteArrayOutputStream.toByteArray()), 1);
try {
copy.addPage(importPage);
} catch (BadPdfFormatException e) {
e.printStackTrace();
}
doc.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (byteArrayOutputStream != null) {
try {
byteArrayOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fileOutputStream != null) {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (pdfReader != null) {
pdfReader.close();
}
}
}
public static void main(String[] args) throws IOException {
try {
String savePath="C://Users//hua//Desktop//";
String fileName="xxx同学成绩单.pdf";
exportMapMZydPdf("/成绩单模板.pdf",savePath,fileName);
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
第三步:运行main方法进行测试,并查看导出后的文件

项目文件:链接:https://pan.baidu.com/s/1xvrtd1HdXuImafMfrFcGrA 提取码:l0qh
写在最后
1、此种方式对Pdf居中自动换行支持性不好,可以根据文本域的宽度所能容纳的字数,创建多个文本域,对值进行手动分割填充到多个文本域。
2、C#开发时处理Excel文件可用NPOI插件进行数据导入导出,处理PDF文件可用ITextSharp插件。
上述介绍只是导出pdf表单的一种方式,也可以直接利用itext进行手动创作pdf表单或者导出Excel或World后台转换为pdf格式等。如有其它更好的方式或建议,欢迎留言一块交流!
Java导出Pdf格式表单的更多相关文章
- JAVA导出pdf实例
一.直接导出成PDF Java代码 1. import java.io.FileNotFoundException; 2. import java.io.FileOutputStream; 3. ...
- JSP页面导出PDF格式文件
JSP页面导出PDF格式文件基本在前端页面可以全部完成 <script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/ ...
- 获取一个表中的字段总数(mysql) Navicat如何导出Excel格式表结构 获取某个库中的一个表中的所有字段和数据类型
如何获取一个表中的字段总数 1.function show columns from 表明: 结果 : 2.functiuon select count(*) from INFORMATION_SCH ...
- 相册选择头像或者拍照 上传头像以NSData 图片二进制格式 表单上传
一.点击头像图片 或者按钮 在相册选择照片返回img,网络上传头像要用data表单上传 (1)上传头像属性 // 图片二进制格式 表单上传 @property (nonatomic, strong) ...
- confluence导出PDF格式文件不显示中文解决
由于confluence导出PDF格式文件需要应用字体文件,下载字体文件在confluence管理员界面安装即可. 我这里使用从simhei.ttf楷体,可以从windowns主机里下载(c:/win ...
- JAVA笔记-如何将百万级数据高效的导出到Excel表单
今天,一朋友问我使用JAVA有没有什么办法导出百万级的数据到Excel工作表. 当时我的第一个念头就是这真的是一个好疯狂的念头.然后就想假如真的有这样类似的需求,我自己应该怎么做呢? ps: 首先科普 ...
- java导出pdf功能记录
这几天已在做处理导出pdf文件的功能,摸索了几天总算可以了.记录下这几天遇到的问题. 1.网上基本都是基于Itext5和Itext7来处理的.我最终是在Itext5上成功了,itext7应该是模板出问 ...
- html/jsp导出pdf格式的几种方法(jsPDF,iText,wkhtmltopdf)
在许多生成报表的时候需要我们后台作出动态的数据,并渲染到前端生成pdf格式,Excel格式的各种报表,但是浏览器自带的生成pdf功能,windows系统的ctrl+p键就能完全搞定这一需求,但对客户来 ...
- Java导出pdf文件数据
提示:导出pdf文件,需要3个jar包iText-2.1.5.jar,iTextAsian.jar,iText-rtf-2.1.4.jar. public boolean outputPdfJhsy( ...
随机推荐
- Centos-文本过滤-grep
grep 文本过滤,对文本的每一行进行关键字搜索,如果找到则输出 相关选项 -A 除了列出符合关键字的行外,还输出符合关键字行后多少行内容 -c 只显示符号条件的行号 -f 批量搜索,把关键字写入到 ...
- Python练习题 020:累积累加
[Python练习题 020] 求1+2!+3!+...+20!的和 -------------------------------------------------- 据说这题是"累积累 ...
- 使用Maven那么久了,你对企业级Maven的核心配置了解多少?
写在前面 相信从事Java工作的小伙伴们多多少少都会接触到Maven.使用Maven来搭建项目,能够极大的方便我们构建项目的依赖关系,对于项目中需要依赖的Jar包,也只是简单的在pom.xml中进行配 ...
- Python基础-列表、元组、字典、字符串(精简解析)
一.列表 =====================================================1.列表的定义及格式: 列表是个有序的,可修改的,元素用逗号隔开,用中括号包围的序列 ...
- arduino 动态内存不足问题
亲测有用, 参考:https://blog.csdn.net/weixin_33915554/article/details/86975847 如果在代码中使用到一个数组,但是数组容量超过20000个 ...
- ECMASctipt6总结
1.let 变量声明以及特性 声明变量 let a; let b, c, d; let e = 1; let f = 2, g = 3; 特性 1.不能重复声明 2.块级作用域 只在块级作用域有效 ...
- 炉石传说酒馆战棋一键拔线(windows)
小编的业余游戏之一<炉石传说>,这里分享的是现在很火的游戏拔线(跳过约20秒的战斗动画),用夜吹的话说,注意,不是"日你大坝",是"整活",哈哈.小 ...
- 收到DE2+LCM+ D5M套件,拾回DE2,努力,奋进!
今天收到磐转寄的查无此人的DE2二手开发套件,准备用它来做科研验证!今天天是快学的第一天,参加电子设计竞赛会议.开集体会!
- 实验五 css进阶应用
实验五 css进阶应用 实验目的: 掌握CSS在列表中的应用,能利用CSS将列表做成精美的导航栏: 掌握CSS在表单元素中的应用: 掌握SPRY菜单的制作方法和CSS代码修改. 实验内容: 1. 制作 ...
- HCIA——应用层常用协议
DNS协议 1.什么是DNS协议呢? DNS协议简单来说就是为IP取一个别名的系统(叫域名如www.baidu.com),最终目的是便于我们记忆. 一个域名可能有多个IP,同样一个IP可能也会有多个域 ...