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

问题描述 投票:0回答:1

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

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

浏览器富文本框在保留和显示MS Word内容格式方面做得很好。但是,在FO中转换为PDF时,大多数格式都会丢失。最常见的投诉之一是表格的列和行的大小损坏。

为了说明,在文字上看起来像这样:

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)可以理解的内容?

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

19/11/19 11:03 AM:宽度属性值'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可以理解的转换?

注意:这是使用Apache Fop .20.5在Java 1.5上运行的较旧CMS。如果有一个库可以满足我的要求,并且不兼容,那么我希望它是开源的,因此我可以将其“降级”以使其与Java 1.5兼容。

java xml xslt ms-word xsl-fo
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.