使用Apache FOP将XML导出成PDF

apache foppdf 添加依赖: <dependency> <groupId>org.apache.xmlgraphics</groupId> <artifactId>fop</artifactId> <version>2.5</version> </dependency> 定义fo模板文件: <xsl:stylesheet version="1.1" xmlns:xsl="http://www 阅读详情

FOP是由James Tauber发起的一个开源项目,最初的目的是利用xsl-fo将xml文件转换成pdf文件。目前最新的版本是2001年9月29日发布的 0.20.2,它可以将xml文件转换成pdf,mif,pcl,txt等多种格式以及直接输出到打印机,并且支持使用SVG描述图形。XML显然是最好 的内容存储格式,而PDF是目前最流行的内容载体格式,FOP显然希望借助这种必然的XML to PDF需求,来推动xsl-fo规范的发展。虽然xsl-fo规范停滞不前,但利用FOP能使自己的程序具有将XML内容输出成PDF等流行格式的功能无 疑是令人兴奋的。 
FOP使用方式

FOP有3种使用方式,分别为命令行,程序嵌入,XT 嵌入,这里将主要介绍如何在程序中嵌入FOP功能。将XML文件转换为PDF实际上分为2步,第1步是利用XSLT将XML转换为XSL-FO,第2步是 将XSL-FO转换为PDF。这里不想讲述XSLT和XSL-FO有关的知识(这方面的文档相当多),而只将讲述如何进行第2步的转换编程。

在程序中嵌入FOP

1. 范例simple.fo文件

<?xml version="1.0" encoding="utf-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
  <fo:layout-master-set>
    <fo:simple-page-master master-name="simple"
                  page-height="29.7cm" 
                  page-width="21cm"
                  margin-top="1cm" 
                  margin-bottom="2cm" 
                  margin-left="2.5cm" 
                  margin-right="2.5cm">
      <fo:region-body margin-top="3cm"/>
      <fo:region-before extent="3cm"/>
      <fo:region-after extent="1.5cm"/>
    </fo:simple-page-master>
  </fo:layout-master-set>
  <fo:page-sequence master-name="simple">
    <fo:flow flow-name="xsl-region-body">
       <!-- Title -->
      <fo:block font-size="18pt" 
            font-family="sans-serif" 
            line-height="24pt"
            space-after.optimum="15pt"
            background-color="blue"
            color="white"
            text-align="center"
            padding-top="3pt">
            FOP 0.20.2
      </fo:block>
      <!-- Normal Text -->
      <fo:block font-size="12pt" 
                font-family="sans-serif" 
                line-height="15pt"
                space-after.optimum="3pt"
                text-align="justify">
FOP is the world's first print formatter driven by XSL formatting objects.
It is a Java application that reads a formatting object tree and then turns it into a PDF document.
      </fo:block>
    </fo:flow>
  </fo:page-sequence>
</fo:root>

上述是一个很简单的fo文件,将显示两块文字,具体的fo语法请读者自己查看相应资料。

2. 简单调用FOP        FOP提供的所有对外调用接口都在org.apache.fop.apps下,其下的AWTStarter.class是一个用AWT写的转换结果预览程序,CommandLineStarter.class提供命令行使用方式,PrintStarter.class提供打印接口,XTDriver.class提供XT嵌入方式接口,Driver.class则是我们要在这里讨论的程序接口。下面这个程序foptest.java演示了FOP的最简单也是最常用的使用方式

import java.io.*;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.apache.fop.apps.*;
public class foptest {
    public static void main(String[] args) {
        try {
            Driver driver = new Driver();
            //设置要转换的fo文件名
            driver.setInputSource(new InputSource (args[0]));
            //设置输出文件名
            driver.setOutputStream(new FileOutputStream(args[1]));
            //设置转换类型
            //还可以为RENDER_PCL,RENDER_PS,RENDER_TXT,RENDER_MIF
            driver.setRenderer(Driver.RENDER_PDF);
            //开始转换
            driver.run();
        }
        catch( Exception e ){
            e.printStackTrace();
        }
    }
}

