""" cli.py - 命令行入口 用法: # 单文件模式(所有表格放入一个 DOCX) python -m pdf_table_to_docx # 目录模式(JSON 元数据 + 每个表格独立 DOCX) python -m pdf_table_to_docx --dir 示例: python -m pdf_table_to_docx data/sample.pdf python -m pdf_table_to_docx data/sample.pdf -o output.docx python -m pdf_table_to_docx data/sample.pdf --dir -o output_dir/ python -m pdf_table_to_docx data/sample.pdf --dir --verbose """ import argparse import logging import sys from .extractor import PDFTableExtractor def setup_logging(verbose: bool = False): """配置日志输出。""" level = logging.DEBUG if verbose else logging.INFO fmt = "%(asctime)s [%(levelname)s] %(message)s" datefmt = "%H:%M:%S" logging.basicConfig( level=level, format=fmt, datefmt=datefmt, stream=sys.stderr, ) def main(): parser = argparse.ArgumentParser( description="从 PDF 中提取表格并生成 DOCX 文件", formatter_class=argparse.RawDescriptionHelpFormatter, epilog=""" 使用示例: %(prog)s document.pdf # 单 DOCX 模式 %(prog)s document.pdf --dir # 目录模式(JSON + 每表独立 DOCX) %(prog)s document.pdf -o result.docx # 指定输出文件 %(prog)s document.pdf --dir -o output_dir/ # 指定输出目录 %(prog)s document.pdf --verbose # 详细日志 %(prog)s document.pdf --page-width 42 --page-height 29.7 # A3 横版 """, ) parser.add_argument( "pdf_path", help="输入的 PDF 文件路径", ) parser.add_argument( "-o", "--output", help="输出路径(单文件模式时是 .docx,目录模式时是文件夹路径)", ) parser.add_argument( "--dir", "--directory", action="store_true", dest="dir_mode", help="目录模式:输出 JSON 元数据 + 每个表格独立的 DOCX 文件", ) parser.add_argument( "--verbose", "-v", action="store_true", help="输出详细日志", ) parser.add_argument( "--page-width", type=float, default=21.0, help="页面宽度,单位厘米(默认 21.0,即 A4)", ) parser.add_argument( "--page-height", type=float, default=29.7, help="页面高度,单位厘米(默认 29.7,即 A4)", ) parser.add_argument( "--margin", type=float, default=2.0, help="页边距,单位厘米(默认 2.0)", ) args = parser.parse_args() setup_logging(verbose=args.verbose) logger = logging.getLogger(__name__) try: extractor = PDFTableExtractor(args.pdf_path) if args.dir_mode: # ---- 目录模式 ---- output_dir = extractor.to_docx_directory( output_dir=args.output, page_width_cm=args.page_width, page_height_cm=args.page_height, margin_cm=args.margin, ) if output_dir: print(f"\n✅ 表格已提取至目录: {output_dir}", file=sys.stderr) print(f" 元数据: {output_dir}/tables.json", file=sys.stderr) print(f" 表格: {output_dir}/tables/", file=sys.stderr) else: print("\n⚠️ 未检测到表格或处理失败", file=sys.stderr) sys.exit(1) else: # ---- 单文件模式(默认) ---- output = extractor.to_docx( output_path=args.output, page_width_cm=args.page_width, page_height_cm=args.page_height, margin_cm=args.margin, ) if output: print(f"\n✅ 表格已提取并保存至: {output}", file=sys.stderr) else: print("\n⚠️ 未检测到表格或处理失败", file=sys.stderr) sys.exit(1) except FileNotFoundError as e: logger.error(e) sys.exit(1) except Exception as e: logger.exception(f"处理失败: {e}") sys.exit(1) if __name__ == "__main__": main()