scripts/extract_pymupdf.py
scripts/extract_pymupdf.pyBrowse 21 files
900 tokens
3,671 bytes
Token encoding: o200k_base
Snapshot 24fd22b
← Back to SKILL.md
1#!/usr/bin/env python32"""Extract text from documents using pymupdf. Lightweight (~25MB), no models.3 4Usage:5 python extract_pymupdf.py document.pdf6 python extract_pymupdf.py document.pdf --markdown7 python extract_pymupdf.py document.pdf --pages 0-48 python extract_pymupdf.py document.pdf --images output_dir/9 python extract_pymupdf.py document.pdf --tables10 python extract_pymupdf.py document.pdf --metadata11"""12import sys13import json14 15def extract_text(path, pages=None):16 import pymupdf17 doc = pymupdf.open(path)18 page_range = range(len(doc)) if pages is None else pages19 for i in page_range:20 if i < len(doc):21 print(f"\n--- Page {i+1}/{len(doc)} ---\n")22 print(doc[i].get_text())23 24def extract_markdown(path, pages=None):25 import pymupdf4llm26 md = pymupdf4llm.to_markdown(path, pages=pages)27 print(md)28 29def extract_tables(path):30 import pymupdf31 doc = pymupdf.open(path)32 for i, page in enumerate(doc):33 tables = page.find_tables()34 for j, table in enumerate(tables.tables):35 print(f"\n--- Page {i+1}, Table {j+1} ---\n")36 df = table.to_pandas()37 print(df.to_markdown(index=False))38 39def extract_images(path, output_dir):40 import pymupdf41 from pathlib import Path42 Path(output_dir).mkdir(parents=True, exist_ok=True)43 doc = pymupdf.open(path)44 count = 045 for i, page in enumerate(doc):46 for img_idx, img in enumerate(page.get_images(full=True)):47 xref = img[0]48 pix = pymupdf.Pixmap(doc, xref)49 if pix.n >= 5:50 pix = pymupdf.Pixmap(pymupdf.csRGB, pix)51 out_path = f"{output_dir}/page{i+1}_img{img_idx+1}.png"52 pix.save(out_path)53 count += 154 print(f"Extracted {count} images to {output_dir}/")55 56def show_metadata(path):57 import pymupdf58 doc = pymupdf.open(path)59 print(json.dumps({60 "pages": len(doc),61 "title": doc.metadata.get("title", ""),62 "author": doc.metadata.get("author", ""),63 "subject": doc.metadata.get("subject", ""),64 "creator": doc.metadata.get("creator", ""),65 "producer": doc.metadata.get("producer", ""),66 "format": doc.metadata.get("format", ""),67 }, indent=2))68 69if __name__ == "__main__":70 import argparse71 72 parser = argparse.ArgumentParser(73 description="Extract text/tables/images/metadata from documents using pymupdf (lightweight, no models)."74 )75 parser.add_argument("path", help="Document to read")76 parser.add_argument("--pages", help="Page selection: N or START-END (0-indexed)")77 parser.add_argument("--markdown", action="store_true", help="Markdown output via pymupdf4llm")78 parser.add_argument("--tables", action="store_true", help="Extract tables as markdown")79 parser.add_argument("--images", nargs="?", const="./images", metavar="OUTPUT_DIR",80 help="Extract embedded images to OUTPUT_DIR (default ./images)")81 parser.add_argument("--metadata", action="store_true", help="Show document metadata as JSON")82 args = parser.parse_args()83 84 pages = None85 if args.pages:86 if "-" in args.pages:87 start, end = args.pages.split("-")88 pages = list(range(int(start), int(end) + 1))89 else:90 pages = [int(args.pages)]91 92 if args.metadata:93 show_metadata(args.path)94 elif args.tables:95 extract_tables(args.path)96 elif args.images is not None:97 extract_images(args.path, args.images)98 elif args.markdown:99 extract_markdown(args.path, pages=pages)100 else:101 extract_text(args.path, pages=pages)102