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
分享到:
相关推荐
fop.jar
apache fop1.0及依赖的jar包
fop xml转换pdf工具 bin包,最新1.1版本
fop转pdf中文字体配置文件,可以实现pdf显示中文
PDF转化工具库 Apache FOP fop-1.1rc1-bin
fop-0.20.5.jar,fop-0.20.5.jar,fop-0.20.5.jar,fop-0.20.5.jar,
Apache Fop工具,编写xs文件l生成PDF文件,编写xsl参考xsl语言,000.bat为启动脚本,数据文本在\fop\fop-1.1\data.xml里面,demo只有一个,没上传多个例子,慢慢琢磨
fop_0.20.5-8_all.deb fop_0.20.5-8_all.deb
fop-0.20.5.jar ecside 依赖包之一fop-0.20.5.jar ecside 依赖包之一fop-0.20.5.jar ecside 依赖包之一
FOP (Formatting Objects Processor) 是第一个基于XSL:FO的打印格式处理器,也是第一个与输出无关的格式处理器。
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 ...
batik-1.5-fop-0.20-5.zipbatik-1.5-fop-0.20-5.zipbatik-1.5-fop-0.20-5.zip
pdf转换类Apache FOP 1.0-bin
FOP 生成PDF的详细设置,及生成Sample代码
FOP相关资源及JAR包共享 希望能帮助到大家
xsl-fo 语言 作为xml的模板 用FOP工具生成PDF,如有疑问 sinbh@163.com
使用fop进行html到PDF文件的生成
带有6种常见中文字体(微软雅黑、宋体、黑体、楷体、仿宋、隶书)支持的 Apache fop-2.4。
fop 0.95在扫描字体时会出现错误,fop 1.0beta2大大简化了字体配置,可以直接使用操作系统自带的字体。本文包括对docbook5.0的配置。