上述程序将接受两个命令行参数,第一个参数是需要转换的fo文件名,第二个参数是输出文件名。在CLASSPATH中添加下述jar文件: {FOP安装目录}\build\fop.jar {FOP安装目录}\lib\batik.jar {FOP安装目录}\lib\xalan-2.0.0.jar {FOP安装目录}\lib\xerces-1.2.3.jar {FOP安装目录}\lib\avalon-framework-4.0.jar {FOP安装目录}\lib\logkit-1.0b4.jar {FOP安装目录}\lib\jimi-1.0.jar 然后执行java foptest simple.fo simple.pdf

3. 显示中文 上面的演示程序段可以应付绝大部分转换编程的需要,不过对于国内用户来说,不可避免的需要产生中文PDF文件,让我们把上述simple.fo的标题从"FOP 0.20.2"改成"支持中文的FOP 0.20.2",不改动程序的情况下执行结果显示如下

 可以看到由于没有加入相应的字体支持,汉字被显示成了#。 
东方字符的显示在FOP的早期版本中并不被支持,最早尝试对FOP打补丁以解决显示东方字符的是日本人。从FOP 0.16版本开始,他们在sourceforge上建立了一个jpfop项目来解决日文字符的显示问题,使用相同的方法也可以被用来显示中文字符。幸运的是,当前的FOP版本已经能很好的解决中文显示的问题,不再需要我们打补丁,下面是在FOP中使用中文的步骤:

第一步,建立font metrics文件 对于后缀为ttf的TrueType字体文件,我们可以执行以下命令来产生font metrics文件 java org.apache.fop.fonts.apps.TTFReader C:\WINNT\Fonts\simkai.ttf simkai.xml 这里simkai.xml就是我们为楷体产生的font metrics文件。 对于Windows下的宋体来说,存在的是后缀为ttc的TrueType Collection文件,即包含多个TrueType的文件,这时首先要做的是得到这个Collection中所有TrueType的名字,执行以下命令(这个命令其实有错误): java org.apache.fop.fonts.apps.TTFReader C:\WINNT\Fonts\simsun.ttc simsun.xml 
产生输出如下:

This is a TrueType collection file with2 fonts
Containing the following fonts:
SimSun
NSimSun
java.io.IOException: Failed to read font
        at org.apache.fop.fonts.TTFFile.readFont(TTFFile.java:388)
        at org.apache.fop.fonts.apps.TTFReader.loadTTF(TTFReader.java:181)
        at org.apache.fop.fonts.apps.TTFReader.main(TTFReader.java:143) 后面的异常是由于我们给的参数不对(因为ttc不是ttf字体文件)造成的,FOP开发小组知道这个问题,但是可能觉得无关痛痒而没去修正它。无论怎样, 我们得到了我们要得到的结果,里面含的字体名为SimSun和NSimSun,通过以下命令为其中的SimSun字体产生font metrics文件: java org.apache.fop.fonts.apps.TTFReader -ttcname "SimSun" C:\WINNT\Fonts\simsun.ttc simsun.xml -ttcname后面指定需要从ttc文件中提取的字体名称

第二步,登记上述字体 
在FOP主目录下的conf子目录下有一个userconfig.xml文件,为了方便,我们将它和上一步产生的 simsun.xml,simkai.xml都拷贝到与我们的演示程序同一目录下。在userconfig.xml的最后几行有一 个<fonts></fonts>标记区,我们在其中加入以下项

<font metrics-file="simsun.xml" kerning="yes" embed-file="c:\WINNT\fonts\simsun.ttc">
    <font-triplet name="mysimsun" style="normal" weight="normal"/>
 </font>
 <font metrics-file="simkai.xml" kerning="yes" embed-file="c:\WINNT\fonts\simkai.ttf">
    <font-triplet name="mysimkai" style="normal" weight="normal"/>
 </font>
其中metrics-file里可以设相对路径或绝对路径(因为我们这里在同一目录下,所以只需写文件名即可),font-triplet里的name可以自己自由设定,并不要求与字体名一样。设定这个名字后,在fo里就只能通过这个名字引用这个字体。

为了演示中文显示,范例simplecn.fo文件为


