`
xpenxpen
  • 浏览: 723221 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

fop初步

    博客分类:
  • PDF
fop 
阅读更多
1.简介
FOP可以用来将xml转换成pdf。
当然他还支持输出成其他格式,输出支持的格式有PDF, PS, PCL, AFP, XML (area tree representation), Print, AWT, PNG, RTF, TXT。
输入的格式是XSL-FO,可以是单独的一个fo文件,或者采用xml+xslt结合的方式。

2.下载
先去官网下载包fop-1.1-bin.zip,目前最新版是1.1。
然后解压,可以看到根目录下有一个fop.bat,等下命令行执行要用到它。
lib目录是依赖的一些jar包。

3.第一个例子
3.1 写一个xml,等下我们要将这个xml用FOP转成pdf
name.xml
<doc>
    <name>Frank</name>
    <name>中文你好</name>
</doc>


3.2 写样式表(XSL-FO),此样式表定义生成的pdf的格式
name2fo.xsl
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:fo="http://www.w3.org/1999/XSL/Format">
  <xsl:output method="xml" indent="yes"/>
  <xsl:template match="/">
    <fo:root>
      <fo:layout-master-set>
        <fo:simple-page-master master-name="A4-portrait"
              page-height="29.7cm" page-width="21.0cm" margin="2cm">
          <fo:region-body/>
        </fo:simple-page-master>
      </fo:layout-master-set>
      <fo:page-sequence master-reference="A4-portrait">
        <fo:flow flow-name="xsl-region-body">
          <fo:block>
            Hello, <xsl:value-of select="doc/name[1]"/>!
          </fo:block>
          <fo:block font-family="Microsoft YaHei">
            Hello, <xsl:value-of select="doc/name[2]"/>!
          </fo:block>
        </fo:flow>
      </fo:page-sequence>
    </fo:root>
  </xsl:template>
</xsl:stylesheet>


将name.xml和name2fo.xsl都放到和fop.bat同一级目录下

3.3 运行命令
D:\fop-1.1>fop -xml name.xml -xsl name2fo.xsl -pdf name.pdf

Jul 1, 2014 3:49:08 PM org.apache.fop.events.LoggingEventListener processEvent
WARNING: Font "Microsoft YaHei,normal,400" not found. Substituting with "any,normal,400".
Jul 1, 2014 3:49:08 PM org.apache.fop.events.LoggingEventListener processEvent
WARNING: Glyph "?" (0x4e2d) not available in font "Times-Roman".
Jul 1, 2014 3:49:08 PM org.apache.fop.events.LoggingEventListener processEvent
INFO: Rendered page #1.


可以看到提示找不到中文字体(Microsoft YaHei)

3.4 解决字体问题
3.4.1 将配置文件conf/fop.xconf拷贝一份出来到根目录,然后修改
<renderers>
   <renderer mime="application/pdf">
      <fonts>
         <!-- 加入这行,自动检测操作系统的字体 -->
         <auto-detect/>
      </fonts>
   </renderer>
</renderers>


3.4.2 重新执行命令,注意加入-c参数,指定我们修改后的配置文件。
fop -c fop.xconf -xml name.xml -xsl name2fo.xsl -pdf name.pdf

第一次执行比较慢,会去加载操作系统的字体。第二次就快了(缓存到哪里了不清楚)。

执行结果如图所示


4. 体会一下和itext的区别
优点:可以看到使用fop生成pdf,不需要编写java代码,执行命令行就行了。而且做到了内容和样式分离。
缺点:需要学习XSL-FO来编写样式表

5. 调用java api
如果硬要用java api的方式来调用,也是可以的。
可以参见官方文档http://xmlgraphics.apache.org/fop/1.1/embedding.html

2014/09/25更新
官方文档有些错误,以下是我费劲九牛二虎之力试验出来的一种方法
maven的pom文件,官方居然将dependency都搞错,只能用以下的workaround
        <!-- fop -->
        <!-- https://issues.apache.org/jira/browse/FOP-2151 -->
        <dependency>
            <groupId>org.apache.xmlgraphics</groupId>
            <artifactId>fop</artifactId>
            <version>1.1</version>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.avalon.framework</groupId>
                    <artifactId>avalon-framework-api</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.avalon.framework</groupId>
                    <artifactId>avalon-framework-impl</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- these two are to correct issues in fop dependency -->
        <dependency>
            <groupId>avalon-framework</groupId>
            <artifactId>avalon-framework-api</artifactId>
            <version>4.2.0</version>
        </dependency>
        <dependency>
            <groupId>avalon-framework</groupId>
            <artifactId>avalon-framework-impl</artifactId>
            <version>4.2.0</version>
        </dependency>


然后是试验成功的代码,是从stackoverflow搞来的。官方文档怎么不靠谱啊?
package org.xpen.hello.pdf;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXResult;
import javax.xml.transform.stream.StreamSource;

import org.apache.fop.apps.Fop;
import org.apache.fop.apps.FopFactory;
import org.apache.fop.apps.MimeConstants;

public class FopTest {

    public static void main(String[] args) throws Exception {
        
        // Step 1: Construct a FopFactory
        FopFactory fopFactory = FopFactory.newInstance();
        fopFactory.setUserConfig(new File("src/test/resources/pdf/fop/fop.xconf"));

        // Step 2: Set up output stream.
        OutputStream out = new BufferedOutputStream(new FileOutputStream(new File("target/abc.pdf")));

        // Step 3: Construct fop with desired output format
        Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, out);

        // Step 4: Setup JAXP using identity transformer
        TransformerFactory factory = TransformerFactory.newInstance();
        Source xslt = new StreamSource(new File("src/test/resources/pdf/fop/name2fo.xsl"));
        Transformer transformer = factory.newTransformer(xslt);

        // Step 5: Setup input and output for XSLT transformation
        // Setup input stream
        Source src = new StreamSource(new File("src/test/resources/pdf/fop/name.xml"));

        // Resulting SAX events (the generated FO) must be piped through to FOP
        Result res = new SAXResult(fop.getDefaultHandler());

        // Step 6: Start XSLT transformation and FOP processing
        transformer.transform(src, res);

        // Clean-up
        out.close();
    }

}



6. 使用ant task
也可以直接在ant中调用task
<taskdef name="fop" classname="org.apache.fop.tools.anttasks.Fop">
    <classpath>
        <fileset dir="fop">
            <include name="lib/*.jar"/>
        </fileset>
    </classpath>
</taskdef>
<target name="pdf"
    <fop format="application/pdf" outdir="/">
        <fileset dir="/">
            <include name="*.fo"/>
        </fileset>
    </fop>
</target>

上述代码将查找目录下所有fo文件,将他们全部转为pdf。

7. 参考资料
CSS中文字体列表
  • 大小: 34.6 KB
分享到:
评论

相关推荐

    fop1.0及依赖jar包

    Apache FOP(Formatting Objects Processor)是Apache软件基金会开发的一个开源项目,主要用于将XSL-FO(XML样式表语言格式化对象)转换成各种输出格式,如PDF、PS、SVG、XML、HTML等。FOP 1.0是该项目的早期版本,...

    fop1.1相关资源

    FOP(Formatting Objects Processor)是Apache软件基金会的一个开源项目,主要功能是将XSL-FO(XSL格式化对象)转换成PDF、PS(PostScript)或其他格式的文档。XSL-FO是一种XML方言,用于描述文档的版式布局,如页面...

    fop转pdf依赖的jar包

    `FOP ( Formatting Objects Processor)` 是Apache基金会的一个开源项目,专门用于将XSL-FO(XML格式化对象)转换成PDF、PS(PostScript)和其他图形格式。在这个场景中,我们需要使用FOP将数据转换成PDF格式,而这个...

    fop转pdf中文字体配置文件

    Apache FOP(Formatting Objects Processor)是一个开源的XSL-FO处理器,能够将XSL-FO格式的文件转换为PDF、rtf等多种格式。然而,在处理中文字符时,FOP默认的字体配置可能无法正确显示中文,这时就需要对字体进行...

    fop.jar

    fop.jar

    Apache FOP fop-1.1rc1-bin

    Apache FOP( Formatting Objects Processor)是Apache软件基金会开发的一个开源项目,主要功能是将XSL-FO(Extensible Stylesheet Language Formatting Objects)文档转换为高质量的PDF格式。这个fop-1.1rc1-bin...

    FOP相关资源及JAR包共享

    FOP(Formatting Objects Processor)是Apache软件基金会的一个开源项目,主要功能是将XSL-FO(XML样式表语言格式化对象)文档转换成各种输出格式,如PDF、PS(PostScript)、PCL、SVG以及XML等。在Java环境中,FOP...

    fop-0.20.5.jar

    标题中的"fop-0.20.5.jar"是一个Java归档(JAR)文件,它是Apache FOP(Formatter Object Processor)的一个版本。FOP是一个开源项目,主要用于将XSL-FO(Extensible Stylesheet Language - Formatting Objects)...

    fop-2.1.jar

    Apache FOP (Formatting Objects Processor) is a print formatter driven by XSL formatting objects (XSL-FO) and an output independent formatter. It is a Java application that reads a formatting object ...

    Apache FOP 将Java对象转换为pdf文件

    Apache FOP(Formatting Objects Processor)是Apache软件基金会开发的一个开源项目,主要功能是将XSL-FO(XML标记语言,用于格式化文档)转换成PDF(Portable Document Format)或者其他输出格式,如SVG、PS等。...

    Apache Fop1.0 Pdf demp

    Apache Fop是Apache软件基金会开发的一个开源项目,主要用于生成PDF(Portable Document Format)文档。FOP1.0是该项目的一个较早版本,但仍然在许多地方被使用,特别是在那些需要将XML格式的数据转换为PDF的场景中...

    Apache FOP 1.0-bin

    Apache FOP( Formatting Objects Processor)是Apache软件基金会开发的一个开源项目,主要用于将XSL-FO(Extensible Stylesheet Language - Formatting Objects)文档转换为PDF格式。这个“Apache FOP 1.0-bin”...

    fop0.94中文问题原码.zip

    《fop0.94中文问题原码》 在IT领域,尤其是在XML处理和PDF生成的过程中,Apache FOP(Formatter Objects Processor)是一个重要的工具。FOP版本0.94是其早期的一个稳定版本,尽管已经有些年份,但仍被一些项目所...

    FOP PDF作成手順、例子

    "FOP PDF作成手順、例子"这一主题主要涵盖了如何使用Apache FOP库来创建PDF文档的详细步骤和实例。Apache FOP(Formatting Objects Processor)是一款开源的XML到PDF转换工具,它遵循XSL-FO(Extensible Stylesheet ...

    fop 1.0beta2 解决了中文问题

    FOP(Formatting Objects Processor)是Apache软件基金会的XSL-FO处理器,用于将XSL-FO(XSL格式化对象)文档转换成各种输出格式,如PDF、PS、SVG等。在处理中文字符时,早期版本如FOP 0.95可能会遇到字体配置问题,...

    fop-2.4_cn.zip

    Apache FOP(Formatting Objects Processor)是一款开源的XSL-FO处理器,主要用于将XSL-FO文档转换成PDF、PS(PostScript)等格式。在这个"**fop-2.4_cn.zip**"压缩包中,它特别针对中文环境进行了优化,包含了6种...

    FOP高级技术文档.rar

    《FOP高级技术文档》是关于使用XSL-FO(Extensible Stylesheet Language Formatting Objects)语言,通过Apache FOP( Formatting Objects Processor)工具生成PDF文档的详细指南。这份文档深入探讨了如何利用XML...

    FOP.rar_fop

    **FOP( Formatting Objects Processor)** 是一个开源的XML转换工具,主要用于将XSL-FO(Extensible Stylesheet Language - Formatting Objects)文档转换成各种输出格式,如PDF、PNG、JPEG、SVG等。FOP是Apache...

    XML转PDF的FOP包和代码

    在Java世界中,Apache FOP(Formatting Objects Processor)是一个强大的工具,专门用于这种转换。Apache FOP是基于XSL-FO(XSL Formatting Objects)规范的开源实现,它将XSL-FO文档转换为各种输出格式,如PDF、PS...

    Fop生成pdf(xsl)

    标题"Fop生成pdf(xsl)"涉及的技术点是利用Apache FOP( Formatting Objects Processor)这个开源工具将XSL-FO(Extensible Stylesheet Language - Formatting Objects)格式的文档转换成PDF。XSL-FO是一种XML标准,...

Global site tag (gtag.js) - Google Analytics