feat: standardize Word export and Office conversion
This commit is contained in:
1 parent
5be21f2c3d
commit
c5eefe60f0
12 files changed
+410
-60
No files matched your search
@@ -0,0 +1,78 @@
|
||||
#!/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())
|
||||
Reference in new issue
Block a user