重要声明:本文章仅仅代表了作者个人对此观点的理解和表述。读者请查阅时持自己的意见进行讨论。

前言

有时候,业务系统要求提供一个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文件生成相关推荐

  1. python处理word或者pdf文件_利用python程序生成word和PDF文档的方法

    一.程序导出word文档的方法 将web/html内容导出为world文档,再java中有很多解决方案,比如使用Jacob.Apache POI.Java2Word.iText等各种方式,以及使用fr ...

  2. python 打开pdf文件_用Python开发的简易PDF阅读器

    主要的库 PyQt5:UI的开发 fitz:与pdf文件相关的操作几乎都用的是它 这是一个用Python开发的pdf阅读器,是软A项目的附加软件(虽然现在主程序几乎可以说还没有开始:joy:,只完成了 ...

  3. java 查看dump文件_[JAVA]JAVA章3 如何获取及查看DUMP文件

    一.dump基本概念 在故障定位(尤其是out of memory)和性能分析的时候,经常会用到一些文件来帮助我们排除代码问题.这些文件记录了JVM运行期间的内存占用.线程执行等情况,这就是我们常说的 ...

  4. java写出文本文档乱码_对象流如何写出到文件以及为什么乱码

    在写入对象文件的过程中,采用了txt文件,发现文件乱码,引发了思考. 首先需要理解好IO流是如何处理文件的. 1.ObjectOutputStream 对Java对象进行序列化处理,处理后的数据,不是 ...

  5. java调用项目中的文件_详解eclipse项目中.classpath文件的使用

    1 前言 在使用eclipse或者myeclipse进行java项目开发的时候,每个project(工程)下面都会有一个.classpath文件,那么这个文件究竟有什么作用? 2 作用 .classp ...

  6. xdf文件转换成pdf在线_在线PDFtodoc转换器智能转换PDF文件

    PDF将整个文件的字体.图片.音频.视频.样式等将其打包成一个文件,保证用户最佳体验效果,能保证打印效果.阅读效果.完美解决了多系统多端阅读.支持系统包括windows.Mac.iphone.andr ...

  7. python图片转pdf文件_用python 制作图片转pdf工具

    这篇文章主要介绍了用python 制作图片转pdf工具的思路及代码,非常详细,有需要的小伙伴参考下 最近因为想要看漫画,无奈下载的漫画是jpg的格式,网上的转换器还没一个好用的,于是乎就打算用pyth ...

  8. java程序解析perl文件_如何从shell脚本执行perl文件

    我有一个关于如何在shell脚本中执行perl文件的问题 我现在有两个文件,"test.sh"和"test.pl",这里是我的脚本示例 SHELL脚本 #!/b ...

  9. Java POI 导出EXCEL经典实现 Java导出Excel

    转自http://blog.csdn.net/evangel_z/article/details/7332535 在web开发中,有一个经典的功能,就是数据的导入导出.特别是数据的导出,在生产管理或者 ...

  10. Java POI 导出EXCEL经典实现 Java导出Excel弹出下载框

    原文转载:http://blog.csdn.net/evangel_z/article/details/7332535 目录(?)[+] 在web开发中,有一个经典的功能,就是数据的导入导出.特别是数 ...

最新文章

  1. java 关闭oracle连接_Java应用中Oracle连接不关闭
  2. 下列哪个可以选中矩形文字块_AI制作字母块文字效果
  3. 啊!你的服务又挂了?
  4. Vue 新手学习笔记:vue-element-admin 之安装,配置及入门开发
  5. SQLSTATE[42S22]: Column not found: 1054 Unknown column 'tbl_contact' in 'where clause'.
  6. attr与prop的区别
  7. anaconda下安装python,Windows下Anaconda的安装和简单使用方法
  8. Nacos Spring Boot 快速开始
  9. java 新特性之 stream 流
  10. 【Kafka】UnsupportedVersionException: The broker does not support DESCRIBE_LOG_DIRS
  11. eclipse添加maven配置
  12. python爬取汽车之家数据_Python神技能 | 使用爬虫获取汽车之家全车型数据
  13. 软考软件设计师下午真题-面向对象的程序设计与实现-装饰设计模式(2012年上半年试题六))Java代码讲解
  14. 如何做好学术演讲-01
  15. cad快看_星期日来啦!分享5个珍藏已久的电影网站,各种大片免费看
  16. python中有这样一条语句_在Python中一行书写两条语句时,语句之间可以使用__________作为分隔符。_学小易找答案...
  17. 跳一跳改分java源码_解密微信小程序漏洞:可下载任意小游戏源代码,“跳一跳”可改分...
  18. 如何保证用log4J 写log 的时间和系统设置的timezone 保持一致
  19. access订单明细表怎么做_如何制作材料明细表...doc
  20. 机器学习:python实现LDA降维算法

热门文章

  1. android中可口的吐司,一种信息提示机制——Toast
  2. 软工三(5.12上课)
  3. reactjs ref属性:字符串类型的ref和createRef
  4. Hadoop Yarn容量调度器特点和分配算法介绍
  5. DEEPIN 20安装镜像进入LIVE模式
  6. linux deepin 升级内核命令
  7. golang管道channel的基本使用及注意事项:往管道中存取数据
  8. 【网址收藏】spark on k8s operator github地址
  9. Scala函数的可变参数和参数默认值及带名参数
  10. zuul过滤器执行生命周期