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
Преобразование HTML в XSL-FO: лучший подход/инструмент для сохранения базового макета? [закрыто] ⇐ Python
Программы на Python
1770058249
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()
Подробнее здесь: [url]https://stackoverflow.com/questions/79881294/converting-html-to-xsl-fo-best-approach-tooling-to-preserve-basic-layout[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия