Java如何使用itext5实现PDF表格文档导出
发表于:2025-02-06 作者:千家信息网编辑
千家信息网最后更新 2025年02月06日,这篇文章主要介绍了Java如何使用itext5实现PDF表格文档导出,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.依赖导入 com.itextpdf itextpdf 5.5.13.1 com.itextpdf itext-asian 5.2.0
这里说明下:上面的依赖就是主要实现PDF生成的,下面的依赖是中文字体相关依赖;
2.PDF表格导出实现
1.导出PDF
// 1.打开文档并设置基本属性 Document document = new Document();// 2.设置请求头,encode文件名 response.setContentType("application/pdf;charset=UTF-8"); response.setHeader("Content-Disposition", "attachment; filename=" + java.net.URLEncoder.encode("" + recordDto.getTitle() + ".pdf", "UTF-8"));// 3.通过流将pdf实例写出到浏览器 PdfWriter writer = PdfWriter.getInstance(document, response.getOutputStream());
至此导出PDF已经实现了,只是这个PDF中什么内容都没有,明白这一点,接下来做的就是给这个文档"加料"咯(这里的response就是HttpServletResponse)。
2.页面美化
// 这里的wirter就是上文的writer writer.setViewerPreferences(PdfWriter.PageModeUseThumbs); writer.setPageSize(PageSize.A4);
这里设置了文档的显示缩略图以及文档大小为A4;
3.中文字体设置
public static Font getPdfChineseFont() throws Exception { BaseFont bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); Font fontChinese = new Font(bfChinese, 12, Font.NORMAL); fontChinese.setColor(BaseColor.BLACK); fontChinese.setSize(11); return fontChinese; }
这个方法设置了中文字体样式,感兴趣的同学可以试试其他的样式,例如:字体颜色,大小,字体都可以修改;
4.输出表格内容到文档
// 首先打开文档document.open();// 向文档中添加表格数据private static void printBasicInfo(ShopApplyRecordDto recordDto, Document document, Font font) throws DocumentException {// 表格中的数据 Object[][] basicDatas = { {"标题","xxx申请", "审批编号","1234"}, {"申请人","小明", "申请商铺","xxx商场"}, {"申请日期","2020/1/16", "审批结果","同意")}};// 每个cell的宽度 float[] widthss = {50, 200, 50, 200};// 创建一个表格,每一行有四个cell PdfPTable basicTable = new PdfPTable(widthss);// 外层循环表格的行 for (int i = 0; i < basicDatas.length; i++) {// 内层循环每一行具体数据 for (int j = 0; j < basicDatas[i].length; j++) {// 新建一个cell PdfPCell cell = new PdfPCell();// 这个方法是统一设置表格和cell的样式,下面会写 setTableStyle(basicTable, cell);// cell中需要填充数据的格式 Paragraph paragraph = new Paragraph(StrUtil.toString(basicDatas[i][j]), font);// 设置cell的值 cell.setPhrase(paragraph);// 将cell添加到表格中 basicTable.addCell(cell); } }// 将表格添加到文档中 document.add(basicTable); }// 结束时要关闭文档document.close();
大功告成,现在导出的PDF中已经有了类似这样的表格了:
当然你的样式会很丑,接下来我们来设置下样式。
5.表格和cell样式设置
public static void setTableStyle(PdfPTable table, PdfPCell cell) {// 设置表格样式 table.setLockedWidth(true); table.setTotalWidth(500); table.setHorizontalAlignment(Element.ALIGN_LEFT);// 设置单元格样式 cell.setMinimumHeight(35); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setVerticalAlignment(Element.ALIGN_MIDDLE); cell.setBackgroundColor(BaseColor.WHITE); cell.setBorder(0); cell.setBorderWidthTop(0.1f); cell.setBorderWidthBottom(0.1f); cell.setBorderWidthLeft(0.1f); cell.setBorderWidthRight(0.1f); cell.setBorderColorBottom(BaseColor.BLACK); cell.setBorderColorLeft(BaseColor.BLACK); cell.setBorderColorRight(BaseColor.BLACK); cell.setBorderColorTop(BaseColor.BLACK); cell.setPadding(3); }
api方法还是比较易懂的,这里就不多赘述了,不明白的自己设置试试就可以做出自己喜欢的样式咯。
6.页眉和页码的设置
这里说明下,itext2和itext5的api有很大不同,2的版本有一个专门的HeaderFooter类来设置样式,5的版本没有这样的类,取而代之的是PdfPageEventHelper这样一个事件处理类,这里大家千万别弄混了,这两个版本的api互相不兼容;这里首先写一个PdfPageEventHelper的子类来实现页眉页码的打印:
public class HeaderFooter extends PdfPageEventHelper {// 这里是业务相关的属性可以无视 private ShopApplyRecordDto recordDto; private SysUserInfo userInfo;// 大部分情况下页眉的值是动态的,这里可以在初始化的时候进行参数传递 public HeaderFooter(ShopApplyRecordDto recordDto, SysUserInfo userInfo) { this.recordDto = recordDto; this.userInfo = userInfo; } public HeaderFooter() { } public ShopApplyRecordDto getRecordDto() { return recordDto; } public void setRecordDto(ShopApplyRecordDto recordDto) { this.recordDto = recordDto; } public SysUserInfo getUserInfo() { return userInfo; } public void setUserInfo(SysUserInfo userInfo) { this.userInfo = userInfo; }// 这个方法就是实现页眉和页码的关键:它的含义是每当页面结束会执行该方法 @Override public void onEndPage(PdfWriter writer, Document document) { Font font = null; try { font = getPdfChineseFont(); } catch (Exception e) { e.printStackTrace(); } SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd HH:mm");// 设置页眉:这里图省事就用空格来实现左中右三个位置的页眉,其实可以写三个,通过Element.ALIGN_LEFT来控制页眉的位置,document.left()/document.top()这两个可以设置页眉具体位置类似于html的上下调整,大家可以多试试 ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_LEFT, new Phrase("所属项目:" + recordDto.getMallName() + " 打印时间:" + format.format(new Date()) + " 打印人:" + userInfo.getUserName(), font), document.left(), document.top() + 3, 0);// 获得一个名为"art"的盒子 Rectangle rect = writer.getBoxSize("art");// 设置页码:这里的页码位置已经设置好,大家可直接使用,至于1/20这种效果的页码实现则十分复杂,如有需求请自行百度/谷歌 ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_CENTER, new Phrase(String.format("%d", writer.getPageNumber())), (rect.getLeft() + rect.getRight()) / 2, rect.getBottom() - 18, 0); } public static Font getPdfChineseFont() throws Exception { BaseFont bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); Font fontChinese = new Font(bfChinese, 12, Font.NORMAL); fontChinese.setColor(BaseColor.BLACK); fontChinese.setSize(11); return fontChinese; }} 接下来就很简单了,将我们的HeaderFooter设置给PdfWriter对象即可:// 新建HeaderFooter并传递需要的参数HeaderFooter headerFooter = new HeaderFooter(recordDto, userInfo);// 新建一个盒子Rectangle rect = new Rectangle(36, 54, 559, 788);// 设置名称为"art",上面get的就是这个盒子了writer.setBoxSize("art", rect);writer.setPageEvent(headerFooter);// 这个可以设置内容的margindocument.setMargins(45f, 45f, 65f, 50f);
感谢你能够认真阅读完这篇文章,希望小编分享的"Java如何使用itext5实现PDF表格文档导出"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!
表格
文档
样式
页眉
就是
页码
字体
方法
位置
数据
篇文章
接下来
中文字体
内容
版本
盒子
中文
一行
三个
两个
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
科技风互联网企业宣传汇报
arcmap 地理数据库
中国电科网络安全研究院毛得明
数据库编程技术与文件操作
宁波网络安全准入控制报价
o2o电商软件开发怎么样
用友里的数据怎么导数据库
sql服务器注册条件
数据库技术sql版本
淘宝怎么设置无法连接服务器
网络技术云计算的文案
儋州市国家网络安全宣传
美国数据库公司上市
我的世界服务器帮派管理
漫画怎么存数据库
耽美小说软件开发
数据库关键字类型
青浦区口碑好软件开发采购信息
我的世界怎么传到服务器
小程序模板怎样导入数据库
广东广电网络u 点服务器
非关系型数据库完整性好吗
数据库校验码技术
软件开发方向是学什么的
数据库书籍 英文
中国影响力人物数据库两会
多功能软件开发
数据库是进程么
如何查看数据库触发是否启动
华为存储服务器如何下载