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

一、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. Web Api 使用模型验证

    public class Person { public int Id { get; set; } [Required(ErrorMessage = "姓名不能为空啊啊啊!")] ...

  2. "双非"应届生校招如何获得大厂青睐?(内附技术岗超全求职攻略)

    写在前面的话 笔者从17年的2月份开始准备春招,其中遇到不少坑,也意识到自己走过的弯路.故写了这篇文章总结一番,本文适合主动学习的,对自己要学的课程不明确的,对面试有恐惧症的...等将来打算从事技术岗 ...

  3. Docker学习笔记 - Docker的基本概念

    一.cs架构 Docker客户端:本地或远程 Docker服务端:守护进程Docker Daemon 二.基本概念 Docker镜像:打包阶段,层叠的只读文件系统,引导->root(ubuntu ...

  4. 爬取IP

    import urllib.request import re def url_open(url): req = urllib.request.Request(url,headers={'User-A ...

  5. Effective Java 第三版——38. 使用接口模拟可扩展的枚举

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  6. vue2.0 带头冲锋(打包时,小心萝卜坑)

    距离上一期,时间间距可能有点长.谁让本人处于兴奋状态,生活已经不能自理. 哈哈哈,嗯,正经一下, 在已有的经验里总结一下那些容易抓狂的坑! 起因:npm run build 打包 本地运行,你以为可以 ...

  7. spring boot / cloud (四) 自定义线程池以及异步处理@Async

    spring boot / cloud (四) 自定义线程池以及异步处理@Async 前言 什么是线程池? 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务.线 ...

  8. CentOS 7 安装serverjre 9

    1.  首先去官网查询最新的jre的下载地址,然后用wget命令下载. 2. 创建安装目录 sudo mkdir -p /usr/local/java 3. 解压文件到安装目录 sudo tar -z ...

  9. APP开发外包时常见的错误

    时代在发展,科技在进步,很多企业都想要开发出属于自己的一款APP.然而,不是每个企业都有开发团队或是专门雇一个技术人员来做的,有一个好方法就是把开发APP的工作外包出去,找一个比较好的外包公司根据自己 ...

  10. 第一章 搭建一个通用的.net core项目框架

    项目目标部署环境:CentOS 7+ 项目技术点:.netcore2.0 + Autofac +webAPI + NHibernate5.1 + mysql5.6 + nginx 开源地址:https ...