scripts/pdf_secure.py
scripts/pdf_secure.pyBrowse 21 files
584 tokens
2,679 bytes
Token encoding: o200k_base
Snapshot 24fd22b
← Back to SKILL.md
1#!/usr/bin/env python32"""Encrypt or decrypt a PDF with passwords (AES-256 via pypdf).3 4Note: permission flags set at encryption time are advisory — viewers may honor5them, but any PDF library can strip them. Only the user password gates content.6"""7from __future__ import annotations8 9import argparse10import json11import sys12 13 14def main() -> int:15 for stream in (sys.stdout, sys.stderr):16 try:17 stream.reconfigure(encoding="utf-8")18 except Exception:19 pass20 parser = argparse.ArgumentParser(description="Encrypt/decrypt PDFs (pypdf, AES-256).")21 parser.add_argument("pdf", help="Input PDF path")22 parser.add_argument("-o", "--output", required=True, help="Output PDF path")23 mode = parser.add_mutually_exclusive_group(required=True)24 mode.add_argument("--encrypt", action="store_true", help="Encrypt the PDF")25 mode.add_argument("--decrypt", action="store_true", help="Remove encryption (password required)")26 parser.add_argument("--user-password", help="User (open) password for --encrypt")27 parser.add_argument("--owner-password", help="Owner password for --encrypt (defaults to user password)")28 parser.add_argument("--password", help="Known password for --decrypt")29 args = parser.parse_args()30 31 try:32 from pypdf import PdfReader, PdfWriter33 except ImportError:34 print("Missing dependency: install with 'python3 -m pip install pypdf'", file=sys.stderr)35 return 236 37 reader = PdfReader(args.pdf)38 if args.encrypt:39 if not args.user_password:40 print("Error: --encrypt requires --user-password", file=sys.stderr)41 return 242 if reader.is_encrypted:43 print("Error: input already encrypted; decrypt first", file=sys.stderr)44 return 345 writer = PdfWriter()46 writer.append(reader)47 writer.encrypt(48 user_password=args.user_password,49 owner_password=args.owner_password or args.user_password,50 algorithm="AES-256",51 )52 action = "encrypted"53 else:54 if not reader.is_encrypted:55 print("Error: input is not encrypted", file=sys.stderr)56 return 357 if args.password is None or not reader.decrypt(args.password):58 print("Error: wrong or missing --password", file=sys.stderr)59 return 460 writer = PdfWriter()61 writer.append(reader)62 action = "decrypted"63 64 with open(args.output, "wb") as fh:65 writer.write(fh)66 print(json.dumps({"output": args.output, "action": action, "page_count": len(reader.pages)}))67 return 068 69 70if __name__ == "__main__":71 sys.exit(main())72