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

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

Сообщение Anonymous »

new_test_working.py # Конвейер: # 1) CDA XML + клиент XSL -> XHTML (сохранено) # 2) XHTML + преобразователь XSL -> XSL-FO (сохранено) # 3) (необязательно) FOP -> PDF
Похоже, что ваше сообщение содержит код, который неправильно отформатирован как код. Сделайте отступ для всего кода на 4 пробела, используя кнопку на панели инструментов кода или сочетание клавиш CTRL+K. Для получения дополнительной помощи по редактированию щелкните значок [?] на панели инструментов.

from pathlib import Path
from lxml import etree
import subprocess
import shutil
import os

def compile_xslt(xsl_path: Path) -> etree.XSLT:
if not xsl_path.exists():
raise FileNotFoundError(f"Missing XSL file: {xsl_path.resolve()}")
doc = etree.parse(str(xsl_path))
print(f"[XSL] {xsl_path.name} root tag = {doc.getroot().tag}")
return etree.XSLT(doc)

def run_fop(fo_path: Path, pdf_path: Path, fop_cmd: str | None = None):
"""
Convert XSL-FO to PDF using Apache FOP.

fop_cmd options:
- None: tries to find `fop` on PATH
- "fop": explicit PATH command
- "/full/path/to/fop": absolute path to fop script/binary
"""
if not fo_path.exists():
raise FileNotFoundError(f"FO file not found: {fo_path.resolve()}")

pdf_path.parent.mkdir(parents=True, exist_ok=True)

# If caller didn't pass fop_cmd, try PATH
if not fop_cmd:
fop_cmd = shutil.which("fop")
if not fop_cmd:
raise RuntimeError(
"Apache FOP not found on PATH.\n"
"Either add `fop` to PATH or set FOP_CMD to the full path.\n"
"Example: FOP_CMD='/home/hci/local/fop-2.9/fop/fop'"
)

cmd = [fop_cmd, str(fo_path), str(pdf_path)]
print("[FOP] Running:", " ".join(cmd))

# Run FOP and capture output for debugging
proc = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)

if proc.returncode != 0:
raise RuntimeError(
"Apache FOP failed.\n"
f"Command: {' '.join(cmd)}\n"
f"STDOUT:\n{proc.stdout}\n"
f"STDERR:\n{proc.stderr}\n"
)

print(f"[FOP] PDF generated: {pdf_path}")

def main():
xml_file = Path("hcamockedccd.xml")
client_xsl = Path("HealoWStylesheet.xsl") # CDA -> XHTML
mapper_xsl = Path("xhtml_to_fo.xsl") # XHTML -> FO

out_dir = Path("output")
out_dir.mkdir(parents=True, exist_ok=True)

xhtml_out = out_dir / f"{xml_file.stem}.xhtml"
fo_out = out_dir / f"{xml_file.stem}.fo"
pdf_out = out_dir / f"{xml_file.stem}.pdf"

# ---- Optional: provide explicit FOP command path ----
# If `fop` is already on PATH, you can leave this as None.
# Example paths:
# Linux (installed locally): "/home/hci/local/fop-2.9/fop/fop"
# Another system path: "/opt/fop/fop"
FOP_CMD = os.environ.get("FOP_CMD") # or set directly as a string

print("Step 1) XML + client XSL -> XHTML")
xml_tree = etree.parse(str(xml_file))
client_transform = compile_xslt(client_xsl)
xhtml_result = client_transform(xml_tree)

xhtml_bytes = etree.tostring(
xhtml_result,
pretty_print=True,
encoding="UTF-8",
xml_declaration=True
)
xhtml_out.write_bytes(xhtml_bytes)
print(f"Saved XHTML: {xhtml_out}")
print("XHTML root tag:", etree.fromstring(xhtml_bytes).tag)

print("Step 2) XHTML + mapper XSL -> XSL-FO")
try:
xhtml_tree = etree.parse(str(xhtml_out))
except etree.XMLSyntaxError:
parser = etree.XMLParser(recover=True, huge_tree=True)
xhtml_tree = etree.parse(str(xhtml_out), parser)

mapper_transform = compile_xslt(mapper_xsl)
fo_result = mapper_transform(xhtml_tree)

fo_bytes = etree.tostring(
fo_result,
pretty_print=True,
encoding="UTF-8",
xml_declaration=True
)
fo_out.write_bytes(fo_bytes)
print(f"Saved FO: {fo_out}")
print("FO root tag:", etree.fromstring(fo_bytes).tag)

print("Step 3) FO -> PDF (Apache FOP)")
run_fop(fo_out, pdf_out, fop_cmd=FOP_CMD)

if __name__ == "__main__":
main()



Подробнее здесь: https://stackoverflow.com/questions/798 ... sic-layout
Ответить

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

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

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

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

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