** [COCOON+Jfor] ** ** 将 ** ** FO ** ** 转换为 ** ** RTF ** ** 格式文档 **
继续阅读之前,我们假设您熟悉以下知识,也可以参考本文后面的附录:
n ** Cocoon(Apache ** ** 组织的 ** ** XML ** ** 项目中的八个子项目之一 ** ** ) **
n ** XSL Formatting Objects (XSL-FO) **
n ** FOP(Formatting Objects Processor) **
n ** Jfor(Open-Source Java XSL-FO to RTF converter) **
** 关键词: ** ** **
cocoon 、 jfor 、 xml 、 xsl-fo
** 摘要: ** ** **
对于如何把 PDF 格式文档转换为 Word 文档,我们的思路是,能不能这样: ** PDF ** ** à ** ** FO ** ** à ** ** RTF ** 。
首先,我们来看看如何将 ** FO ** 转换为 ** RTF ** 格式。我们可以让 ** Cocoon+Jfor ** 做到这一点。
概述
我们已经知道利用 ** WH2FO ** 和 ** FOP ** 可以把 Word2000 文档成功转换为 PDF 格式文档。
第一步,将 Word 转换为 XSL-FO ,具体的 OpenSource 可以在 http://www-uk.hpl.hp.com/people/fabgia/wh2fo/wh2fo.html 找到。
第二步,按照 _ http://www-900.ibm.com/developerWorks/cn/xml/x-xslfo2app/index.shtml _
的指导,将 XSL-Fo 转换为 PDF 。
简单的命令例子:
> java org.apache.fop.apps.Fop everything.fo everything.pdf
或者安装了 FOP( http://apache.linuxforum.net/dist/xml/fop/ ) 之后,运行:
fop.cmd sample.fo sample.pdf
即可输出 PDF 文件。
那么现在,我们如何反过来做呢?把 PDF 文件转换为 Word 文件。
Microsoft KB 上都声称并没有提供直接的方法,他们的建议是,你用 Acrobat Reader 5.0 打开 PDF 文件,用 Copy Text 或者 Copy Image 命令把所需要的内容粘贴到 Word 里。还有人声称可以用 Acrobat Reader 5.0 另存为 RTF 格式。
HOW TO: Convert Adobe Acrobat Reader (*.pdf) Files in Word 2002 (290927)
- This article explains how to convert a Portable Document Format (PDF) document from Adobe Acrobat Reader to Microsoft Word.
PDF à FO à RTF
我们的思路是,能不能这样: ** PDF ** ** à ** ** FO ** ** à ** ** RTF ** 。
首先,我们来看看如何将 ** FO ** 转换为 ** RTF ** 格式。我们可以让 ** Cocoon+Jfor ** 做到这一点:
安装 Cocoon :
安装 Cocoon 相对来说非常简单。分成这么几个步骤:
** 第一步 ** ** ,安装 JDK: **
确保你的 JDK 版本足够高,我的是 j2sdk1.4.2_02 ;之后 设置 JAVA_HOME 为 JDK 目录,或者运行命令:
Set java_home = F:\j2sdk1.4.2_02
** 第二步, ** ** 安装 cocoon: **
下载 cocoon 2.1.3 :
The latest source distribution (Cocoon 2.1.3):
· TAR/GZIP format (Unix platforms): _ cocoon-latest-src.tar.gz _
· ZIP format (Windows platforms): _ cocoon-latest-src.zip _
解压之后,运行 cocoon-2.1.3 根目录下的 build.bat ,来编译 cocoon :
E:\cocoon-2.1.3>build
Using Java from F:\j2sdk1.4.2_02\
Buildfile: build.xml
prepare:
+-----------------------------------------------------------+
Apache Cocoon 2.1.3 [1999-2003]
+-----------------------------------------------------------+
Building with Apache Ant version 1.5.4 compiled on August 12 2003
…
…
validate-jars:
Copying 1 file to E:\cocoon-2.1.3\build\cocoon-2.1.3\temp
validate-config:
Validating configuration files
Validating cocoon.xconf using a very basic RELAX NG grammar ...
BUILD SUCCESSFUL
Total time: 2 minutes 30 seconds
编译成功之后,我们可以试试看 cocoon 的效果。
** 第三步, ** ** 启动 cocoon: **
本质上, cocoon 还是一个 servlet 。请运行 cocoon-2.1.3 根目录下的 cocoon.bat ,来启动 cocoon :
E:\cocoon-2.1.3>cocoon servlet
cocoon.bat: using .\build\webapp as the webapp directory
于是乎,就出现了 cocoon 的运行窗口:
让我们试试看效果:打开 IE ,输入
_ http://localhost:8888 _
即可看到:
Okay ,一切正常。
现在,我们要来试试 FO à RTF 的转换了。前提是,必须把 Jfor 的包放入 cocoon 下。
** 第四步, ** ** 安装 Jfor ** ** 到 Cocoon: **
从 Jfor 的官方站点
下载 Jfor 二进制包。地址是:
_ http://prdownloads.sourceforge.net/jfor/jfor-0.7.2rc1.jar?download _
下载了 jfor-0.7.2rc1.jar ,把它放在
cocoon-2.1.3\lib\optional
子文件夹下。
然后重新 build 一遍 cocoon ,步骤同第二步。
再次启动 cocoon servlet 。
** 第五步, ** ** 一个 ** ** XML ** ** à ** ** RTF ** ** 的例子 : **
在
cocoon-2.1.3\build\webapp\
目录下新建一个文件夹,例如名字就叫“ RtfDemo ”。
建立这么几个文件:
** sitemap.xmap **
1<map:sitemap xmlns:map="http://apache.org/cocoon/sitemap/1.0">
2<!-- ================== Views ========================= -->
3<map:views>
4<map:view from-label="content" name="content">
5<map:serialize type="xml"></map:serialize>
6</map:view>
7<map:view from-label="content" name="pretty-content">
8<map:transform src="context://stylesheets/system/xml2html.xslt"></map:transform>
9<map:serialize type="html"></map:serialize>
10</map:view>
11<map:view from-position="last" name="links">
12<map:serialize type="links"></map:serialize>
13</map:view>
14</map:views>
15<!-- ================ Pipelines ====================== -->
16<map:pipelines>
17<map:pipeline>
18
19** <!-- ================ MyFO2RTF =================== --> **
20
21** <map:match pattern="hello.rtf"> **
22
23** <map:generate src="fo/hello.xml"></map:generate> **
24
25** <map:transform src="fo/page2fo.xsl"></map:transform> **
26
27** <map:serialize type="fo2rtf"></map:serialize> **
28
29** </map:match> **
30
31** <!-- ================ MyFO2RTF =================== --> **
32
33</map:pipeline>
34</map:pipelines>
35</map:sitemap>
** sitemap.xmap ** 是一个当前站点的配置,非常重要。“ ** map:match ** ”节点指明了如何转换。
新建一个子文件夹 Fo ,其中放置这么两个文件:
** hello.xml **
n