scripts/pdf_merge.py
scripts/pdf_merge.pyBrowse 21 files
386 tokens
1,686 bytes
Token encoding: o200k_base
Snapshot 24fd22b
← Back to SKILL.md
1#!/usr/bin/env python32"""Merge multiple PDFs into one, optionally adding a bookmark per source file."""3from __future__ import annotations4 5import argparse6import json7import os8import sys9 10 11def main() -> int:12 for stream in (sys.stdout, sys.stderr):13 try:14 stream.reconfigure(encoding="utf-8")15 except Exception:16 pass17 parser = argparse.ArgumentParser(description="Merge PDFs (pypdf).")18 parser.add_argument("inputs", nargs="+", help="Input PDF paths, in order")19 parser.add_argument("-o", "--output", required=True, help="Output PDF path")20 parser.add_argument("--bookmarks", action="store_true",21 help="Add a top-level bookmark per input file (its basename)")22 args = parser.parse_args()23 24 try:25 from pypdf import PdfReader, PdfWriter26 except ImportError:27 print("Missing dependency: install with 'python3 -m pip install pypdf'", file=sys.stderr)28 return 229 30 writer = PdfWriter()31 total = 032 for path in args.inputs:33 reader = PdfReader(path)34 if reader.is_encrypted:35 print(f"Error: {path} is encrypted; decrypt it first with pdf_secure.py --decrypt", file=sys.stderr)36 return 337 start = total38 for page in reader.pages:39 writer.add_page(page)40 total += 141 if args.bookmarks:42 writer.add_outline_item(os.path.splitext(os.path.basename(path))[0], start)43 with open(args.output, "wb") as fh:44 writer.write(fh)45 print(json.dumps({"output": args.output, "inputs": len(args.inputs), "page_count": total}))46 return 047 48 49if __name__ == "__main__":50 sys.exit(main())51