| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- """
- cli.py - 命令行入口
- 用法:
- # 单文件模式(所有表格放入一个 DOCX)
- python -m pdf_table_to_docx <pdf_path>
- # 目录模式(JSON 元数据 + 每个表格独立 DOCX)
- python -m pdf_table_to_docx <pdf_path> --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()
|