繁体   English   中英

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

[英]Convert text pasted from Word into a Firefox rich-text editor to xsl-fo while preserving formatting (Java) (Apache FOP)

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

员工的一种常见做法(我不同意更改或争论)是在 Microsoft Word 中准备报告,然后将这些报告复制粘贴到 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:未定义转换 2019 年 10 月 11 日上午 11:03:宽度属性值“372”错误:org.apache.fop.fo.expr.转换定义

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM