Java使用itext5实现PDF表格文档导出

最近拿到一个需求,需要导出PDF文档,市面上可以实现的方法有很多,经过测试和调研决定使用itext5来实现,话不多说,说干就干。

1.依赖导入

<!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
  <dependency>
   <groupId>com.itextpdf</groupId>
   <artifactId>itextpdf</artifactId>
   <version>5.5.13.1</version>
  </dependency>
  <!-- https://mvnrepository.com/artifact/com.itextpdf/itext-asian -->
  <dependency>
   <groupId>com.itextpdf</groupId>
   <artifactId>itext-asian</artifactId>
   <version>5.2.0</version>
  </dependency>

这里说明下:上面的依赖就是主要实现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);
// 这个可以设置内容的margin
document.setMargins(45f, 45f, 65f, 50f);

7.效果展示

8.总结

好了,到这里打印PDF文档就完全实现了,其实itext5还有很多功能,比如:文本,图片,链接都可以实现,大家如果有需求可以去官方文档看看,也可以留言问我,小弟第一篇博客,有什么错误希望大家在留言中提出,我好及时改正,免得误人子弟哈哈。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java 如何往已经存在的excel表格里面追加数据的方法

    第一步.导入jar包,两个 poi.jar包  地址在 https://www.jb51.net/softs/542575.html jxl.jar包  地址在  https://www.jb51.net/softs/544392.html 第二步.编写程序 package cn.com.com; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import

  • JAVA导出EXCEL表格的实例教学

    小伙伴们,最近比较忙,没什么时间写,今天给大家分享的是JAVA如何导出EXCEL表格,因为最近有做这样一个功能,所以分享出来,如有不对之处,敬请指正. 在许多企业办公系统中,经常会有用户要求,需要对数据进行统计并且可以直接下载Excel文件,这样子的话,既然客户提出了要求,我们就应该去满足吖,毕竟客户是上帝嘛,那么我们如何去实现呢?且看我为你一一道来. POI简介:Jakarta POI 是一套用于访问微软格式文档的Java API.Jakarta POI有很多组件组成,其中有用于操作Excel

  • Java表格JTable代码实例解析

    代码如下: import javax.swing.JTable; import javax.swing.table.AbstractTableModel; import javax.swing.JScrollPane; import javax.swing.JFrame; import javax.swing.JOptionPane; import java.awt.*; import java.awt.event.*; public class JTableDemo extends JFram

  • Java Swing组件编程之JTable表格用法实例详解

    本文实例讲述了Java Swing组件编程之JTable表格用法.分享给大家供大家参考,具体如下: 表格是GUI编程中使用较多,但也是最麻烦的一个控件之一.表格是用来显示二维数据,提供编辑,选择等功能.如果只是显示数据,这还是非常easy的,只要在JTable中传入二维数组或集合就可以了. 示例1: package awtDemo; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTab

  • java实现表格tr拖动的实例(分享)

    实现功能:实现表格tr拖动,并保存因为拖动改变的等级. jsp代码 <div id="mainContainer"> <div class="contentCol"> <div id="b_center"> <div class="mod mod1 parent-table" id="launch-detail-table"> <div class=&q

  • JAVA图形界面(GUI)之表格的示例代码

    表格(JTable)是我们在GUI开发中很常用的一个组件.表格在可视化编程中用于显示信息,在Swing编程中非常有用,当要显示大量数据时,用表格可以清晰的显示出来. 本篇博客将演示JTable的基本用法. 构造方法: 方法名 说明 JTable() 构造一个默认的 JTable,使用默认的数据模型.默认的列模型和默认的选择模型对其进行初始化 JTable(int numRows, int numColumns) 使用 DefaultTableModel 构造具有 numRows 行和 numCo

  • Java在PDF中添加表格过程详解

    前言 本文将介绍通过Java编程在PDF文档中添加表格的方法.添加表格时,可设置表格边框.单元格对齐方式.单元格背景色.单元格合并.插入图片.设置行高.列宽.字体.字号等. 使用工具:Free Spire.PDF for Java (免费版) Jar文件获取及导入: 方法1:通过官网下载jar文件包.下载后,解压文件,将lib文件夹下的Spire.Pdf.jar文件导入Java程序. 方法2:通过maven仓库安装导入. Java 代码示例 Java代码 import com.spire.pdf

  • Java使用itext5实现PDF表格文档导出

    最近拿到一个需求,需要导出PDF文档,市面上可以实现的方法有很多,经过测试和调研决定使用itext5来实现,话不多说,说干就干. 1.依赖导入 <!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf --> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> &l

  • Java使用poi包读取Excel文档代码分享

    项目需要解析Excel文档获取数据,就在网上找了一些资料,结合自己这次使用,写下心得: 1.maven项目需加入如下依赖: <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.10-FINAL</version> </dependency> <dependency> <gr

  • Python实现将doc转化pdf格式文档的方法

    本文实例讲述了Python实现将doc转化pdf格式文档的方法.分享给大家供大家参考,具体如下: #-*- coding:utf-8 -*- # doc2pdf.py: python script to convert doc to pdf with bookmarks! # Requires Office 2007 SP2 # Requires python for win32 extension import sys, os from win32com.client import Dispa

  • Java基于状态模式实现的文档编辑模式切换功能实例

    本文实例讲述了Java基于状态模式实现的文档编辑模式切换功能.分享给大家供大家参考,具体如下: 一 模式定义 状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来就像是改变了其类. 二 模式举例 1 模式分析 我们借用文档编辑模式切换这一案例来说明这一模式. 2 状态模式静态类图 3 代码示例 3.1 创建状态接口一IState package com.demo.state; import com.demo.context.Context; /** * * 状态接口 * * @au

  • idea创建JAVA Class时自动生成头部文档注释的方法

    IDEA设置文档注释模板 创建Class文件时自动生成的头部注释如图 如何配置idea的头部注释格式,可以生成像之前的注释格式一样的文档注释? File->settings->Editor->File and Code Templates->Files->Class 原先模板 #if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end #parse(&

  • python读取pdf格式文档的实现代码

    python读取pdf文档 一. 准备工作 安装对应的库 pip install pdfminer3k pip install pdfminer.six 二.部分变量的含义 PDFDocument(pdf文档对象) PDFPageInterpreter(解释器) PDFParser(pdf文档分析器) PDFResourceManager(资源管理器) PDFPageAggregator(聚合器) LAParams(参数分析器) 三.PDFMiner类之间的关系 PDFMiner的相关文档(点击

  • java集成开发SpringBoot生成接口文档示例实现

    目录 为什么要用Swagger ? Swagger集成 第一步: 引入依赖包 第二步:修改配置文件 第三步,配置API接口 Unable to infer base url For input string: "" Swagger美化 第一步: 引入依赖包 第二步:启用knife4j增强 Swagger参数分组 分组使用说明 1.在bean对象的属性里配置如下注释 2.在接口参数的时候加入组规则校验 小结 大家好,我是飘渺. SpringBoot老鸟系列的文章已经写了两篇,每篇的阅读反

  • 将Swagger2文档导出为HTML或markdown等格式离线阅读解析

    网上有很多<使用swagger2构建API文档>的文章,该文档是一个在线文档,需要使用HTTP访问.但是在我们日常使用swagger接口文档的时候,有的时候需要接口文档离线访问,如将文档导出为html.markdown格式.又或者我们不希望应用系统与swagger接口文档使用同一个服务,而是导出HTML之后单独部署,这样做保证了对接口文档的访问不影响业务系统,也一定程度提高了接口文档的安全性.核心的实现过程就是: 在swagger2接口文档所在的应用内,利用swagger2markup将接口文

  • java调用openoffice将office系列文档转换为PDF的示例方法

    前导: 发过程中经常会使用java将office系列文档转换为PDF, 一般都使用微软提供的openoffice+jodconverter 实现转换文档. openoffice既有windows版本也有linux版.不用担心生产环境是linux系统. 1.openoffice依赖jar,以maven为例: <dependency> <groupId>com.artofsolving</groupId> <artifactId>jodconverter<

  • Java使用Apache POI库读取Excel表格文档的示例

    Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能. 项目下载页:http://poi.apache.org/download.html Apache POI 是创建和维护操作各种符合Office Open XML(OOXML)标准和微软的OLE 2复合文档格式(OLE2)的Java API.用它可以使用Java读取和创建,修改MS Excel文件.而且,还可以使用Jav

随机推荐