Преобразование HTML в XSL-FO: лучший подход/инструмент для сохранения базового макета? [закрыто]Python

Программы на Python
Ответить
Anonymous
 Преобразование HTML в XSL-FO: лучший подход/инструмент для сохранения базового макета? [закрыто]

Сообщение Anonymous »

Мне нужно сгенерировать PDF-файлы, и мой текущий конвейер ожидает XSL-FO (отображаемый механизмом FO), но мой входной контент - это HTML.
Я пытаюсь понять правильный способ преобразования 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 pathlib import Path
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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»