<?xml version="1.0" encoding="gb2312"?><fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">  <fo:layout-master-set>    <fo:simple-page-master master-name="simple"                  page-height="29.7cm"                   page-width="21cm"                  margin-top="1cm"                   margin-bottom="2cm"                   margin-left="2.5cm"                   margin-right="2.5cm">      <fo:region-body margin-top="3cm"/>      <fo:region-before extent="3cm"/>      <fo:region-after extent="1.5cm"/>    </fo:simple-page-master>  </fo:layout-master-set>  <fo:page-sequence master-name="simple">    <fo:flow flow-name="xsl-region-body">      <fo:block font-size="18pt"             font-family="mysimsun"             line-height="24pt"            text-align="center"            padding-top="3pt">            这是宋体      </fo:block>      <fo:block font-size="18pt"             font-family="mysimkai"             line-height="24pt"            text-align="center"            padding-top="3pt">            这是楷体      </fo:block>    </fo:flow>  </fo:page-sequence></fo:root>
上述fo文件使用两种字体分别显示一行文字,注意在<fo:block>的属性中的font-family被我们设成userconfig.xml中相应的名字。 
由于需要读入userconfig.xml来得到字体信息,程序主体修改如下:

Driver driver = new Driver();
driver.setInputSource(new InputSource (args[0]));
driver.setOutputStream(new FileOutputStream(args[1]));
driver.setRenderer(Driver.RENDER_PDF);
//读入配置(在Options的构造函数中完成)
Options options = new Options(new File("userconfig.xml"));
driver.run();这里在run之前一行读入配置(产生的Options的实例在以后没有用处),执行结果为:

 
  
总结

FOP从技术上说无疑是一个非常优秀的产品,但是目前它对用户的开发支持显然很欠缺。FOP的开发小组也意识到了这个问题,他们允诺在将来会建立一个专门 的Web站点以及丰富它的文档。如果现在就想使用更方便的产品的话,你也可以考虑一些商用产品,如RenderX和X2P。

另外需要注意的是,今年8月推出的FOP 0.20.1版本非常的不好,不但一些范例无法运行,而且附带的源代码有若干错误,而这个9月29日推出的0.20.2RC版本有极大的改进,建议大家尽快升级到这个版本。


PDF写出:使用fop输出为pdf格式文件的Demo 1.导入pom依赖 <!-- https://mvnrepository.com/artifact/org.apache.xmlgraphics/fop --> <dependency> <groupId>org.apache.xmlgraphics</groupId> <artifactId>fop</artifactId&g... 阅读详情

相关推荐

Apache FOP 2.4 中文版:XSL-FO 转换利器

本文还有配套的精品资源,点击获取 简介:Apache FOP 是一款开源 XSL-FO 处理器,可将 XSL-FO 文档转换为 PDF 和 PostScript 等格式。此中文版针对中文环境进行了优化,包含 6 种常见中文字体,可确保中文文档的准确呈现。FOP 2.4 版本带来性能提升、错误修复和对新 XSL-FO 特性的支持,在处理中文文档时提供更好的字形渲染和字符集支持...

weixin_30533301的博客 2335

fopdf:从头开始使用Apache FOPPDF的教程代码

fopdf 用于从头开始使用Apache FOPPDF的代码。 首先运行mvn clean install生类。

Apache FOPJava对象转换为pdf文件

NULL 博文链接:https://april2017.iteye.com/blog/2407767

Apache FOPPDF

该demo使用springboot框架通过fop使用xslt模板将xml数据转换pdf文件,解决了 生pdf 文件内容中文变 # 或是 繁体乱码 问题; 底层原理小编也没有去研究了,因为公司项目用到该功能,匆匆忙学了咋使用,特意记录一下方便下次使用,希望对大家也有所帮助。.........

qq_58966160的博客 5443

【亲测免费】 推荐开源项目:Apache FOP - XML格式转换利器

推荐开源项目:Apache FOP - XML格式转换利器 1、项目介绍 Apache FOP(Formatting Objects Processor)是一个基于XSL格式对象的打印处理器,它能够将符合XSL 1.1规范的格式化对象树转化为PDF文档,同时支持其他输出格式,并可直接在屏幕上预览。这个项目是Apache XML Graphics的一部分,其官方网站为xmlgraphics.apac...

gitblog_00025的博客 849

使用Apache XML项目FOPPDF文件(上)

使用Apache XML项目FOPPDF文件(上)一、前言:在项目中遇到要把文档保存PDF文件,在网上找了很久之方面的资料,终于发现了ApacheFOP项目有这个功能。二、适合读者对象:想学就学吧!三、介绍:FOP全称为Formatting Objects Processor,译为格式化对象处理器,简单点,它就是一种打印格式驱动,通过这种驱动,可以很方便的生相应格式化的文件。

s00n的桃花园 3724

