42 lines
1.8 KiB
Python
42 lines
1.8 KiB
Python
#!/usr/bin/env python3
|
|
"""Report installed document tools and exact font-family availability."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import importlib.metadata
|
|
import shutil
|
|
|
|
from _docx_common import SkillArgumentParser, run_cli, run_program
|
|
|
|
|
|
def main():
|
|
parser = SkillArgumentParser(description="检查文档依赖和指定字体是否实际安装")
|
|
parser.add_argument("--font", action="append", default=[], help="需精确检查的字体家族,可重复传入")
|
|
args = parser.parse_args()
|
|
tools = {name: shutil.which(name) for name in ("soffice", "pandoc", "pdftoppm", "pdftotext", "typst", "fc-list")}
|
|
packages = {}
|
|
for name in ("python-docx", "lxml", "defusedxml", "Pillow", "pdfplumber", "pypdf", "rapidocr", "onnxruntime"):
|
|
try:
|
|
packages[name] = importlib.metadata.version(name)
|
|
except importlib.metadata.PackageNotFoundError:
|
|
packages[name] = None
|
|
fonts = set()
|
|
if tools["fc-list"]:
|
|
result = run_program([tools["fc-list"], "--format", "%{family}\n"], timeout=30)
|
|
fonts = {name.strip() for line in result.stdout.splitlines() for name in line.split(",") if name.strip()}
|
|
lookup = {name.casefold() for name in fonts}
|
|
requested = {name: name.strip().casefold() in lookup for name in args.font}
|
|
return {
|
|
"tools": tools, "packages": packages,
|
|
"missing_tools": [name for name, path in tools.items() if not path],
|
|
"missing_packages": [name for name, version in packages.items() if not version],
|
|
"requested_fonts": requested,
|
|
"missing_fonts": [name for name, installed in requested.items() if not installed],
|
|
"font_inventory_available": bool(tools["fc-list"]),
|
|
"font_families": sorted(fonts),
|
|
}
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(run_cli(main))
|