У нас есть Java-система, которая считывает данные из базы данных, объединяет отдельные поля данных с предустановленными тегами XSL-FO
и преобразует результат в PDF
с помощью Apache FOP
.
В формате XSL-FO
это выглядит так:
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE Html [
<!ENTITY nbsp " ">
<!-- all other entities -->
]>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="xml" indent="yes" />
<xsl:template match="/">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:svg="http://www.w3.org/2000/svg" font-family="..." font-size="...">
<fo:layout-master-set>
<fo:simple-page-master master-name="Letter Page" page-width="8.500in" page-height="11.000in">
<!-- appropriate settings -->
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="Letter Page">
<!-- some static content -->
<fo:flow flow-name="xsl-region-body">
<fo:block>
<fo:table ...>
<fo:table-column ... />
<fo:table-body>
<fo:table-row>
<fo:table-cell ...>
<fo:block text-align="...">
<fo:inline font-size="..." font-weight="...">
<!-- Header / Title -->
</fo:inline>
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:block>
<fo:block>
<fo:table ...>
<fo:table-column ... />
<fo:table-body>
<fo:table-row>
<fo:table-cell>
<fo:block ...>
<!-- Field A -->
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
<!-- Other fields in a very similar fashion as the above "Field A" -->
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
</xsl:stylesheet>
Теперь я ищу способ разрешить некоторым полям содержать статический HTML-формат. Этот контент будет создан нашим редактором HTML (что-то вроде строк CLEditor
, CKEditor
и т.д.) Или вставлено снаружи.
Мой план состоит в том, чтобы следовать рецепту из этой статьи JavaWorld:
- используйте
JTidy
для преобразования строки в формате HTML в соответствующий XHTML - дополнительно измените xhtml2fo.xsl из Antenna House, чтобы удалить все преобразования для всего документа и всего веб-сайта.
- применить этот модифицированный XSLT к моей строке XHTML (javax.xml.transform)
- извлеките все узлы под корнем с помощью XPath (javax.xml.xpath)
- передать результат непосредственно в существующий документ XSL-FO
У меня есть голосовой вариант такого кода и получил следующую ошибку:
(Место ошибки неизвестно) org.apache.fop1.fo.ValidationException: "{http://www.w3.org/1999/XSL/Format} table-body" не является допустимым дочерним "fo: block"! (Отсутствует контекстная информация)
Мои вопросы:
- Каким образом можно устранить эту проблему?
- Может ли
<fo:block>
использоваться как общий контейнер с другими объектами (включая таблицы), вложенными внутри? - Это общий разумный подход к решению задачи?
Если кто-то уже "был там, это сделал", пожалуйста, поделитесь своим опытом.