使用Apache XML项目FOPPDF文件(下)

使用Apache XML项目FOPPDF文件(下)四、       内容:2、(2)XMLàXSL-FOàPDF:有时我们在程序中会遇到要把一个只具有数据,没有格式的XML文件转化PDF文件,这时我们就需要一个JAXP兼容的XSLT处理器:如Apache的xalan(或者IBM的xerces,Sun的JDOM等),请将它的库文件加入CLASSPATH。通过JAXP的API我们就可

s00n的桃花园 3729

使用FOPxml转换pdf

1,fop依赖 <!-- https://mvnrepository.com/artifact/org.apache.xmlgraphics/fop --> <dependency> <groupId>org.apache.xmlgraphics</groupId> <artifactId>fop</artifact...

m270817的博客 1004

Tomcat与Apache FOP整合:PDF部署终极指南

在当今数字化时代,PDF文档生为企业应用的核心需求。作为业界领先的**Java Web服务器**,Tomcat与Apache FOP的完美整合为开发人员提供了强大的**PDF解决方案**。本指南将详细介绍如何在Tomcat环境中部署和配置Apache FOP,实现高效的PDF文档生功能。 ## 📋 什么是Apache FOPApache FOP(Formatting Obje

gitblog_00658的博客 926

Apache FOP 使用笔记-1

Apache FOP 导出 PDF

dzbxq89的博客 1900

Apache FOP与Eclipse和OSGi的集

Apache FOP是由XSL格式化对象( XSL-FO )驱动的开源打印处理器。 例如,将数据对象转换为PDF可能非常有用。 但是,将其集到PDE中并最终以OSGi Service的形式运行并最终显得有些麻烦。 因此,我提供了一个P2存储库,该存储库在单个功能中包含必要的包。 这样,PDE目标设置变得容易得多。 以下各节说明如何使用它。 Apache FOP 如文档所述,“ Ap...

最佳 Java 编程 433

Apache FOP:开源的XSL-FO到PDF转换工具

Apache FOP:开源的XSL-FO到PDF转换工具 项目介绍 Apache FOP(Formatting Objects Processor)是一个由XSL格式化对象驱动的打印格式化工具。作为一个Java应用程序,FOP能够读取符合XSL 1.1规范的格式化对象树,并将其转换为PDF文档或其他输出格式,甚至可以直接在屏幕上预览。尽管并非所有XSL 1.1规范的部分都已实现,但FOP提供了强大...

gitblog_00725的博客 1085

【亲测免费】 推荐开源项目:Apache FOP——强大的XMLPDF转换工具

推荐开源项目:Apache FOP——强大的XMLPDF转换工具 项目介绍 Apache FOP(Formatting Objects Processor)是一个基于XSL 1.1规范的打印格式处理器,能够将符合标准的XSL格式对象转换为PDF文档,同时还支持屏幕预览和多种输出格式。这个项目是Apache XML Graphics项目的一部分,其官方网站位于http://xmlgraphics....

gitblog_00021的博客 955

Apache -FOPToPDF-Java对象输出实例代码

提示:此次文章主要记录关于使用FOP导出PDF的一个实例整理 文章目录前言主要内容就是FOP的Example中的对象输出PDF具体代码1.pom.xml2.AbstractObjectReader3.EasyGenerationContentHandlerProxy4.ExampleObj2PDF4.ExampleObj2XM5.ProjectMember6.ProjectTeam7.ProjectTeamInputSource8.ProjectTeamXMLReader9.projectteam2fo..

m0_52178851的博客 1284

Apache FOP使用(续)

下面显示了用于将 XML 文档转换为 PDF 文档的 Java 应用程序。 FOP.java package fop.pdf;import org.apache.fop.apps.Driver;import java.io.*;import org.apache.avalon.framework.logger.ConsoleLogger;import org.apache.avalo

波波的专栏 5806

Apache FOP 使用笔记-2

这是一个充满了示例的网站,没有文档,但是可以通过参考在线的PDF文档,然后下载FO文件进行反向解析。比如参考从参考例子中解析了,region-body 可以通过增加 column-count属性,来将body分为多列,这样就可以将多个block并行放置,但是实际放置是先填满一列,在填第二列。

dzbxq89的博客 638
上一篇: Freemarker定义宏的用法
yangyigen
博客等级 码龄18年 3粉丝 0原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值