79 lines
2.4 KiB
Python
79 lines
2.4 KiB
Python
#!/usr/bin/env python3
|
|
"""Offline runtime smoke test for the LocalSandbox Office toolchain."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import shutil
|
|
import subprocess
|
|
import tempfile
|
|
from pathlib import Path
|
|
|
|
|
|
def require_command(name: str) -> str:
|
|
path = shutil.which(name)
|
|
if path is None:
|
|
raise RuntimeError(f"missing command: {name}")
|
|
return path
|
|
|
|
|
|
def assert_contains(text: str, expected: str, label: str) -> None:
|
|
normalized = text.replace("\\_", "_")
|
|
if expected not in normalized:
|
|
raise RuntimeError(f"{label} conversion lost test text: {text[:300]!r}")
|
|
|
|
|
|
def main() -> int:
|
|
from docx import Document
|
|
from markitdown import MarkItDown
|
|
from openpyxl import Workbook
|
|
from pptx import Presentation
|
|
|
|
soffice = require_command("soffice")
|
|
require_command("pandoc")
|
|
require_command("pdftotext")
|
|
require_command("file")
|
|
|
|
subprocess.run(
|
|
[soffice, "--headless", "--version"],
|
|
check=True,
|
|
capture_output=True,
|
|
text=True,
|
|
timeout=30,
|
|
)
|
|
|
|
with tempfile.TemporaryDirectory(prefix="deerflow-office-selfcheck-") as temporary:
|
|
root = Path(temporary)
|
|
|
|
word_path = root / "word-test.docx"
|
|
document = Document()
|
|
document.add_heading("Word 自检", level=1)
|
|
document.add_paragraph("DEERFLOW_WORD_OK")
|
|
document.save(word_path)
|
|
|
|
excel_path = root / "excel-test.xlsx"
|
|
workbook = Workbook()
|
|
worksheet = workbook.active
|
|
worksheet.title = "自检"
|
|
worksheet.append(["状态", "DEERFLOW_EXCEL_OK"])
|
|
workbook.save(excel_path)
|
|
|
|
ppt_path = root / "ppt-test.pptx"
|
|
presentation = Presentation()
|
|
slide = presentation.slides.add_slide(presentation.slide_layouts[5])
|
|
slide.shapes.title.text = "DEERFLOW_PPT_OK"
|
|
presentation.save(ppt_path)
|
|
|
|
converter = MarkItDown()
|
|
assert_contains(converter.convert(word_path).text_content, "DEERFLOW_WORD_OK", "Word")
|
|
assert_contains(converter.convert(excel_path).text_content, "DEERFLOW_EXCEL_OK", "Excel")
|
|
assert_contains(converter.convert(ppt_path).text_content, "DEERFLOW_PPT_OK", "PowerPoint")
|
|
|
|
print("OFFICE_RUNTIME_SELF_CHECK=PASS")
|
|
print("支持:DOC/DOCX、XLS/XLSX、PPT/PPTX、ODT/ODS/ODP、PDF")
|
|
print("组件:MarkItDown、python-docx、openpyxl、python-pptx、LibreOffice、Pandoc、中文字体")
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|