在 C# 中转换 HTML、XML 和 XSL-FO 的最佳方法是什么?
我已经有了 HTML(从 FCKEditor 输入),我想打印一个 PDF(我有一个 XSL->PDF 转换器)。我只是似乎找不到一个可以从 HTML 转换为任何 XSL 友好的库。
一两年前,我不得不从 C++/C# 程序生成 pdf。最后,我决定将 Apache 的 Java FOP作为一个单独的进程来进行转换。使用 xsl-fo 的体验并不愉快。当时,似乎没有一个工具可以完全实现 xsl-fo。工具倾向于选择规范的一个子集并破解它。鉴于 xsl-fo 的庞大复杂性,我开始怀疑是否会有完整的实现。
FOP 往往是错误的,并且花费了大量时间来解决问题。XSLT 和 XPath 很难学习。花了几周的时间,我才看到了冗长的内容,并且可以迅速完成工作。不过,我认为我从来没有完全了解过 xsl-fo。它使 html 和 css 模型看起来像孩子的玩具。幸运的是,生成的 pdf 文件没有太多问题。:-)
无论如何,手头的任务:从 FCKEditor 的 xhtml 输出生成 pdf。
我只是似乎找不到一个可以从 HTML 转换为任何 XSL 友好的库。
呵呵。是的,那是因为没有一个,而且可能不会是一个很好的 html 到 xsl-fo 转换器。这样的转换器有一些缺点:浏览器的复杂性和 xsl-fo 的复杂性。对于这样一个转换器来处理一个普通的 html 文档,它需要一个 web 浏览器的胆量:布局、css 支持甚至可能是 JavaScript。然后它必须获取呈现的页面,并找出需要什么 xsl-fo 才能获得看起来相似的东西,并且适合 xsl-fo 的分页约束。
这就像制作一个单词查看器的问题:如果不重新实现很多单词,它大部分时间都很糟糕,因为它看起来不一样。
所以,你可以做什么?好吧,使用一小部分 html 是一个好的开始。希望 FCKEditor 的输出是 xhtml,因为将 html 转换为 xml 本身就是一个痛苦的世界(这对tidy很有用)。接下来,除非某个可怜的灵魂已经为您的 xsl-fo 实现制作了 FCKEditor xhtml -> xsl-fo xslt,否则您必须制作一个。这包括学习 xsl-fo、xslt 和 xpath。根据我的经验,这将需要几周时间,并且将是一个拼凑的解决方案。
要开始使用 xsl-fo,我发现以下链接很有用:
那么这些 xsl-fo、xslt 的东西和所有其他的东西是什么?XSL-FO:准备好迎接黄金时段了吗?将其布置为:
可扩展样式表语言系列 (XSL) XSL 是一系列用于定义 XML 文档转换和表示的建议。它由三部分组成:
- XSL 转换 (XSLT),一种用于转换 XML 的语言
- XML 路径语言 (XPath),一种由 XSLT 用来访问或引用 XML 文档部分的表达式语言。(XPath 也被 XML Linking 规范使用)
- XSL 格式化对象 (XSL-FO),一个用于指定格式化语义的 XML 词汇表
我的建议?跑。再找一个远方。寻找另一个解决方案。生成 LaTeX 文件,并将它们转换为 pdf。生成别的东西。制作 word 文档并使用PDFCreator打印它们。生成图像。控制 Firefox 将页面打印为 pdf。远离以完全避免需要 pdf。任何东西,只要它不与 html、xsl-fo、FOP、xslt 和 xpath 作斗争。
PS:如果您需要任何帮助,请告诉我。:-)
非常丰富的交流在这里。我为我的 IT 合同业务创建了一个使用 ASP.NET 和 C#.NET 的 Web 应用程序。Web 应用程序的主要目标之一是生成各种格式的定制简历。我将我的简历内容存储在 SQL Server 数据库中,并以 C# 方法构建大部分原始 XML。我使用 XSLT 将其转换为 HTML,并且有一点点笨拙,我终于得到了一份基本的像样的简历。我的下一个目标是获得一份可打印的简历。我从图书馆得到了一本关于 XML 的书,并对 XSLT 进行了一些修改。然后我来到了 XSL-FO 章节。这时候冰山就来了。我想接受挑战,将 PDF 选项作为菜单选项,并将 XSLT 转换为 XSL-FO 到 PDF。事情是所有的书推荐都提到了商业产品。它只是不值钱,因为 PDF 不是必需的。我在 30 天的跟踪基础上查看了 Altova XMLSpy,但是当我尝试第一次转换 XSL-FO 示例文件时,我收到一条消息,指出我需要下载更多软件。那次下载永远从他们的网站上拿走,所以我放弃并删除了该软件。其他供应商提供的免费版商业软件没有转换选项。阅读此处的注释后,我决定自己避免使用 XSL-FO。我现在将尝试获取 MS Word 版本,如果我的客户想要将其转换为 PDF,他们可以从 Adobe 购买 PDF 创建版本。那次下载永远从他们的网站上拿走,所以我放弃并删除了该软件。其他供应商提供的免费版商业软件没有转换选项。阅读此处的注释后,我决定自己避免使用 XSL-FO。我现在将尝试获取 MS Word 版本,如果我的客户想要将其转换为 PDF,他们可以从 Adobe 购买 PDF 创建版本。那次下载永远从他们的网站上拿走,所以我放弃并删除了该软件。其他供应商提供的免费版商业软件没有转换选项。阅读此处的注释后,我决定自己避免使用 XSL-FO。我现在将尝试获取 MS Word 版本,如果我的客户想要将其转换为 PDF,他们可以从 Adobe 购买 PDF 创建版本。
这是一个死问题,但我想为未来的读者补充一点,FCKEditor 的当前化身(现在的 CKEditor)更擅长生成高质量的 XHTML(甚至用户可定义的一组标签也是可能的)。
我通过实际上不使用 XSL-FO 而是使用 (X)HTML 到 PDF 转换器来解决类似问题,该转换器在没有 XSL 转换的情况下从您的源呈现 PDF。我验证了生成的 XHTML 并使用 HtmlAgilityPack 修复了罕见的问题——这种方式将使您远离非语义 HTML 的复杂性。有很多转换器可供选择,我的选择是 wkhtmltopdf(如果钱不是问题,PrinceXML 是一个更好的选择——我很想使用它,但它太贵了)。