最近因为项目需要将对象打印特定模式的PDF,经大佬建议,选择了使用FOP,较之iText,灵活性更强,对代码依赖更少。

下面简要说明一下如何使用及demo。

1. 需求描述

根据现有一个pdf模板,将值填入pdf中导出。其中,值从Java一个List<Map<String, Object>>获取,每个Map展示在一页pdf中,整个List生成为一个pdf文件。

2. 需求分析

1)生成pdf模板

2)将每个Map循环填入pdf中,使得每个Map占用单独一页

3. 技术探测

1)进入fop官网 https://xmlgraphics.apache.org/fop/ 学习,最快捷的方法就是将官网提供的Examples下载到本地运行,这样可以有更直观的感受,可以帮助快速get关键点。

2)fop是一个基于xsl(制作pdf模板)来生成pdf文件的。可以插入图片,将xml,Java对象,SVG等转换为pdf格式的文件。

3)由于xsl确定样式,所以Java代码里只需要提供要展示的值即可,将样式与代码解耦。只要值确定,无论后续pdf样式如何更改,Java代码都无需再动,便于维护。而正因为样式由xsl决定,所以FOP的可定制性非常强,推荐使用。

4. 实践

经过分析,发现fop在将Java对象转换为pdf时,先将对象转换为了xml格式,所以本需求的完成主要聚集在以下两点:

1) xsl学习----官网提供的examples代码里有相对简单的fop.xml文件,可以作为入门。更多的知识点需要学习fo:xsl以及xsl语法,可参考 http://www.w3school.com.cn/xslfo/index.asp、http://www.w3school.com.cn/xsl/xsl_languages.asp;模板制作好后,可参考https://xmlgraphics.apache.org/fop/quickstartguide.html下方,使用命令行 fop -xml XXX.xml -xsl XXX.xsl -pdf xxx.pdf 来测试模板是否为目标模板,此时不需要Java代码参与,更省时省力:)

2) Java对象转xml (采用XStream)

由于需要转换的为List<Map<String, Object>>对象,而fop模板文件中会引用map中的key,而简单的使用XStream无法满足需求(只会将key和value的值同时打印出来,而xml标签里是key/value的详细类型),需要使用XStream提供的Convertor类(从XStream的jar包里取出了MapConvertor类到本地修改),进行简要的转换,使得生成的xml标签为Map的key,而值是Map的value。

关键代码下所示:

public boolean canConvert(Class type)      {       if (this.type != null) {       return type.equals(this.type);      }     return (type.equals(HashMap.class)) ||          (type.equals(Hashtable.class)) ||         (type.getName().equals("java.util.LinkedHashMap")) ||           (type.getName().equals("java.util.concurrent.ConcurrentHashMap")) ||        (type.getName().equals("sun.font.AttributeMap") ||          (type.equals(HashedMap.class)) );     }

   public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context)   {       Map map = (Map)source;       for (Iterator iterator = map.entrySet().iterator(); iterator.hasNext();)     {       Map.Entry entry = (Map.Entry)iterator.next();        ExtendedHierarchicalStreamWriterHelper.startNode(writer, entry.getKey().toString(), entry.getClass());

          writeItem(entry.getValue(), context, writer);

       writer.endNode();       }   }

3)关键点
3.1)模板---每个Map成为一页,这里使用xsl:for-each
<fo:page-sequence master-reference="A4-portrait">
<fo:flow flow-name="xsl-region-body">
<fo:block>
<xsl:for-each select="List/map">
...
<!-----加上if判断,使得最后一页不生成空白页-->
<xsl:if test="last()>position()">
<fo:block break-before="page"/>
</xsl:if>
</xsl:for-each>
</fo:block>
</fo:flow>
</fo:page-sequence>

3.2)模板---由于要生成不定行的表格(表头一定,但表行数视具体数据而定),使用
<fo:table-body>
<xsl:apply-templates select="XXX"/>
...
</fo:table-body>
<xsl:template match="XXX">
...
</xsl:template>
注意:这里的"XXX"指的是xml中的xpath(不熟悉的需要学习一下),根据这个path,才能找到惟一的标签,这样才能取出标签中的值

Apache FOP 将Java对象转换为pdf文件相关推荐

  1. wkhtmltopdf 实现html 文档对象转换为pdf 文件核心功能代码

    环境说明 环境:windows10 客户端软件:wkhtmltopdf 记得配置wkhtmltopdf 全局环境变量,相关的安装步骤可以baidu或者google wkhtmltopdf 安装包已经上 ...

  2. 使用java程序将ceb文件转换为pdf文件

    要使用 Java 程序将 CEB 文件转换为 PDF 文件,你可以使用 Apache POI 库来读取 CEB 文件并解析其内容. Apache POI 是一个开源的 Java 库,可以用于读取和写入 ...

  3. java将HTML文件转化为pdf文件,如何使用Java将HTML网页转换为PDF文件

    我一直在互联网上搜索如何使用Java将HTML页面转换为PDF文件.我发现了很多指针,简而言之,它们不起作用或难以实现.我也下载了一个商业产品,pdf4ml;该API是我很乐意与之合作的,除了当我在维 ...

  4. Java 将 Excel 转换为 PDF 文件

    持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情 今天这是篇粗糙的文章,文字也较少,整理了个Java将Excel 转换为 PDF 文件的工具类.(还比较 ...

  5. 将HTML文件转换为PDF文件(Thymeleaf模板转换,简单解决中文问题, 解决HTML带图片转换PDF文件问题)

    将HTML文件转换为PDF文件 一.导入依赖 <!-- itext生成Pdf --> <dependency><groupId>com.itextpdf</g ...

  6. Office系列---将Office文件(Word、PPT、Excel)转换为PDF文件,提取Office文件(Word、PPT)中的所有图片

    将Office文件转换为PDF文件,提取Office文件中的所有图片 1.Office系列---将Office文件(Word.PPT.Excel)转换为PDF文件 1.1 基于Office实现的解决方 ...

  7. Java对象转换为Json对象

    前言 曾几何时,XML是程序员的宠儿,是数据传输.API.AJAX应用等方面的不二选择,但自从JSON横空出世后,或者你会发觉你身边就有很多人开始抛弃XML,在他们的心目中,JSON已经完全取代了XM ...

  8. office文件转换为pdf文件

    office文件转换为pdf文件 首先安装openoffice,自行百度 导入jar包,自行百度 引入坐标: <!-- 转pdf配置 --><dependency><gr ...

  9. java删减pdf内容合并_[Java教程]Java基础之PDF文件的合并

    [Java教程]Java基础之PDF文件的合并 0 2017-07-28 00:00:45 1.首先下载一个jar包:pdfbox-app-1.7.1.jar 2.代码如下:package com;i ...

  10. java实现对pdf文件压缩,拆分,修改水印,添加水印

    最近要实现一个文件上传,并且在线预览上传文件的功能,设计思路是:把上传的文件通过openoffice转成pdf文件,并将pdf文件以流的形式返回到浏览器,由于上传的部分文件过大,转成pdf后传回前端浏 ...

最新文章

  1. 王茂霖:数据挖掘提分三板斧!(附PPT下载)
  2. Javascript实现边框闪动
  3. java 字节数组 操作_Java-固定字节数组对象
  4. Open ROADS Community首次正式会议在新加坡顺利召开
  5. python开发web运维工具_Python web 开发工具箱
  6. 分析android动画模块
  7. oracle tabs作用,Oracle 中 table 函数的应用浅析
  8. laravel 导出插件
  9. 4月8日及以后火车票暂停发售!
  10. Python3 学习
  11. 判断可逆素数的c语言程序,C语言可逆素数教程
  12. Python实现word转pdf
  13. 高斯核函数初始化邻接矩阵_数学基础之高斯核函数
  14. 【TextView】实现QQ一键加群功能
  15. 计算机应用与维护专业教学大纲,计算机应用专业教学大纲
  16. ubuntu 14.04 opera浏览器flash插件安装
  17. word2010学习
  18. 【CV】Reg2Net:一种用于计算机视觉任务的多尺度骨干架构
  19. python期末大作业之实现多线程爬虫系统
  20. matlab里surf函数,matlab surf 函数画3维图

热门文章

  1. Python文件操作-替换srt文件行文本
  2. 百度地图API申请——服务端
  3. Excel 下拉列表数据有效性智能匹配筛选
  4. Dragdealer拖动组件
  5. 在类中不添加注释。影响可读性。代码繁杂。
  6. 家用双千兆路由器推荐_千兆以上(专业级)无线路由器路由器哪款好
  7. 盘点免费好用的5款思维导图工具
  8. 【老九学堂】【Java】详解常见的53个关键字
  9. Circular Coloring
  10. 设置电脑 保护视力 还有桌面默认颜色