导航
  • 主页
  • ASP
  • .NET Framework
  • Web Services
  • VB
  • VC
  • 图表区
  • 分析与设计
  • 组件/控件开发
  • LINQ
  • 问答

HTML 与 RTF格式之间的相互转换方法?

lanye_purple 2008-05-12 11:21:32
HTML 与 RTF格式之间的相互转换,不能用工具.
...全文
366 点赞 收藏 5
写回复
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianbao9184 2010-07-13
关注!同求解决方法
回复
指间的风 2008-05-13
http://www.ibm.com/developerworks/cn/xml/tips/x-tiprtfg/index.html

http://bbs.w3china.org/dispbbs.asp?boardID=23&ID=12041
技巧: 将 RTF 文档转换成 HTML 文档

XML 是将现有的 RTF 格式(Rich Text Format)文档转换成 HTML 以在 Web 上显示的理想媒介。这篇技巧文章说明了如何使用 Java 应用程序 MajiX 将 RTF 文档转换成 XML 格式(虽然有一些限制)。 从中,您可以容易地用XSLT将 XML 文档转换成适合于浏览器的 HTML 格式。代码样本演示了这些技术,可下载的源代码包含了用于转换的 servlet 容器。
我发现使用 XML 是将旧的 RTF 格式(Rich Text Format)文档转换成 HTML 的最快方法。我决定将 MajiX 软件包作为最方便的方法使用。

什么是 MajiX?
MajiX 是由 TetraSix 开发的一种开放源码软件包(遵守 Mozilla Public License 1.1),用于 MS Word 到 XML 的转换。 它将 RTF 文档转换成 XML。如果要遵循这篇技巧文章中的说明,请立即从 http://tetrasys.dhs.org/ 下载 MajiX。

准确地讲,MajiX 使用什么样的 XML 标记来表示 RTF 文档呢?MajiX 有两个现成的转换模板:mydoc 和 sdocbook。

mydoc 模板使用 MajiX 专有的 XML 标记来表示 RTF,例如:

清单 1. MajiX 的 mydoc XML 格式
.
.
.
<mydoc>
<p><b>Lord of the Rings</b></p>
.
.
.
</mydoc>



在该示例中,<mydoc>、<info> 和 <author> 等标记都是 MajiX 专有的 XML 标记。

sdocbook 模板使用 Simplified DocBook 标记(请参阅参考资料)。Simplified DocBook 是广受欢迎的 DocBook 元素的子集,DocBook 在全球范围内被用于编写文章和书籍。例如,Linux Documentation Project 使用 DocBook 来编写 Linux 文档。DocBook 是由“结构化信息标准促进组织”(Organization for Advancement of Structured Information Standard (OASIS))维护的。

清单 2 显示了一个缩略的 sdocbook 标记示例。

清单 2. sdocbook XML 格式
.
.
.
<article>
<para><emphasis>Lord of the Rings</emphasis></para>
.
.
.
</article>



比较清单 1 和 清单 2 时注意,mydoc XML 和 sdocbook XML 使用不同的方法来表示同一个文档。

既然 DocBook 是一种受欢迎的标记文档方法,我将演示如何将 RTF 转换成 Simplified DocBook(sdocbook)。

运行 MajiX
MajiX 是一个 Java 应用程序。所以,它需要“Java 虚拟机”(Java Virtual Machine)。您可以以交互方式或批处理方式运行它。

批处理方式还是交互方式?
当要转换许多文档时,以批处理方式运行 MajiX 效果会比较好。您可以编写一个 shell 脚本(UNIX)或批处理文件(Windows,DOS)来转换特定目录中的所有 RTF 文件,而不是以交互方式对它们进行逐个转换。

对于这篇技巧文章,我将始终按交互方式运行 MajiX, 因为我将演示如何仅转换一个文档(您的智慧将告诉您如何对您所拥有的其它文档进行转换)。

在 JDK 1.2 或更高版本中,只要输入下列命令就可运行 MajiX:


java -jar <MajiX install path>\lib\majix.jar



或者(在一行中输入下列所有内容):


java -classpath <MajiX install path>\lib\majix.jar
com.tetrasix.majix.MajixStandard



第 1 步:将 RTF 转换成 XML
现在,有了正在运行的 MajiX,您就可以将 RTF 文档转换成 XML 了。

选择 XML 输出的类型
在 Conversion templates 下,您将看到 mydoc(缺省的转换模板)。将它改为 sdocbook。

设置 XSL 样式表
在下一步中 — 从 sdocbook 输出到 HTML 的转换 — 需要一个 XSL 样式表以进行 XSLT 转换。 如果您不知道该使用哪种样式表,不必担心,因为我将在这篇技巧文章的下一章中讨论它。 现在,您只需要知道,您可以在转换期间在 sdocbook 输出或命令行中指定用于转换的样式表。 我选择使用命令行选项,这样,我就不必告诉 MajiX 样式表的位置。如果选择其它选项, 那么 MajiX 将包含在它所生成的 sdocbook 输出中使用的样式表,如下所示:


<?xml-stylesheet type="test/xsl" href="sdocbook.dtd"?>



注意:在我测试的 MajiX 实现中似乎有一个错误。如果选择让 MajiX 在 sdocbook 输出中指定样式表,那么它将生成包含标记 xml:stylesheet(而不是 xml-stylesheet)的 DTD 声明。这是不正确的;您必须手工编辑该文件来校正错误。

要将样式表名设置为空:

单击 Edit tags。
向下滚动,直到看到 Stylesheet name 为止,然后双击它。编辑面板应该出现在右边。
删除样式表名称属性的值。
单击 Validate。
单击 Close。

设置 DTD
除了样式表声明外,XML 文档还有文档类型定义(DTD)声明。我已经提供了一个 DTD 声明示例。

请记住,XML 文档包含标记。XML 定义有关标记如何构建文档的规则,但它不涉及标记应该是什么。 它们可以是从 <html> ... </html> 到 <fat> ... </fat> 的任何标记。

回到清单 1 中的 MajiX 的 mydoc XML 格式,请注意,MajiX 专有的 mydoc XML 文档有 <mydoc> 标记,而 sdocbook XML 格式有 <article>。DTD 用来控制每种格式使用哪种标记。仅当 XML 文档符合 sdocbook DTD 中的定义时,才可把它视作有效的 sdocbook XML 文档。这样就确保任何能够理解 sdocbook DTD 的两个系统都可以成功地相互交换文档。

可以从 sdocbook 的 OASIS 页面下载 sdocbook 的 DTD 定义, 然后将它安装在一个方便的目录中。

要设置 DTD 以指向安装 sdocbook DTD 的位置:

单击 Edit tags。
向下滚动,直到看到 DTD System Identifier 为止,然后双击它。编辑面板应该出现在右边。
输入安装 sdocbook.dtd 的位置。
单击 Validate。
单击 Close。

HTML 是 XML

XML 被定义为使用标记来标记文档的任何方法。当然,标记必须遵循某些规则:

每个标记必须带一个封闭标记。<html> ... </html>
标记可以以这种方式嵌套:<html> <title> ... </title> </html> 但不能相交:<html> <title> ... </html> </title> 等规则。
HTML 是使用标记来标记文档的一种方法,它符合 XML 的规则,因而 HTML 文档是 XML 文档。

选择要转换的 RTF 文档
接下来,通过使用 Input RTF File 下面的 Find Document 来选择要转换的 RTF 文档。MajiX 通过将 RTF 文档的扩展名从 .rtf 更改为 .xml 为您自动填充 Output XML File。 单击 Convert 以执行转换。

这时,MajiX 可能会提示您一些选项。当您有一个奇怪的 RTF 标记(在 sdocbook XML 中,MajiX 没有它的等价标记)时, 会出现这个提示。一般单击缺省值就可以了。

现在,转换 RTF 文档的第一部分已经完成。结果是带 sdocbook 标记的 XML 文档。

第 2 步:将 XML 转换成 HTML
要将 XML 输出转换成 HTML,需要一个 XML 转换引擎(XSLT 处理器),如 Xalan、XP 或 Saxon。对于这次演示,我使用 Xalan。XSLT 处理器把 XML 文档作为输入,并根据某些转换规则生成一个新的 XML 文档。 这把我们带到下一个需求:转换规则。因为我们的目的是根据 sdocbook XML 生成 HTML 文档(请参阅侧栏的 HTML 是 XML),所以需要说明如何将 sdocbook 中的元素映射成 HTML 等价标记的转换规则。

XSL 样式表包含这样一些转换规则。基本上(使用上面的示例),输入文件是清单 2, 输出文件将是生成的 HTML 文件。XSL 样式表需要指示 XML 转换引擎做的事情之一是:将 <html> 标记添加到生成文档的开始和末尾。 转换规则还在生成的 HTML 文档中用 <p> ... </p> 将输入文件中 <para> ... </para> 内的文本括起来,等等。简而言之,sdocbook 标记将转换成相应的 HTML 标记。下面显示了根据 sdocbook XML 生成的 HTML:

清单 3. 根据 sdocbook XML 生成的 HTML
.
.
.
<html>
<p><b>Lord of the Rings</b></p>
.
.
.
</html>



此时,您可能觉得很兴奋,并推断您总是可以编写转换规则,将 sdocbook XML 文档转换成其它格式,如 PDF、UNIX 帮助页面等其它类似的格式。您是对的!这正是 XML 文档与 XSL 样式表的功能相结合的美妙之处。

因为 DocBook XML 对于文档编写是如此的流行,所以可以轻易地得到要执行转换的样式表并不稀奇。 从 http://sourceforge.net/project/showfiles.php?group_id=21935 下载它们。文件在 docbook-xsl-<version> 中。这篇技巧文章所用的是 4.1.2。如果您打算遵循本文中的技巧,那么现在就安装样式表。

要将 sdocbook XML 转换成 HTML,输入清单 4 中的命令。请注意,必须完整地输入该命令。 在清单 4 中,我将它分成几行,只是让它适合便携式电脑屏幕。

清单 4. 将 sdocbook XML 转换成 HTML 的命令(将它输入在一行中)
java -classpath
<xalan install path>\bin\xalan.jar;
<xalan install path>\bin\xerces.jar
org.apache.xalan.xslt.Process
-IN <input file>
-OUT <output file>
-XSL <location of docbook.xsl>




用浏览器打开输出文件 ...!

实时将 XML 转换成 HTML
到目前为止,我已经演示了如何将 RTF 文档转换成 HTML 文档。一旦有了 HTML 输出,就可将它们存储在 Web 服务器, 以便通过 Web 访问它们。然而,这意味着每次更改 sdocbook 文档,都必须重新生成 HTML。 或者,可以设置自动生成 DocBook 文档的 HTML 文档,以响应每次 Web 请求。但是,这种动态生成可能会给您的服务器添加巨大的负载。 便利与性能相比 ... 或许答案是进行高速缓存?请您自己来判定,因为其自身就是一篇独立文章。

要实时生成 HTML 文档,需要一个 Web 服务器和一个 servlet 容器。光有 Web 服务器只能够提供静态 HTML 页面的服务。servlet 扩展了其能力。它可以处理传递到 Web 服务器的参数并根据传入的参数实时生成一个 HTML 页面。 简而言之,servlet 能够使 Web 服务器完全象 CGI 程序那样提供动态 HTML 页面的服务。

您可以从几乎无止境的 Web 服务器和 servlet 容器组合中进行选择,当然也包括 IBM 的 WebSphere Application Server。Jakarta Tomcat servlet 容器(请参阅参考资料)是用于测试这个技巧的一个开放源码选项:它是与内部 Web 服务器一起提供的 servlet 容器。缺省情况下,它在 8080 上侦听。

“参考资料”中提供了执行从 sdocbook XML 到 HTML 转换的 servlet 代码。我将简要地说明一下清单 5 中最重要的代码部分。

让我们注意一下清单 5 中用数字标记的蓝色行:

设置由 Web 服务器返回给 Web 浏览器的文档类型。在这一情况下是 HTML,因为我打算将 sdocbook XML 转换成 HTML。
将 servlet 的输出设置为到 Web 浏览器的响应流。
设置将传入 Xalan 转换程序的 XML 源。这是源文档(sdocbook XML)。它将使用从浏览器传递来的文件参数来构成 sdocbook XML 的文件名。
设置 XSL 源,它包含有关 Xalan 将如何执行转换的规则。这是 XSL 样式表;将它设置为存储样式表的位置。
使用您在标记为 4 的行中定义的 XSL 样式表来创建 Xalan 转换程序。
执行转换并将结果发送到响应流。

结束语
MajiX 向您提供了一种将 RTF 文档转换成 sdocbook XML 格式的快捷方式。而且,XSLT 处理器(如 Xalan)可以将产生的 sdocbook XML 重新格式化成 HTML,以便可以从 Web 访问它们。
回复
jjcl521 2008-05-13
需要关注
回复
wxg22526451 2008-05-12
不用工具?
不会关注下。
回复
CathySun118 2008-05-12
http://topic.csdn.net/t/20061125/05/5184033.html
回复
发动态
发帖子
.NET技术社区
创建于2007-09-28

5.8w+

社区成员

.NET技术交流专区
申请成为版主
社区公告
暂无公告