Конвертируйте текст, вставленный из Word в редактор форматированного текста Firefox, в xsl-fo с сохранением форматирования (Java) (Apache FOP) - PullRequest
0 голосов
/ 11 октября 2019

У меня есть система управления контентом на основе Java, в которой сотрудники компании вводят отчеты в веб-форму, а тело отчета выводится в поле расширенного текста. Затем эти отчеты можно выводить в PDF с использованием XSL-FO.

Обычная практика сотрудников (с которой я не могу изменить или спорить) - это готовить отчеты в Microsoft Word, а затем копировать и вставлять их. отчеты в CMS.

Окно расширенного текста браузера выполняет приемлемую работу, сохраняя и отображая форматирование содержимого MS Word. Однако при конвертации в PDF в FO большая часть форматирования теряется. Одна из самых распространенных претензий заключается в том, что размеры столбцов и строк таблицы не совпадают.

Чтобы проиллюстрировать, что-то похожее на это слово:

word doc

В браузере будет выглядеть так:

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: ошибка в значении свойства ширины '208': org.apache.fop.fo.expr.PropertyException: преобразование не определено 10/11/19 11:03: ошибка в значении свойства ширины '44': org.apache.fop.fo.expr.PropertyException: преобразование не определено 10/11/19 11:03: ошибка в значении свойства width '372': org.apache.fop.fo.expr.PropertyException: преобразование не определено

Как мне определить преобразование из чисел ширины MS в то, что понимает FOP?

Примечание. Это более старая CMS, работающая на Java 1.5 с использованием Apache Fop .20.5. Если есть библиотека, которая делает то, что я запрашиваю, и она не совместима, я надеюсь, что это открытый исходный код, поэтому я могу предположительно «понизить» ее для работы с Java 1.5.

1 Ответ

0 голосов
/ 12 октября 2019

Свойство width должно быть длиной или в процентах (см. https://www.w3.org/TR/xsl11/#width).. Чтобы обойти вашу непосредственную проблему, ваш XSLT должен добавить единицу после числа при генерации XSL-FO, который вы передаете в FOP.

Что-то вроде width="208px" или даже width="208pt" должно помешать FOP жаловаться. Когда вы дойдете до возможности генерировать PDF, вы можете обнаружить, что 208px слишком широк или слишком узок, так что выможет потребоваться масштабировать число как часть обработки (или вы можете изменить представление FOP о количестве пикселей на дюйм).

...