最近因为项目需要将对象打印特定模式的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,才能找到惟一的标签,这样才能取出标签中的值
- 大小: 102.3 KB
分享到:
相关推荐
在这个“Apache Fop1.0 Pdf demp”压缩包中,包含的“fopdemo”很可能是演示如何使用Apache Fop1.0创建PDF文件的一个实例或代码。 Apache Fop的工作原理基于XSL-FO(XSL Formatting Objects),这是一种用于描述...
在Java编程环境中,将一个URL链接的内容转换为PDF文件是一个常见的需求,这通常涉及到网络请求、HTML解析以及PDF生成等多个步骤。以下是一个详细的步骤指南,涵盖了这个过程中的关键知识点: 首先,我们需要处理URL...
以上代码创建了一个FOP实例,然后读取名为`input.fo`的XSL-FO文件,将其转换为PDF,并保存为`output.pdf`。 **注意事项** - FOP的字体支持:FOP默认不包含所有字体,所以可能需要手动添加或配置字体文件。 - 图像...
Apache FOP(Formatting Objects Processor)是一款开源的PDF生成器,主要用Java编写,它遵循W3C的XSL-FO(XSL Formatting Objects)标准,能够将XML格式的数据转换为高质量的PDF文档。本教程将带你从零开始,了解...
Apache FOP( Formatting Objects Processor)是Apache XML Graphics项目的一部分,主要用于将XSL-FO(XSL格式化对象)转换为各种输出格式,包括PDF。如果你的模板是基于XSL-FO,那么FOP是一个很好的选择。不过,XSL...
FOP的主要任务就是将这些描述转换成实际的输出格式,如PDF、PS(PostScript)、PCL、SVG、TIFF、PNG和JPEG等。 Apache FOP的核心特性包括: 1. **PDF生成**:FOP是最早支持生成PDF的处理器之一,能够生成高质量、...
Apache FOP( Formatting Objects Processor)是Apache软件基金会开发的一个开源项目,主要用于将XSL-FO(Extensible Stylesheet Language - Formatting Objects)文档转换为PDF格式。这个“Apache FOP 1.0-bin”...
在Java开发中,有时我们需要将Word文档转换为PDF格式,以满足不同的应用场景需求。Apache POI是一个流行的Java库,用于处理Microsoft Office格式的文件,包括Word(.doc/.docx)。在本示例中,我们将深入探讨如何...
总结起来,Java转换其他类型文件为PDF涉及的关键技术有文件解析、内容重组以及PDF生成。通过结合使用如Apache POI、iText和Apache FOP这样的库,可以有效地实现这一转换过程。在实践中,开发者应根据文件类型、内容...
Apache FOP( Formatting Objects Processor)是Apache软件基金会开发的一个开源项目,主要功能是将XSL-FO(Extensible Stylesheet Language Formatting Objects)文档转换为高质量的PDF格式。这个fop-1.1rc1-bin...
3. 调用FOP API:将XSL-FO文件转换为PDF,这通常通过Java API或者命令行工具完成。 4. 处理结果:生成的PDF文件可以直接保存到磁盘,或者在网络上传输。 在博文链接中,作者可能分享了使用FOP生成PDF的具体实践经验...
对于那些更倾向于使用XML格式的开发者,Apache FOP可以将XSL-FO(可扩展样式表语言格式化对象)转换为PDF。虽然这个过程相对复杂,但它提供了一种标准化的方式来定义文档的布局。 4. **Aspose.Words**: Aspose....
在IT行业中,将HTML页面转换为PDF文档是一个常见的需求,特别是在报表生成、电子书制作或者网页保存为离线阅读格式时。本主题聚焦于使用Java的iTextPDF库来完成这个任务。iTextPDF是一个强大的Java库,允许开发人员...
Apache FOP(Formatting Objects Processor)是Apache软件基金会开发的一个开源项目,主要用于将XSL-FO(XML样式表语言格式化对象)转换成各种输出格式,如PDF、PS、SVG、XML、HTML等。FOP 1.0是该项目的早期版本,...
`FOP ( Formatting Objects Processor)` 是Apache基金会的一个开源项目,专门用于将XSL-FO(XML格式化对象)转换成PDF、PS(PostScript)和其他图形格式。在这个场景中,我们需要使用FOP将数据转换成PDF格式,而这个...
本例关注的是使用Apache FOP(Formatting Objects Processor)将XML数据通过XSL样式表转换为PDF文档,这一过程对于那些需要从结构化数据生成专业外观报告或文档的项目来说至关重要。FOP是一个开源项目,它是基于Java...
在Java开发中,将Word和Excel文档转换为PDF文件用于在线预览是一项常见的需求,尤其在Web应用中,用户可能需要预览不同格式的文档。本篇将详细讲解如何使用Apache POI库来处理Microsoft Office文件,并通过iText或...
这将在当前目录下生成一个名为`output.pdf`的PDF文件。 **5. 示例代码** 在实际开发中,可能需要通过编程方式使用FOP。以下是一个Java示例: ```java import org.apache.fop.apps.FOUserAgent; import org.apache....
在Java开发中,生成PDF文件是一项常见的需求,特别是在需要将网页内容导出或者报告打印时。本篇文章将详细探讨如何使用Java技术,结合HTML、CSS和图像,来按网页格式生成PDF文件,并介绍相关的库和步骤。 首先,...