a
This commit is contained in:
@@ -0,0 +1,157 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
MarkItDown 文档转换工具封装
|
||||
支持各种格式转换为 Markdown
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import subprocess
|
||||
from pathlib import Path
|
||||
from typing import Optional
|
||||
|
||||
|
||||
def convert_file(input_path: str, output_path: Optional[str] = None) -> str:
|
||||
"""
|
||||
将文件转换为 Markdown
|
||||
|
||||
Args:
|
||||
input_path: 输入文件路径
|
||||
output_path: 输出文件路径(可选,默认输出到同目录同名.md)
|
||||
|
||||
Returns:
|
||||
输出文件路径
|
||||
"""
|
||||
input_file = Path(input_path)
|
||||
|
||||
if not input_file.exists():
|
||||
raise FileNotFoundError(f"文件不存在: {input_path}")
|
||||
|
||||
# 如果没有指定输出路径,使用同名.md
|
||||
if output_path is None:
|
||||
output_file = input_file.with_suffix('.md')
|
||||
else:
|
||||
output_file = Path(output_path)
|
||||
|
||||
# 调用 markitdown
|
||||
cmd = ['markitdown', str(input_file), '-o', str(output_file)]
|
||||
|
||||
try:
|
||||
result = subprocess.run(
|
||||
cmd,
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=300 # 5分钟超时
|
||||
)
|
||||
|
||||
if result.returncode == 0:
|
||||
print(f"✅ 转换成功: {input_file.name} -> {output_file.name}")
|
||||
return str(output_file)
|
||||
else:
|
||||
print(f"❌ 转换失败: {result.stderr}")
|
||||
return None
|
||||
|
||||
except subprocess.TimeoutExpired:
|
||||
print("❌ 转换超时")
|
||||
return None
|
||||
except Exception as e:
|
||||
print(f"❌ 转换异常: {e}")
|
||||
return None
|
||||
|
||||
|
||||
def convert_to_text(input_path: str) -> str:
|
||||
"""
|
||||
将文件转换为 Markdown 文本(不保存文件)
|
||||
|
||||
Args:
|
||||
input_path: 输入文件路径
|
||||
|
||||
Returns:
|
||||
Markdown 文本内容
|
||||
"""
|
||||
input_file = Path(input_path)
|
||||
|
||||
if not input_file.exists():
|
||||
raise FileNotFoundError(f"文件不存在: {input_path}")
|
||||
|
||||
cmd = ['markitdown', str(input_file)]
|
||||
|
||||
try:
|
||||
result = subprocess.run(
|
||||
cmd,
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=300
|
||||
)
|
||||
|
||||
if result.returncode == 0:
|
||||
return result.stdout
|
||||
else:
|
||||
print(f"❌ 转换失败: {result.stderr}")
|
||||
return ""
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ 转换异常: {e}")
|
||||
return ""
|
||||
|
||||
|
||||
def batch_convert(directory: str, pattern: str = "*") -> list:
|
||||
"""
|
||||
批量转换目录中的文件
|
||||
|
||||
Args:
|
||||
directory: 目录路径
|
||||
pattern: 文件匹配模式(如 "*.pdf")
|
||||
|
||||
Returns:
|
||||
成功转换的文件列表
|
||||
"""
|
||||
dir_path = Path(directory)
|
||||
|
||||
if not dir_path.exists():
|
||||
raise FileNotFoundError(f"目录不存在: {directory}")
|
||||
|
||||
files = list(dir_path.glob(pattern))
|
||||
converted = []
|
||||
|
||||
print(f"找到 {len(files)} 个文件,开始转换...")
|
||||
|
||||
for file in files:
|
||||
if file.is_file():
|
||||
output = convert_file(str(file))
|
||||
if output:
|
||||
converted.append(output)
|
||||
|
||||
print(f"\n✅ 成功转换 {len(converted)}/{len(files)} 个文件")
|
||||
return converted
|
||||
|
||||
|
||||
def main():
|
||||
"""命令行入口"""
|
||||
import argparse
|
||||
|
||||
parser = argparse.ArgumentParser(description='文档转 Markdown 工具')
|
||||
parser.add_argument('input', help='输入文件路径')
|
||||
parser.add_argument('-o', '--output', help='输出文件路径(可选)')
|
||||
parser.add_argument('-t', '--text', action='store_true', help='仅输出文本,不保存文件')
|
||||
parser.add_argument('-b', '--batch', help='批量转换目录')
|
||||
parser.add_argument('-p', '--pattern', default='*', help='批量转换时的文件匹配模式')
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
if args.batch:
|
||||
# 批量模式
|
||||
batch_convert(args.batch, args.pattern)
|
||||
elif args.text:
|
||||
# 仅输出文本
|
||||
text = convert_to_text(args.input)
|
||||
print(text)
|
||||
else:
|
||||
# 单文件转换
|
||||
output = convert_file(args.input, args.output)
|
||||
if output:
|
||||
print(f"输出文件: {output}")
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Reference in New Issue
Block a user