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



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

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

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

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

字文档

在浏览器中将如下所示:

浏览器 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的内容(理解的内容的问题?

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

19-10-11 上午11:03:宽度属性值"208"中出现错误: org.apache.fop.fo.expr.PropertyException: 未定义转换 19-10-11 上午11:03:宽度属性值"44"错误: org.apache.fop.fo.expr.PropertyException: 未定义转换 19-10-11 上午11:03:宽度属性值"372"中出错: org.apache.fop.fo.expr.PropertyException: 未定义转换

我将如何定义从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 对每英寸像素数的想法(。