十二月份一直在做生成报表的功能,中间踩了不少坑,刚好今天有时间,写篇博客记录一下。

一、iText 简介

iText 是著名开放源码站点 sourceforge 的一个项目,是一个用于生成 PDF 文档的 java 类库。通过 iText 不仅可以生成 PDF 或 rtf 的文档,而且可以将 XML、Html 文件转化为 PDF 文件。 —— 百度百科

二、添加 JAR 包

首先在项目中添加 iText 依赖包,公司项目是用 Maven 管理的,可以在网站 mvnrepository 中搜索 iText,查询相关依赖配置,然后在项目 pom.xml 文件中加入相关配置,如下:

<dependency>
  <groupId>com.lowagie</groupId>
  <artifactId>itext</artifactId>
  <version>2.1.7</version>
</dependency>

<dependency>
  <groupId>com.lowagie</groupId>
  <artifactId>itext-rtf</artifactId>
  <version>2.1.7</version>
</dependency>

三、常见问题

3.1 设置中文字体

Font arialFont = new RtfFont("黑 体");
Font songFont = new RtfFont("宋 体");
Font imitationSongFont = new RtfFont("仿宋");

注意,有的中文字体字符串中间要用空格隔开,有的不用,须自己测试。

3.2 不同等级标题

iText 默认只有三级标题。

RtfParagraphStyle oneLevelTitleStyle = RtfParagraphStyle.STYLE_HEADING_1;
RtfParagraphStyle twoLevelTitleStyle = RtfParagraphStyle.STYLE_HEADING_2;
RtfParagraphStyle threeLevelTitleStyle = RtfParagraphStyle.STYLE_HEADING_2;

如果要创建四级或五级标题怎么办?查看 iText 源码我们可以发现,iText 一二三级标题定义。

/**
 * The style for level 1 headings.
 */
public static final RtfParagraphStyle STYLE_HEADING_1 = new RtfParagraphStyle("heading 1", "Normal");
/**
 * The style for level 2 headings.
 */
public static final RtfParagraphStyle STYLE_HEADING_2 = new RtfParagraphStyle("heading 2", "Normal");
/**
 * The style for level 3 headings.
 */
public static final RtfParagraphStyle STYLE_HEADING_3 = new RtfParagraphStyle("heading 3", "Normal");

我们可以参照源码,创建一个四级标题。

public static final RtfParagraphStyle STYLE_HEADING_4 = new RtfParagraphStyle("heading 4", "Normal");

但光这样还不行,我们需要注册我们创建的 STYLE_HEADING_4

RtfWriter2 writer = RtfWriter2.getInstance(doc, outputStream);
RtfDocumentSettings settings = writer.getDocumentSettings();
settings.registerParagraphStyle(STYLE_HEADING_4);

3.3 排版问题

虽然通过 iText API 可以找到所有排版的设置方法,但找起来实在是麻烦,所以还是记录一下。

段落

Paragraph paragraph = new Paragraph(content, font);
paragraph.setFirstLineIndent(30f); // 设置首行缩进
paragraph.setLeading(24f); // 设置行间距
paragraph.setSpacingAfter(10f); // 设置段前距离
paragraph.setSpacingBefore(10f); // 设置段后距离

表格

Table table = new Table(columns);
table.setBorderWidth(1f); // 设置表格边线宽度
table.setWidth(100); // 设置表格宽度
table.setPadding(10); // 表格内边距
table.setOffset(1f); // 设置偏移量(该属性用来解决文字与表格中间有段落符号问题)
table.setAlignment(Element.ALIGN_CENTER); // 设置表格对齐方式

Cell cell = new Cell(content, font);
cell.setBackgroundColor(new Color(235, 235, 235)); // 设置单元格背景色
cell.setVerticalAlignment(Cell.ALIGN_CENTER); // 设置垂直对齐方式
cell.setHorizontalAlignment(Cell.ALIGN_CENTER); // 设置水平对齐方式

图片

Image image = Image.getInstance(imageBase64ToByteArray(rejectCompareImageStr));
image.setAlignment(Image.MIDDLE); // 设置对齐方式
image.scalePercent(getPercentByWidth(rejectCompareImage.getWidth())); // 设置缩放比例

因为我用的图片格式是 Base64 编码格式的,需要后台将其转成字节数组的格式。另外,如果图片太大,超出文档,需要设置图片缩放比例。

/**
 * 将 Base64 的图片转成字节数组
 *
 * @param base64Str
 * @return
 * @throws Exception
 */
private byte[] imageBase64ToByteArray(String base64Str) throws Exception {
    byte[] buffer = {};
    base64Str = base64Str.replaceAll(" ", "+");
    String[] array = base64Str.split("base64,");
    if (array.length > 1) {
        base64Str = array[1];
        BASE64Decoder decoder = new BASE64Decoder();
        buffer = decoder.decodeBuffer(base64Str);
    }
    return buffer;
}

/**
 * 根据图片宽度设置图片缩放比例
 *
 * @param width
 * @return
 */
