java itext 导出pdf文件_【Java,PDF】使用Itext实现PDF文件生成
重要声明:本文章仅仅代表了作者个人对此观点的理解和表述。读者请查阅时持自己的意见进行讨论。
前言
有时候,业务系统要求提供一个PDF文件导出的功能,这时候我们就需要将数据库的对应数据查询出来,然后生成PDF并提供下载,这其中比较陌生的部分相信就是如何使用这些数据生成一个PDF文件了,本文讲述了使用 Itext 在Java后端生成PDF的方法,不妨来看看一吧。
一、加入依赖
首要第一步则是加入Itext的依赖,然后才可以使用相关的操作类。Itext 的依赖不是都在一个包里,它分了许许多多模块,但基本的生成PDF的依赖包只需要引入2个即可。
首先是核心包:
com.itextpdf
itextpdf
5.5.13
然后需要引入对中文支持的包,毕竟大部分文档中都会有中文内容的。
com.itextpdf
itext-asian
5.2.0
只需要引入这两个包,就可以完成基本的生成PDF操作了。
二、开始使用
Itext 的用法十分简单,大致可以分为下面几步:
构建文档
打开文档编辑功能
插入文档内容
关闭文档编辑功能
1、构建文档
Itext 构建文档是通过 Document 类进行构建,不过要注意,大多数项目里面应该存在许多个 Document 类了,这里一定要使用 com.itextpdf.text 包下面的 Document 类。这个类包含一个无参构造函数,意味着可以十分方便的 new 一个空文档出来:
Document document = new Document();
默认创建的是 A4 纸大小、内边距 36 的PDF文档。如果你希望创建不同大小以及不同边距的文档,你可以使用带参构造函数:
Document documentA8 = new Document(PageSize.A8);
Document documentA8_2 = new Document(PageSize.A8, 10, 10, 10,10);
这里构建了 2 个文档,第一个文档设定了大小为 A8 纸张大小, 第二个文档设定了边距为 10,这些边距值分别对应左, 右, 上, 下。构建好了文档,就可以开始进行文档编辑了。
2、 打开文档编辑功能
在编辑之前,需要先认识一个类 PdfWriter,这个类帮助我们打开文档的编辑功能,同时能指定将pdf文件输出到对应的输出流里面,意味着我们如果使用文件输出流,它就可以将pdf文件输出到文件中。
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream("D:/test.pdf"));
document.open();
使用 PdfWriter.getInstance 方法可以将文件到指定输出流,传入文件输出流可实现输出到文件。然后调用 document.open 方法打开编辑功能,只有调用了此方法之后,才可以对 document 进行编辑。
3、 插入内容及中文
现在,可以放心的向文档中插入内容了,不如先插入一个段落在文档中试一试, 使用 com.itextpdf.text.Paragraph 类可以实现对段落的构建,先来看个效果:
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream("D:/test.pdf"));
document.open();
// 新建一个段落,内容 Hello Pdf.
Paragraph p1 = new Paragraph("Hello Pdf.");
document.add(p1);
document.close();
最后不要忘了执行关闭。打开D盘,发现文件test.pdf,效果如图:
似乎非常完美,但当我把 “Hello” 改成 “你好”后,再一次生成文档:
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream("D:/test.pdf"));
document.open();
Paragraph p1 = new Paragraph("你好 Pdf.");
document.add(p1);
document.close();
再次运行,得到效果:
发现中文并没有被显示出来,这时候就需要用到刚才添加的第二个依赖了。要让中文显示正常,需要借助中文字体来实现这个需求,itext-asian 包内置了一个中文字体提供使用。建立使用 itext-asian 内置中文支持:
BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font mfont = new Font(bfChinese, 15, Font.NORMAL, BaseColor.BLACK);
首先使用内置字体建立基本字体类型,然后建立段落可以使用的字体对象,最后,mfont 对象就可以传递给 Paragraph,从而实现中文支持。代码如下:
BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font mfont = new Font(bfChinese, 15, Font.NORMAL, BaseColor.BLACK);
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream("D:/test.pdf"));
document.open();
Paragraph p1 = new Paragraph("你好 Pdf.", mfont);
document.add(p1);
document.close();
运行效果图如下:
.
有时候这个字体并不能满足需求,你可以自己使用自己的字体文件来实现个性化字体:
// 使用window内置的等线字体
BaseFont.createFont("C:/Windows/Fonts/Deng.ttf", BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
// 使用自己的字体文件
BaseFont.createFont("D:/思源黑体正常字体.ttf", BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
三、Itext 提供的各种文档组件
上面简单的介绍了段落使用方法,其实Itext除了段落组件,还提供了许多其他的组件封装,比较常用的组件见下表:
类介绍
com.itextpdf.text.Anchor功能类似锚点、超链接
com.itextpdf.text.Chapter章节
com.itextpdf.text.Chunk能添加到文档里的最小文本块
com.itextpdf.text.Header这个信息不会显示到pdf,常常是编辑者自己定义的一些文档先关信息
com.itextpdf.text.Image图片
com.itextpdf.text.JpegJpeg的图片,其实它继承自Image
com.itextpdf.text.List列表,这里面放 ListItem
com.itextpdf.text.ListItem列表条目
com.itextpdf.text.Meta这个和Header类似,但这是固定的一些文档信息,字段名只允许:subject,title,keywords,author,creationdate,producer
com.itextpdf.text.Paragraph文本段落
com.itextpdf.text.Phrase文本,这就好像html里面的span,它可以设定自己的样式。
四、导出PDF
当你把你的各个数据全部写入到了 document 里面后,就可以将这个 document 导出给请求端了,如果我们把这个文档像这样进行构建写操作:
PdfWriter.getInstance(document, new FileOutputStream("D:/test.pdf"));
那么我们的pdf文件就会被保存到服务器里面,而我们的目标是导出给请求端,所以,只需要把 第二个参数从文件输出流变成响应输出流即可:
// ... 更多代码
PdfWriter.getInstance(document, response.getOutputStream());
// ... 跟多代码
java itext 导出pdf文件_【Java,PDF】使用Itext实现PDF文件生成相关推荐
- python处理word或者pdf文件_利用python程序生成word和PDF文档的方法
一.程序导出word文档的方法 将web/html内容导出为world文档,再java中有很多解决方案,比如使用Jacob.Apache POI.Java2Word.iText等各种方式,以及使用fr ...
- python 打开pdf文件_用Python开发的简易PDF阅读器
主要的库 PyQt5:UI的开发 fitz:与pdf文件相关的操作几乎都用的是它 这是一个用Python开发的pdf阅读器,是软A项目的附加软件(虽然现在主程序几乎可以说还没有开始:joy:,只完成了 ...
- java 查看dump文件_[JAVA]JAVA章3 如何获取及查看DUMP文件
一.dump基本概念 在故障定位(尤其是out of memory)和性能分析的时候,经常会用到一些文件来帮助我们排除代码问题.这些文件记录了JVM运行期间的内存占用.线程执行等情况,这就是我们常说的 ...
- java写出文本文档乱码_对象流如何写出到文件以及为什么乱码
在写入对象文件的过程中,采用了txt文件,发现文件乱码,引发了思考. 首先需要理解好IO流是如何处理文件的. 1.ObjectOutputStream 对Java对象进行序列化处理,处理后的数据,不是 ...
- java调用项目中的文件_详解eclipse项目中.classpath文件的使用
1 前言 在使用eclipse或者myeclipse进行java项目开发的时候,每个project(工程)下面都会有一个.classpath文件,那么这个文件究竟有什么作用? 2 作用 .classp ...
- xdf文件转换成pdf在线_在线PDFtodoc转换器智能转换PDF文件
PDF将整个文件的字体.图片.音频.视频.样式等将其打包成一个文件,保证用户最佳体验效果,能保证打印效果.阅读效果.完美解决了多系统多端阅读.支持系统包括windows.Mac.iphone.andr ...
- python图片转pdf文件_用python 制作图片转pdf工具
这篇文章主要介绍了用python 制作图片转pdf工具的思路及代码,非常详细,有需要的小伙伴参考下 最近因为想要看漫画,无奈下载的漫画是jpg的格式,网上的转换器还没一个好用的,于是乎就打算用pyth ...
- java程序解析perl文件_如何从shell脚本执行perl文件
我有一个关于如何在shell脚本中执行perl文件的问题 我现在有两个文件,"test.sh"和"test.pl",这里是我的脚本示例 SHELL脚本 #!/b ...
- Java POI 导出EXCEL经典实现 Java导出Excel
转自http://blog.csdn.net/evangel_z/article/details/7332535 在web开发中,有一个经典的功能,就是数据的导入导出.特别是数据的导出,在生产管理或者 ...
- Java POI 导出EXCEL经典实现 Java导出Excel弹出下载框
原文转载:http://blog.csdn.net/evangel_z/article/details/7332535 目录(?)[+] 在web开发中,有一个经典的功能,就是数据的导入导出.特别是数 ...
最新文章
- java 关闭oracle连接_Java应用中Oracle连接不关闭
- 下列哪个可以选中矩形文字块_AI制作字母块文字效果
- 啊!你的服务又挂了?
- Vue 新手学习笔记:vue-element-admin 之安装,配置及入门开发
- SQLSTATE[42S22]: Column not found: 1054 Unknown column 'tbl_contact' in 'where clause'.
- attr与prop的区别
- anaconda下安装python,Windows下Anaconda的安装和简单使用方法
- Nacos Spring Boot 快速开始
- java 新特性之 stream 流
- 【Kafka】UnsupportedVersionException: The broker does not support DESCRIBE_LOG_DIRS
- eclipse添加maven配置
- python爬取汽车之家数据_Python神技能 | 使用爬虫获取汽车之家全车型数据
- 软考软件设计师下午真题-面向对象的程序设计与实现-装饰设计模式(2012年上半年试题六))Java代码讲解
- 如何做好学术演讲-01
- cad快看_星期日来啦!分享5个珍藏已久的电影网站,各种大片免费看
- python中有这样一条语句_在Python中一行书写两条语句时,语句之间可以使用__________作为分隔符。_学小易找答案...
- 跳一跳改分java源码_解密微信小程序漏洞:可下载任意小游戏源代码,“跳一跳”可改分...
- 如何保证用log4J 写log 的时间和系统设置的timezone 保持一致
- access订单明细表怎么做_如何制作材料明细表...doc
- 机器学习:python实现LDA降维算法