diff --git a/temp/scripts/README.md b/temp/scripts/README.md index 65b4c4b..e64f54a 100644 --- a/temp/scripts/README.md +++ b/temp/scripts/README.md @@ -6,10 +6,11 @@ 该解析器按优先级尝试多种解析方法,确保最大兼容性: -1. **MarkItDown** (微软官方库) - 推荐使用,格式最规范 -2. **python-docx / python-pptx / pandas** (成熟的 Python 库) - 输出最详细 -3. **unstructured / pypdf** (成熟的 PDF 库) - PDF 专用 -4. **XML 原生解析** (备选方案) - 无需依赖 +1. **pypandoc-binary** (DOCX 专用,内置 Pandoc) - 生成结构化 Markdown +2. **MarkItDown** (微软官方库) - 推荐使用,格式最规范 +3. **python-docx / python-pptx / pandas** (成熟的 Python 库) - 输出最详细 +4. **unstructured / pypdf** (成熟的 PDF 库) - PDF 专用 +5. **XML 原生解析** (备选方案) - 无需依赖 ### 特性 @@ -44,6 +45,16 @@ scripts/ uv run parser.py file.docx ``` +### 使用 pypandoc-binary(DOCX) + +```bash +# 使用 uv 自动安装 +uv run --with pypandoc-binary parser.py file.docx + +# 或手动安装 +pip install pypandoc-binary +``` + ### 使用 MarkItDown ```bash @@ -81,7 +92,7 @@ pip install pypdf ```bash # 安装所有解析库 -uv run --with markitdown --with python-docx --with python-pptx --with pandas --with tabulate --with unstructured --with pypdf parser.py file.pdf +uv run --with pypandoc-binary --with markitdown --with python-docx --with python-pptx --with pandas --with tabulate --with unstructured --with pypdf parser.py file.pdf ``` ## 命令行用法 @@ -125,6 +136,7 @@ uv run parser.py report.pdf uv run parser.py report.docx > output.md # 使用特定依赖 +uv run --with pypandoc-binary parser.py report.docx > output.md uv run --with python-docx parser.py report.docx > output.md uv run --with pypdf parser.py report.pdf > output.md ``` @@ -195,8 +207,16 @@ uv run --with "markitdown[pdf]" parser.py report.pdf -s "重要内容" -n 2 ### DOCX 解析器 +DOCX 文件会按以下优先级依次尝试解析: + +1. pypandoc-binary +2. MarkItDown +3. python-docx +4. XML 原生 + | 解析器 | 优点 | 缺点 | 适用场景 | |---------|------|--------|---------| +| **pypandoc-binary** | • 自带 Pandoc,可直接使用
• 输出 Markdown 结构整洁
• 错误信息清晰易排查 | • 仅适用于 DOCX
• 依赖包体积较大 | • 需要标准化 Markdown 输出
• 首选解析路径 | | **MarkItDown** | • 格式规范
• 微软官方支持
• 兼容性好 | • 需要安装
• 输出较简洁 | • 需要标准格式输出
• 自动化文档处理 | | **python-docx** | • 输出最详细
• 保留完整结构
• 支持复杂样式 | • 需要安装
• 可能包含多余空行 | • 需要精确控制输出
• 分析文档结构 | | **XML 原生** | • 无需依赖
• 运行速度快
• 输出原始内容 | • 格式可能不统一
• 样式处理有限 | • 依赖不可用时
• 快速提取内容 | @@ -533,6 +553,7 @@ A: 大文件建议使用 XML 原生解析(最快),或在脚本外部处理 ### 最新版本 +- DOCX 解析新增 pypandoc-binary 方案并设置为最高优先级 - 将单体脚本拆分为模块化结构(common.py, docx.py, pptx.py, xlsx.py, parser.py) - 添加 XLSX 文件支持 - 添加 PDF 文件支持(MarkItDown、unstructured、pypdf) diff --git a/temp/scripts/docx_parser.py b/temp/scripts/docx_parser.py index bcfb6f9..4c095cd 100644 --- a/temp/scripts/docx_parser.py +++ b/temp/scripts/docx_parser.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -"""DOCX 文件解析模块,提供三种解析方法。""" +"""DOCX 文件解析模块,提供多种解析方法。""" import xml.etree.ElementTree as ET import zipfile @@ -8,6 +8,32 @@ from typing import Any, List, Optional, Tuple from common import build_markdown_table, parse_with_markitdown, safe_open_zip +def parse_docx_with_pypandoc(file_path: str) -> Tuple[Optional[str], Optional[str]]: + """使用 pypandoc-binary 库解析 DOCX 文件。""" + try: + import pypandoc + except ImportError: + return None, "pypandoc-binary 库未安装" + + try: + content = pypandoc.convert_file( + source_file=file_path, + to="md", + format="docx", + outputfile=None, + extra_args=["--wrap=none"], + ) + except OSError as exc: + return None, f"pypandoc-binary 缺少 Pandoc 可执行文件: {exc}" + except RuntimeError as exc: + return None, f"pypandoc-binary 解析失败: {exc}" + + content = content.strip() + if not content: + return None, "文档为空" + return content, None + + def parse_docx_with_markitdown(file_path: str) -> Tuple[Optional[str], Optional[str]]: """使用 MarkItDown 库解析 DOCX 文件""" return parse_with_markitdown(file_path) diff --git a/temp/scripts/parser.py b/temp/scripts/parser.py index 0eda960..9e6d1ea 100644 --- a/temp/scripts/parser.py +++ b/temp/scripts/parser.py @@ -64,6 +64,7 @@ def main() -> None: if file_type == "docx": parsers = [ + ("pypandoc-binary", docx_parser.parse_docx_with_pypandoc), ("MarkItDown", docx_parser.parse_docx_with_markitdown), ("python-docx", docx_parser.parse_docx_with_python_docx), ("XML 原生解析", docx_parser.parse_docx_with_xml),