
CLI-Anything 的 LibreOffice 无界面文档 CLI用命令行驱动 Writer / Calc / Impress 生成真实 ODF 文件【免费下载链接】CLI-AnythingCLI-Anything: Making ALL Software Agent-Native -- CLI-Hub: https://clianything.cc/项目地址: https://gitcode.com/GitHub_Trending/cl/CLI-Anything导读本篇文章以仓库中的技能文档 skills/cli-anything-libreoffice/SKILL.md 为核心深入讲解 CLI-Anything 生态中面向 LibreOffice 的有状态命令行接口stateful CLI。它不依赖 GUI也不强制要求本机安装 LibreOffice即可通过命令创建、编辑并导出 Writer文字、Calc电子表格、Impress演示文稿三类文档产出的 ODF 文件是符合规范的 ZIPXML 结构可被 LibreOffice、Apache OpenOffice 等应用直接打开。读完本文你将掌握从项目创建、内容编辑、样式管理、会话撤销重做到导入既有 Office/ODF 文件与多格式导出的完整命令行工作流并理解其 JSON 项目模型与 ODF 生成底层原理能直接将其接入 AI Agent 的自动化文档流水线。一、项目定位为什么需要一个无 GUI 的 LibreOffice CLI传统上创建 Office 文档依赖 GUI 操作或完整安装 LibreOffice。CLI-Anything 的 LibreOffice 组件提供了一个折中且更工程化的方案CLI 自行维护一份 JSON 格式的项目模型project model再通过 Python 标准库zipfile、xml.etree.ElementTree、json把模型序列化为真实的 ODF 文件。只有在需要导入 Microsoft Office 格式DOCX/XLSX/PPTX或导出 PDF/DOCX 等衍生格式时才调用本机安装的 LibreOffice headless 引擎做格式转换。从源码结构看整个能力被拆成清晰的模块libreoffice_cli.py基于 Click 的 CLI 入口承载全部命令组core/document.py项目/档案管理、writer.py、calc.py、impress.py、styles.py、export.py、importer.py、session.py撤销重做utils/odf_utils.pyODF XML/ZIP 生成与解析、lo_backend.pyLibreOffice headless 桥接、repl_skin.py交互式 REPL 外壳tests/99 个单元测试 73 个端到端测试。这种自产 ODF、按需借力 LibreOffice的双轨设计是本文所有操作能脱离 GUI 运行的根基。二、安装与前置条件CLI 作为独立 Python 包安装pip install cli-anything-libreoffice前置条件PrerequisitesPython 3.10clickCLI 框架pip install click系统级 LibreOfficelibreoffice/soffice仅当需要导入 DOCX/XLSX/PPTX 或导出 PDF、DOCX、XLSX、PPTX、CSV 时才强制要求。从 lo_backend.py 的find_libreoffice()实现可以看到程序会依次在 PATH 中查找libreoffice/soffice再探测 WindowsC:\Program Files\LibreOffice\program\soffice.exe等与 macOS/Applications/LibreOffice.app/Contents/MacOS/soffice的常见安装路径找不到时抛出带安装提示的RuntimeError。若走纯 ODF 路线ODT/ODS/ODP/HTML/TXT则完全不需要 LibreOffice。三、快速上手基本命令与三种运行方式# 查看帮助 cli-anything-libreoffice --help # 直接启动交互式 REPL无子命令时进入 cli-anything-libreoffice # 创建新项目 cli-anything-libreoffice project new -o project.json # 以 JSON 输出运行供 Agent 消费 cli-anything-libreoffice --json project info -p project.json注意技能文档中出现了project组与-p参数的历史写法而当前源码libreoffice_cli.py实际实现的是document命令组项目路径通过全局选项--project或document new/open/import的--output/-o传入。因此请以以下真实可用的命令形态为准# 新建 Writer 文档并保存为项目 JSON cli-anything-libreoffice document new --type writer --name Report -o report.json # 打开项目并查看信息默认人类可读 cli-anything-libreoffice --project report.json document info # JSON 输出供 Agent 解析 cli-anything-libreoffice --json --project report.json document info在 REPL 模式下输入help可查看全部命令quit/exit/q退出且支持 tab 补全与历史记录。四、命令组全解Document / Writer / Calc / Impress4.1 Document文档生命周期管理命令说明document new创建新文档--type writer\|calc\|impress默认 writer--name--profile-o保存路径document open path打开项目 JSON若传入 Office/ODF 文件则自动走导入流程-o指定项目 JSON 输出document import file -o out.json将既有 Office/ODF 文件转换为可编辑的项目 JSONdocument import-formats列出支持的导入格式document save [path]保存当前文档document info显示文档信息类型、内容/工作表/幻灯片数量、样式数等document profiles列出可用页面档案document json打印原始项目 JSONdocument new的--type仅接受writer、calc、impress三者之一非法值会被 Click 直接拒绝--profile的完整取值在 document.py 的PROFILES表中定义档案名页面尺寸页边距a4_portrait21cm × 29.7cm四周 2cma4_landscape29.7cm × 21cm四周 2cmletter_portrait21.59cm × 27.94cm四周 2.54cmletter_landscape27.94cm × 21.59cm四周 2.54cmlegal_portrait21.59cm × 35.56cm四周 2.54cmpresentation_16_933.867cm × 19.05cm0presentation_4_325.4cm × 19.05cm0这些尺寸与边距最终会写入 ODF 的styles.xml页面布局page-layout节点见 odf_utils.py。4.2 Writer文字处理命令说明writer add-paragraph添加段落--text/-t--position/-p指定插入位置--font-size、--bold、--italic、--alignment内联样式writer add-heading添加标题--level/-l 1-6默认 1writer add-list添加列表--items/-i可多次传值--style bullet\|number默认 bulletwriter add-table添加表格--rows/-r、--cols/-c默认 2×2writer add-page-break添加分页符writer remove index按索引删除内容项writer list列出全部内容项含索引、类型、摘要writer set-text index text修改段落/标题文本源码约束writer.py标题层级超界非 1–6会抛ValueError列表样式非bullet/number会被拒绝position越界超出 0–len(content)抛IndexErrorset-text只允许作用于paragraph与heading类型表格至少 1 行 1 列。所有 Writer 操作都会先经_ensure_writer()校验项目类型防止在 Calc/Impress 文档上误用。一个完整的 Writer 文档示例cli-anything-libreoffice document new --type writer --name Quarterly Report -o report.json cli-anything-libreoffice --project report.json writer add-heading -t Q1 Report -l 1 cli-anything-libreoffice --project report.json writer add-paragraph -t Revenue grew by 15%. cli-anything-libreoffice --project report.json writer add-table --rows 3 --cols 2 cli-anything-libreoffice --project report.json writer add-list -i Product A -i Product B4.3 Calc电子表格命令说明calc add-sheet新增工作表--name默认 Sheet--position指定插入位置calc remove-sheet index按索引删除工作表calc rename-sheet index name重命名工作表calc set-cell ref value设置单元格--type string\|float默认 string--sheet/-s默认 0--formula写入公式calc get-cell ref读取单元格--sheet/-scalc list-sheets列出全部工作表ref采用类 Excel 坐标如A1、B3单元格引用大小写不敏感。set-cell支持公式公式存储时会规范化去除 ODF 命名空间前缀of:、oooc:重新导出时再补回of:前缀见 importer.py 与 odf_utils.py。4.4 Impress演示文稿命令说明impress add-slide添加幻灯片--title/-t、--content/-c、--position/-pimpress remove-slide index删除幻灯片impress set-content index更新某页标题--title与正文--contentimpress list-slides列出全部幻灯片impress add-element slide_index向某页添加元素--type默认 text_box--text--x/--y默认 2cm--width/--height默认 10cm×5cm导出时标题与正文会被分别写入presentation:classtitle/subtitle的文本框frame节点附加元素按坐标尺寸写入draw:frame见 odf_utils.py。五、Style 组命名样式与段落排版命令说明style create name创建样式--family paragraph\|text默认 paragraph--parent父样式--prop keyvalue可多次style modify name修改既有样式--prop keyvalue ...style list列出全部样式style apply style_name content_index将样式应用到 Writer 内容项style remove name删除样式合法属性集合定义于 styles.py超出集合的属性会被拒绝font_size、font_name、bold、italic、underline、color、alignment、line_height、margin_top、margin_bottom。--prop的取值解析在 libreoffice_cli.py 的_parse_props()中完成必须为keyvalue形式true/false转为布尔带小数点转为浮点其余数字转整型否则保持字符串。因此# 创建并应用一个强调样式 cli-anything-libreoffice --project report.json style create Emphasis --prop boldtrue --prop color#cc0000 cli-anything-libreoffice --project report.json style apply Emphasis 1style apply本质是把样式属性合并进目标内容项的style字典styles.py导出时用户样式进入styles.xml的office:styles区段段落属性alignment、line_height、margin_top/margin_bottom映射为 ODF 的 paragraph-propertiesodf_utils.py。六、Export 组从 ODF 原生导出到 LibreOffice 转档命令说明export presets列出全部导出预设export preset-info name查看预设详情export render output [--preset ...] [--overwrite]导出文档到文件导出预设完整表来自 export.py预设格式生成方式odtODF Writer 文档native无需 LibreOfficeodsODF Calc 电子表格nativeodpODF Impress 演示文稿nativehtmlHTML 文档nativetext纯文本nativepdfPDF经由 LibreOfficelo_convert源 ODFwriterdocxMS Word DOCXlo_convert源 ODFwriterxlsxMS Excel XLSXlo_convert源 ODFcalcpptxMS PowerPoint PPTXlo_convert源 ODFimpresscsvCSV 表格lo_convert源 ODFcalc# 导出 ODT 与 HTMLnative无需 LibreOffice cli-anything-libreoffice --project report.json export render report.odt --preset odt --overwrite cli-anything-libreoffice --project report.json export render report.html --preset html --overwrite # 导出 PDF需要本机 LibreOffice cli-anything-libreoffice --project myproject.json export render output.pdf --preset pdf --overwrite底层原理native 预设由odf_utils.write_odf()直接构造 ZIP 归档lo_convert预设则在临时目录先生成 ODF 中间文件再调用lo_backend.convert_odf_to()交给libreoffice --headless --convert-to完成真实渲染export.py。每次 headless 调用都携带一组保守标志--headless --nologo --nodefault --norestore --nolockcheck --nofirststartwizard用于抑制启动界面、恢复流程与陈旧锁文件干扰lo_backend.py同时把 profile/运行时/配置/缓存目录隔离到临时目录避免污染用户 LibreOffice 配置。若输出文件已存在且未传--overwrite会抛出FileExistsError加以保护。七、Session 组50 级撤销/重做与项目持久化命令说明session status显示会话状态是否有项目、路径、修改标记、撤销/重做深度、文档名与类型session undo撤销上一步操作session redo重做被撤销的操作session history显示撤销历史含描述与时间戳状态管理能力由 session.py 提供Undo/RedoMAX_UNDO 50最多保留 50 层历史超出时淘汰最旧快照每次快照使用copy.deepcopy保存整个项目状态与 ISO 时间戳快照语义每次修改类命令执行前调用snapshot()压栈新快照产生时会清空 redo 栈项目持久化save_session()通过带文件锁fcntl.flock的原子写入保存 JSON会话跟踪status()反映modified标记与撤销/重做栈深度。此外libreoffice_cli.py 的auto_save_on_exit回调会在一次性one-shot命令结束后自动保存被修改的项目--dry-run或 REPL 模式除外使得多步命令行编辑无需显式document save也能落盘。八、导入既有文件从 DOCX/XLSX/PPTX 到可编辑项目document import/document open支持两类来源见 importer.py原生 ODF 解析native-odf.odt、.ottWriter.ods、.otsCalc.odp、.otpImpress——直接读取 ZIP 内 XML无需 LibreOfficeLibreOffice headless 转换.doc/.docx/.docm/.rtf/.txt/.html/.htm转 odt、.xls/.xlsx/.xlsm/.csv转 ods、.ppt/.pptx/.pptm转 odp——先经 LibreOffice 转成 ODF 中间格式再解析。# 一次性流程导入 → 编辑 → 重新导出 cli-anything-libreoffice document import proposal.docx -o proposal.json cli-anything-libreoffice --project proposal.json writer add-paragraph -t Appendix cli-anything-libreoffice --project proposal.json export render proposal-updated.docx -p docx --overwrite导入解析时Writer 内容按 heading/paragraph/list/table 重建Calc 解析工作表名与单元格含公式、重复行列展开Impress 重建每页标题、正文与元素列表元数据title/creator/description/created/modified从meta.xml映射到项目metadataimporter.py。ODF 导入还使用defusedxml解析 XML规避 XXE 类安全风险若把 ODF 文件误当项目 JSON 打开open_document()会抛出带导入提示的明确错误document.py。九、输出格式双模式输出与 ODF 文件结构所有命令支持双输出模式人类可读默认缩进字典/列表、带颜色的终端输出机器可读--json结构化 JSON供 Agent 程序化解析。cli-anything-libreoffice --project report.json document info cli-anything-libreoffice --json --project report.json document info导出的 ODF 文件是合法的 ZIP 归档内含标准五要素见 odf_utils.py 的write_odf()mimetype首个且必须不压缩存储ZIP_STORED的条目用于标识文档类型如application/vnd.oasis.opendocument.textcontent.xml文档正文段落、标题、表格、列表、单元格、幻灯片等 ODF XMLstyles.xml页面布局、默认样式与用户命名样式meta.xml标题、作者、描述、主题、创建时间与生成器META-INF/manifest.xml归档内全部文件的媒体类型清单。ODF 规范对mimetype 为首条且不压缩有强制要求测试 test_full_e2e.py 的TestODFStructure专门验证了这一点odf_utils.validate_odf()还提供了结构校验函数可检查缺失条目、XML 合法性等问题。十、AI Agent 集成最佳实践技能文档为程序化使用给出了明确规范这也是 CLI-Anything Agent-Native 理念的直接体现始终使用--json保证输出可解析避免依赖终端表格格式检查返回码0 表示成功非零表示失败失败时解析 stderr错误消息输出到标准错误流所有文件操作使用绝对路径避免工作目录歧义先导入再编辑用document import input.docx -o work.json把既有 Office 文件转成项目 JSON再做增量修改导出后验证产物存在确认输出文件确实生成。从实现看--json模式下错误也会以{error: ..., type: ...}的结构化 JSON 输出到 stdoutlibreoffice_cli.py 的handle_error装饰器且非 REPL 模式下错误会导致进程以退出码 1 结束——这套结构化错误 非零退出码的组合正是为 Agent 编排设计的。结合session undo的 50 层快照与命令执行后自动保存机制Agent 可以在多步编辑中安全回滚实现可审计的文档生成流水线。十一、测试验证与质量保障测试覆盖在 tests/TEST.md 中有完整清单共 172 个测试单元测试test_core.py99 个覆盖 Document 创建/档案校验/保存往返、导入格式路由、Writer/Calc/Impress 全部操作约束、样式校验、Session 撤销重做全部使用内存数据无需安装 LibreOffice端到端测试test_full_e2e.py73 个产出真实 ODT/ODS/ODP 并校验 ZIP 结构、XML 合法性、mimetype 首条不压缩、DOCX/XLSX/PPTX 导入导出、CLI 子进程全流程等。运行测试在仓库的libreoffice/agent-harness目录下python3 -m pytest cli/tests/test_core.py -v # 单元测试 python3 -m pytest cli/tests/test_full_e2e.py -v # E2E 测试ODF 校验 python3 -m pytest cli/tests/ -v # 全部测试从测试结果看单元测试约 0.15s 跑完E2E 约 58s——前者保证了纯 Python 模型层的正确性后者验证了产出物在真实 ODF 生态中的可用性。十二、进一步阅读技能文档原文skills/cli-anything-libreoffice/SKILL.md组件说明与完整命令参考libreoffice/agent-harness/cli_anything/libreoffice/README.md测试文档libreoffice/agent-harness/cli_anything/libreoffice/tests/TEST.md通用方法论HARNESScli-anything-plugin/HARNESS.md各模块源码core/document.py、core/export.py、core/importer.py、utils/odf_utils.py、utils/lo_backend.py版本说明本文档对应技能版本1.0.0项目模型版本为1.0PROJECT_VERSION生成的 ODF 为 ODF 1.2office:version1.2。【免费下载链接】CLI-AnythingCLI-Anything: Making ALL Software Agent-Native -- CLI-Hub: https://clianything.cc/项目地址: https://gitcode.com/GitHub_Trending/cl/CLI-Anything创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考