其他
需要批量将 PDF/DOCX/Markdown/HTML/X…
当你有大量文档需要按统一设置批量转换到一种或多种目标格式时,使用该技能完成自动格式检测、并行处理、错误记录和输出验证。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
需要批量将 PDF/DOCX/Markd特定
解决思路
- 指定源文件夹或文件列表作为输入。
- 选择目标格式,如 PDF、DOCX、MD、HTML、PPTX。
- 可选地配置转换选项。
- 让处理流程对所有文件运行并跟踪进度。
- 支持的转换包括:DOCX→PDF/MD/HTML;PDF→DOCX/MD/HTML;MD→DOCX/PDF/HTML/PPTX;HTML→DOCX/PDF/MD;XLSX→PDF/MD/HTML;PPTX→PDF/MD/HTML。
- 定义 DocumentConverter 类,__init__ 接收 max_workers=4。
- 在 DocumentConverter 中初始化 converters 字典,映射 (输入格式, 输出格式) 到转换函数。
- 注册 md→docx 到 _md_to_docx,md→pdf 到 _md_to_pdf,md→html 到 _md_to_html,md→pptx 到 _md_to_pptx。
- 注册 docx→pdf 到 _docx_to_pdf,docx→md 到 _docx_to_md。
- 注册 pdf→docx 到 _pdf_to_docx,pdf→md 到 _pdf_to_md。
- 注册 xlsx→pdf 到 _xlsx_to_pdf,xlsx→md 到 _xlsx_to_md。
- 注册 pptx→pdf 到 _pptx_to_pdf,pptx→md 到 _pptx_to_md。
- 注册 html→md 到 _html_to_md,html→pdf 到 _html_to_pdf;原文未展开这两个实现,需要自行补齐。
- 实现 convert(input_path, output_format, output_dir=None):将 input_path 转为 Path,取后缀小写作为输入格式。
- 在 convert 中:若提供 output_dir,则输出路径为 output_dir 下的 `{stem}.{format}`;否则用 input_path.with_suffix 加上目标格式后缀。
- 在 convert 中:用 (input_format, output_format) 查找 converter_key。
- 在 convert 中:若 converter_key 不在 converters 中,抛出 ValueError,消息为 Conversion not supported: <input_format> -> <output_format>。
- 在 convert 中:调用对应转换函数并返回结果。
- 实现 batch_convert(input_dir, output_format, output_dir=None, file_pattern='*', recursive=False)。
- 在 batch_convert 中:将 input_dir 转为 Path,output_dir 默认设为 input_path / 'converted',并创建输出目录。
- 在 batch_convert 中:若 recursive=True 用 input_path.rglob(file_pattern) 找文件,否则用 input_path.glob(file_pattern)。
- 在 batch_convert 中:过滤扩展名 .md、.docx、.pdf、.xlsx、.pptx、.html 的文件。
- 在 batch_convert 中:用 ThreadPoolExecutor(max_workers=self.max_workers) 并行提交 self.convert 任务。
- 在 batch_convert 中:用 as_completed 收集结果;成功存 file、status=success、output;失败存 file、status=error、error。
- 实现 _md_to_docx:运行 `pandoc <input> -o <output>`,check=True。
- 实现 _md_to_pdf:运行 `pandoc <input> -o <output>`,check=True。
- 实现 _md_to_html:运行 `pandoc <input> -s -o <output>`,check=True。
- 实现 _md_to_pptx:运行 `marp <input> -o <output>`,check=True。
- 实现 _docx_to_md:用 MarkItDown().convert(input),把 result.text_content 写入输出文件。
- 实现 _xlsx_to_md:用 MarkItDown().convert(input),把 result.text_content 写入输出文件。
- 实现 _pptx_to_md:用 MarkItDown().convert(input),把 result.text_content 写入输出文件。
- 实现 _pdf_to_docx:用 pdf2docx.Converter(input),调用 cv.convert(output),然后 cv.close()。
- 实现 _pdf_to_md:用 MarkItDown().convert(input),把 result.text_content 写入输出文件。
- 实现 _docx_to_pdf:运行 `soffice --headless --convert-to pdf --outdir <output.parent> <input>`,check=True。
- 实现 _xlsx_to_pdf:运行 `soffice --headless --convert-to pdf --outdir <output.parent> <input>`,check=True。
- 实现 _pptx_to_pdf:运行 `soffice --headless --convert-to pdf --outdir <output.parent> <input>`,check=True。
- 进度跟踪:用 tqdm 包装文件列表,逐个调用 converter.convert,显示 Converting to {output_format}。
- 最佳实践:批量处理前先转换几个样本文件测试。
- 最佳实践:检查磁盘空间,确保有足够空间存放输出。
- 最佳实践:使用并行处理,多个 worker 加速。
- 最佳实践:优雅处理错误,记录失败并继续处理其他文件。
- 最佳实践:抽查转换后的文件以验证输出。
- 格式检测管道:用 mimetypes.guess_type 检测 MIME 类型。
- 建立 MIME 到格式映射:application/pdf→pdf,docx MIME→docx,xlsx MIME→xlsx,pptx MIME→pptx,text/markdown→md,text/html→html。
- 若 MIME 未命中,则用 Path(file_path).suffix[1:] 作为源格式。
- 调用 DocumentConverter().convert(file_path, target_format) 完成自动检测并转换。
- 多格式输出:实现 convert_to_multiple_formats(input_file, output_formats, output_dir),对每个格式调用 converter.convert,并用字典记录成功或错误。
- 多格式输出示例:将 README.md 转为 docx、pdf、html,输出到 ./exports。
- 文档导出示例:用 DocumentConverter(max_workers=8),为 pdf、docx、html 创建子目录,用 rglob('*.md') 找所有 markdown 文件。
- 文档导出示例:对每个 md 文件分别转 pdf、docx、html,记录每个格式成功或错误,打印处理文件名。
- 文档导出示例:将结果保存为 export_report.json。
- 旧文档迁移示例:用 DocumentConverter(max_workers=4),迁移规则为 *.doc→docx、*.xls→xlsx、*.ppt→pptx、*.rtf→docx。
- 旧文档迁移示例:创建目标目录,对每个模式找文件,用 `soffice --headless --convert-to <target_format> --outdir <target_path> <file>` 转换。
- 旧文档迁移示例:统计成功迁移数量,收集错误,最后打印迁移完成数量和错误数。
- 报告生成管道示例:用 DocumentConverter,创建输出目录,生成 timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')。
- 报告生成管道示例:对每个数据文件生成 Markdown 报告,包含 front matter title/date 和 Data Summary;如果数据文件是 .xlsx,用 MarkItDown 转换内容追加。
- 报告生成管道示例:将 Markdown 保存为 {data_path.stem}_{timestamp}.md,再转 PDF 和 DOCX,记录报告来源、输出和格式。
- 限制:不是所有格式组合都支持。
- 限制:复杂格式可能在转换中丢失。
- 限制:大文件可能需要更多时间。
- 限制:部分转换需要外部工具,如 LibreOffice、Pandoc。
- 限制:转换质量因源文档复杂度而异。
- 安装核心依赖:`pip install pdf2docx markitdown python-docx openpyxl`。
- 安装 Pandoc:macOS 用 `brew install pandoc`,Ubuntu 用 `apt install pandoc`。
- 安装 Marp 用于 PPTX:`npm install -g @marp-team/marp-cli`。
- 安装 LibreOffice:macOS 用 `brew install libreoffice`,Ubuntu 用 `apt install libreoffice`。
适用边界 · 注意事项
- 目标格式组合不在支持矩阵内时,如 DOCX→PPTX、PDF→PPTX 等。
- 需要精确保留复杂排版、公式、图表或标签时,转换可能丢失格式。
- 未安装 Pandoc、Marp、LibreOffice、markitdown、pdf2docx,或 office-mcp 不可用时。