Я пытаюсь понять правильный способ преобразования HTML → XSL-FO, в идеале сохраняющий общее форматирование, например:
- заголовки (h1-h6)
- абзацы, жирный/курсив
- списки (ul/ol)
- таблицы
- основной CSS (поля/отступы, размеры шрифта, выравнивание)
- Существует ли надежный подход к преобразованию (библиотека/инструмент) для HTML → XSL-FO?
- Если прямое преобразование не рекомендуется, каков оптимальный конвейер для перехода от HTML к PDF, когда у меня есть существующая инфраструктура на основе FO?
- Как люди обрабатывают CSS, особенно для таблиц и интервалов, во время преобразования?
- Входной HTML может быть создан пользователем, поэтому он может быть беспорядочным.
- При необходимости я могу ограничить подмножество HTML/CSS.
- Я могу запустить преобразование на стороне сервера (Возможны все варианты Java/Python/Node).
- Выходной файл представляет собой XSL-FO XML, который затем преобразуется в PDF с помощью механизма FO.
- Поиск «HTML в XSL-FO» в основном возвращает устаревшие или частичные ссылки. конвертеры.
- Я не уверен, следует ли мне:
- конвертировать HTML → правильно сформированный XHTML → преобразовать в FO (XSLT?)
- использовать специальный конвертер
- избегать FO и использовать средство рендеринга HTML в PDF вместо этого
from lxml import etree
def xml_to_fo(xml_path: Path, client_xsl: Path, xhtml_to_fo_xsl: Path, fo_out: Path):
parser_xml = etree.XMLParser(recover=False, huge_tree=True)
# 1) CDA XML -> XHTML (client stylesheet)
xml_tree = etree.parse(str(xml_path), parser_xml)
client_xslt = etree.XSLT(etree.parse(str(client_xsl), parser_xml))
xhtml_result = client_xslt(xml_tree)
# Important: parse as XML (works because we changed xsl:output to method="xml")
xhtml_bytes = etree.tostring(xhtml_result, encoding="UTF-8", xml_declaration=True)
xhtml_tree = etree.fromstring(xhtml_bytes, parser_xml)
# 2) XHTML -> XSL-FO (our small mapper)
xhtml_to_fo = etree.XSLT(etree.parse(str(xhtml_to_fo_xsl), parser_xml))
fo_result = xhtml_to_fo(etree.ElementTree(xhtml_tree))
# Save FO
fo_out.parent.mkdir(parents=True, exist_ok=True)
fo_out.write_bytes(etree.tostring(fo_result, pretty_print=True, encoding="UTF-8", xml_declaration=True))
if __name__ == "__main__":
xml_to_fo(
Path("hcamockedccd.xml"),
Path("HealoWStylesheet.xsl"), # client file (edited only output method)
Path("xhtml_to_fo.xsl"), # your small mapper
Path("output/output.fo")
)
print("FO generated: output/output.fo")
Подробнее здесь: https://stackoverflow.com/questions/798 ... sic-layout
Мобильная версия