Я пытаюсь создать из HTML PDF в Flying Saucer. В конце я хотел бы получить что-то вроде счета.
Я также использую JSF / Primefaces для генерации HTML кода. Моя функция generateHtmlCodeController генерирует простой HTML код.
Может быть, немного больше фона: у меня есть дизайнер, который генерирует мой шаблон. Все настройки шаблона хранятся в файле XML. Во время рендеринга файл XML будет загружен и генерируется на основе этого кода HTML (generateHtmlCodeController). Все это уже реализовано и работает.
Основная проблема связана с летающими тарелками и перекрывающимися таблицами.
Вот мой текущий код JSF:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
<h:outputStylesheet>
@page{
size: A4 portrait;
@top-center {
content: element(header)
}
@bottom-center {
content: element(footer)
}
}
div.header {
display: block; text-align: center;
position: running(header);
}
div.footer {
display: block; text-align: center;
position: running(footer);
}
table {
-fs-table-paginate: paginate;
-fs-page-sequence: auto;
border-spacing: 0;
page-break-after:auto;
}
thead {
display: table-header-group;
}
tfoot {
display: table-header-group;
}
</h:outputStylesheet>
<title>Vorschau</title>
</h:head>
<h:body class="main">
<section> <ui:repeat
value="#{previewDocumentDesignerController.editablePageList}"
var="templatePage" varStatus="templatePageStatus">
<div class="header">
<ui:repeat value="#{templatePage.editableElementHeaderList}"
var="editableElement" varStatus="status">
<div style="position: absolute; top: #{editableElement.top/100 * 21}cm; left: #{editableElement.left/100 * 21}cm;width: #{editableElement.width/100 * 21}cm;height: #{editableElement.height/100 * 29.7 - 0.2}cm;">
<h:outputText
value="#{generateHtmlCodeController.generateHtmlCode(editableElement)}"
escape="false" />
</div>
</ui:repeat>
</div>
<div class="content">
<ui:repeat value="#{templatePage.editableElementContentList}"
var="editableElement" varStatus="status">
<div style="position: absolute; top: #{editableElement.top/100 * 21}cm; left: #{editableElement.left/100 * 21}cm;width: #{editableElement.width/100 * 21}cm;height: #{editableElement.height/100 * 29.7 - 0.2}cm;">
<h:outputText
value="#{generateHtmlCodeController.generateHtmlCode(editableElement)}"
escape="false" />
</div>
</ui:repeat>
</div>
<div class="footer">
<ui:repeat value="#{templatePage.editableElementFooterList}"
var="editableElement" varStatus="status">
<div style="position: absolute; top: #{editableElement.top/100 * 21}cm; left: #{editableElement.left/100 * 21}cm;width: #{editableElement.width/100 * 21}cm;height: #{editableElement.height/100 * 29.7 - 0.2}cm;">
<h:outputText
value="#{generateHtmlCodeController.generateHtmlCode(editableElement)}"
escape="false" />
</div>
</ui:repeat>
</div>
</ui:repeat>
</section>
</h:body>
</html>
Вот вывод с моей первой страницы:

Пожалуйста, смотрите здесь вторую страницу (с вопросом)
