java - 将从 Word 粘贴到 Firefox 富文本编辑器的文本转换为 xsl-fo,同时保留格式 (Java) (Apache FOP)

标签 java xml xslt ms-word xsl-fo

我有一个基于 Java 的内容管理系统,公司员工可以将报告输入到 Web 表单中,并将报告正文输出到富文本字段中。然后可以使用 XSL-FO 将这些报告输出为 PDF。

员工的常见做法(我无法改变或争论)是在 Microsoft Word 中准备报告,然后将这些报告复制粘贴到 CMS 中。

浏览器富文本框在保留和显示 MS Word 内容格式方面做得还可以。但是,在 FO 中转换为 PDF 时,大部分格式都会丢失。最常见的提示之一是表格列和行的大小被破坏。

为了说明这一点,在 word 中看起来像这样:

word doc

在浏览器中看起来像这样:

browser rtf

但是在 pdf 中看起来像这样:

pdf

总的来说,我的问题是如何将粘贴的 MS Office 内容转换为 FO,同时保留原始格式?有没有一个库可以做到这一点?

<小时/>

有些事情可能有帮助,也可能没有帮助,对于可能帮助解决这个问题的人来说,可能很明显,也可能不明显。

粘贴的 Word 内容将存储在我们的数据库中,如下所示:

<p>Words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words.</p> <p>Words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words.</p> <p>Words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words.</p> <table cellspacing="0" cellpadding="0" border="1"> <tbody><tr> <td width="208" valign="top"> <p>test</p> </td> <td width="44" valign="top"> <p>b</p> </td> <td width="372" valign="top"> <p>cd</p> </td> </tr> <tr> <td width="208" valign="top"> <p>&nbsp;</p> </td> <td width="44" valign="top"> <p>&nbsp;</p> </td> <td width="372" valign="top"> <p>&nbsp;</p> </td> </tr> <tr> <td width="208" valign="top"> <p>&nbsp;</p> </td> <td width="44" valign="top"> <p>&nbsp;</p> </td> <td width="372" valign="top"> <p>&nbsp;</p> </td> </tr> <tr> <td width="208" valign="top"> <p>&nbsp;</p> </td> <td width="44" valign="top"> <p>&nbsp;</p> </td> <td width="372" valign="top"> <p>&nbsp;</p> </td> </tr> <tr> <td width="208" valign="top"> <p>&nbsp;</p> </td> <td width="44" valign="top"> <p>&nbsp;</p> </td> <td width="372" valign="top"> <p>&nbsp;</p> </td> </tr> <tr> <td width="208" valign="top"> <p>&nbsp;</p> </td> <td width="44" valign="top"> <p>&nbsp;</p> </td> <td width="372" valign="top"> <p>&nbsp;</p> </td> </tr> <tr> <td width="208" valign="top"> <p>&nbsp;</p> </td> <td width="44" valign="top"> <p>&nbsp;</p> </td> <td width="372" valign="top"> <p>&nbsp;</p> </td> </tr> </tbody></table> <p>&nbsp;</p> <!--[if gte mso 9]><xml> </xml><![endif]--><!--[if gte mso 9]><xml> Normal 0 false false false EN-US X-NONE X-NONE </xml><![endif]--><!--[if gte mso 9]><xml> </xml><![endif]--><!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Table Normal"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-parent:""; mso-padding-alt:0in 5.4pt 0in 5.4pt; mso-para-margin-top:0in; mso-para-margin-right:0in; mso-para-margin-bottom:8.0pt; mso-para-margin-left:0in; line-height:107%; mso-pagination:widow-orphan; font-size:11.0pt; font-family:"Calibri",sans-serif; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi;} table.MsoTableGrid {mso-style-name:"Table Grid"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-priority:39; mso-style-unhide:no; border:solid windowtext 1.0pt; mso-border-alt:solid windowtext .5pt; mso-padding-alt:0in 5.4pt 0in 5.4pt; mso-border-insideh:.5pt solid windowtext; mso-border-insidev:.5pt solid windowtext; mso-para-margin:0in; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:11.0pt; font-family:"Calibri",sans-serif; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi;} </style> <![endif]-->

那么,这似乎是从内容中提取 MS 样式表,然后将其转换为 FOP(Apache FO 处理器,我们用来转换/显示 FO)可以理解的内容的问题?

看起来表格大小是存储在表格标签本身中的,但问题似乎是在转换时出现以下一系列错误:

10/11/19 11:03 AM: Error in width property value '208': org.apache.fop.fo.expr.PropertyException: No conversion defined 10/11/19 11:03 AM: Error in width property value '44': org.apache.fop.fo.expr.PropertyException: No conversion defined 10/11/19 11:03 AM: Error in width property value '372': org.apache.fop.fo.expr.PropertyException: No conversion defined

我将如何定义从 MS 的宽度数字到 FOP 可以理解的数字的转换?

注意:这是一个在 Java 1.5 上运行的旧版 CMS,使用 Apache Fop .20.5。如果有一个库可以满足我的要求,但它不兼容,我希望它是开源的,这样我就可以将它“降级”以与 Java 1.5 一起使用。

最佳答案

width 属性应该是长度或百分比(请参阅 https://www.w3.org/TR/xsl11/#width )。为了解决眼前的问题,您的 XSLT 应该在生成提供给 FOP 的 XSL-FO 时在数字后面添加一个单位。

诸如 width="208px" 甚至 width="208pt" 之类的内容应该可以阻止 FOP 提示。当您能够生成 PDF 时,您可能会发现 208px 太宽或太窄,因此您可能需要在处理过程中缩放数字(或者您可能可以修改 FOP 的想法)每英寸像素数)。

关于java - 将从 Word 粘贴到 Firefox 富文本编辑器的文本转换为 xsl-fo,同时保留格式 (Java) (Apache FOP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58346949/

相关文章:

java - Hibernate 不使用 spring boot 从 mysql 表返回数据

java - Servlet 的 EJB 注入(inject) - JBoss AS 7

ruby-on-rails - Ruby on Rails XML 生成

Xslt 将元素复制到现有元素或创建新元素(如果不存在)

xml - 如何处理 XML 命名空间

java - 系统找不到该文件

java - Osgi - Virgo 3.6 - 加载应用程序上下文

java - 将 XML 文档转换为字符串

c# - 通过 linq 从 xml 检索数据时出现问题

xslt - 保留 xsl :sort'd nodes 之间的空格