private int getPercentByWidth(float width) {
    int p = 0;
    float p2 = 0.0f;
    p2 = 450 / width * 100;
    p = Math.round(p2);
    return p;
}

报表生成工具 —— iText的更多相关文章

  1. 流行的报表生成工具-JXLS

    如果你还在为灵活的生成各种复杂报表犯愁,在为常用报表工具消耗大量内存担心.我推荐一个很好用的开源的Java报表生成工具. 本工具封装了强大的POI.但与POI不同的是,它可以用很简洁的代码生成复查的, ...

  2. 报表生成工具ireport

    最近又开始学习新的玩意儿了,扒拉扒拉网上的资源,先捣鼓个思维导图.

  3. 【翻译】Awesome R资源大全中文版来了,全球最火的R工具包一网打尽,超过300+工具,还在等什么?

    0.前言 虽然很早就知道R被微软收购,也很早知道R在统计分析处理方面很强大,开始一直没有行动过...直到 直到12月初在微软技术大会,看到我软的工程师演示R的使用,我就震惊了,然后最近在网上到处了解和 ...

  4. 推荐6款常用的Java开源报表制作工具

    JasperReports是一个基于Java的开源报表工具,它可以在Java环境下像其它IDE报表工具一样来制作报表.JasperReports 支持PDF.HTML.XLS.CSV和XML文件输出格 ...

  5. 搭建第一个web项目:jasperReports+ireport制作pdf报表

    一:jasperReports介绍: 在web应用中,必须面临大量的报表问题,即将数据库中的数据形成报表并进行打印.传统开发只能使用html页面设计报表,效率低且不支持别的格式.所以jasperRep ...

  6. Jasperreport5.6.9-----1

    Jasperreport5.6.0生成PDF 最近项目中需要生成报表,先是看了下itext,觉得还可以,但是如果数据字段多的话,不太灵活.所以后来看了下ireport,觉得还可以,下面简单说一下它们: ...

  7. Java操作pdf: JarsperReport的简单使用

    在企业级应用开发中,报表生成.报表打印下载是其重要的一个环节.除了 Excel 报表之外,PDF 报表也有广泛的应用场景. 目前世面上比较流行的制作 PDF 报表的工具如下: iText PDF :i ...

  8. JasperReport框架使用教程(附带常见空白页问题说明)

    概述与安装使用 1. PDF报表概述 概述 ​ 在企业级应用开发中,报表生成.报表打印下载是其重要的一个环节.在之前的课程中我们已经学习了报表中比较重要的一种:Excel报表.其实除了Excel报表之 ...

  9. R统计分析处理

    [翻译]Awesome R资源大全中文版来了,全球最火的R工具包一网打尽,超过300+工具,还在等什么? 阅读目录 0.前言 1.集成开发环境 2.语法 3.数据操作 4.图形显示 5.HTML部件 ...

随机推荐

  1. Linq 等式运算符:SequenceEqual

    检查元素的数量,每个元素的值及两个集合中元素的顺序是否相等,3个方面都相等则为true,否则为false IList<string> strList1 = new List<stri ...

  2. Python内置函数(10)——float

    英文文档: class float([x]) Return a floating point number constructed from a number or string x. If the ...

  3. Spring源码阅读-spring启动

    web.xml web.xml中的spring容器配置 <listener> <listener-class>org.springframework.web.context.C ...

  4. sql server 常用的查询语句

    最近在加强sql 语句的学习,整理一下基本语法,现在记录下 select * from dbo.cangku where city='河南' select  distinct(city), cangk ...

  5. redis数据库各种数据类型的增删改查命令

    redis的常用数据操作: redis是key-value的数据结构,每条数据都是一个键值对. 键的类型是字符串并且键不能重复. redis最基本数据类型是string 所以下面的操作可以省略引号&q ...

  6. layer ui插件显示tips时,修改字体颜色

    今天做调查问卷,又遇到一个蛋疼小问题,记录下. 调查问卷有很多选项是要求必填的,如果不填的话,需要给出友好的提示.用的如下组件:http://layer.layui.com/ 1.之前一直默认用的: ...

  7. HTML-----<a>、<table>、<form>解析

      超链接 anchor 锚 <a href="url">内容</a> Href Hypertext reference 引用 URL(Uniform Re ...

  8. Java中对List去重, Stream去重

    问题 当下互联网技术成熟,越来越多的趋向去中心化.分布式.流计算,使得很多以前在数据库侧做的事情放到了Java端.今天有人问道,如果数据库字段没有索引,那么应该如何根据该字段去重?大家都一致认为用Ja ...

  9. python--socket套接字/TCP

    socket套接字/TCP 一 客户端/服务器架构 C/S架构,包括 硬件C/S架构(打印机) 软件C/S 架构(web服务) C/S架构的软件(软件属于应用层)是基于网络进行通信的 Server端要 ...

  10. centos单机安装zookeeper+kafaka

    环境如下: CentOS-7-x86_64zookeeper-3.4.11kafka_2.12-1.1.0 一.zookeeper下载与安装1)下载zookeeper [root@localhost ...