diff --git a/pdf_border_frames/README.md b/pdf_border_frames/README.md new file mode 100644 index 000000000..c1ad10edc --- /dev/null +++ b/pdf_border_frames/README.md @@ -0,0 +1,35 @@ +# PDF_Border_Frames + +Add configurable frame/borders to all pages in your PDF + +## Setup instructions + +1. Install PyMuPDF pypi package: +```bash +pip install PyMuPDF +``` + +2. Run with default frame config: +```bash +python pdf_border_frame.py +``` + +
+3. Run with custom config:
+ +| Flag | Description | Default | +|-----------|---------------------|---------| +| `--l` | Left margin (pt) | 20 | +| `--r` | Right margin (pt) | 20 | +| `--t` | Top margin (pt) | 20 | +| `--b` | Bottom margin (pt) | 20 | +| `--th` | Frame thickness (pt)| 2 | + + +```bash +python pdf_border_frame.py --t 20 --b 20 --l 20 --r 20 --th 2 +``` + + +## Author +[sk5268](github.com/sk5268) \ No newline at end of file diff --git a/pdf_border_frames/pdf_border_frame.py b/pdf_border_frames/pdf_border_frame.py new file mode 100644 index 000000000..160fedb57 --- /dev/null +++ b/pdf_border_frames/pdf_border_frame.py @@ -0,0 +1,75 @@ +import fitz # PyMuPDF +import argparse +import sys +import os + + +def add_frame(input_pdf_path, left=20, right=20, top=20, bottom=20, thickness=2): + try: + doc = fitz.open(input_pdf_path) + + for page in doc: + page_rect = page.rect + frame_rect = fitz.Rect( + left, # left + top, # top + page_rect.width - right, # right + page_rect.height - bottom # bottom + ) + + page.draw_rect( + frame_rect, + width=thickness + ) + + base, _ = os.path.splitext(input_pdf_path) + output_pdf_path = f"{base}_framed.pdf" + doc.save(output_pdf_path) + print(f"PDF with rectangle frame saved to {output_pdf_path}") + + except UnicodeDecodeError: + print( + "Error: Input file path encoding issue. " + "Please ensure the file path is UTF-8 encoded." + ) + except Exception as e: + print(f"An error occurred: {e}") + finally: + if 'doc' in locals(): + doc.close() + + +def main(): + parser = argparse.ArgumentParser( + description=( + "Add a rectangle frame to each page of a PDF document.\n" + "Flags: --l (left), --r (right), --t (top), --b (bottom), " + "--th (thickness)" + ), + formatter_class=argparse.RawTextHelpFormatter + ) + parser.add_argument("input_pdf", help="Path to the input PDF file") + parser.add_argument("--l", type=float, default=20, help="Left margin") + parser.add_argument("--r", type=float, default=20, help="Right margin") + parser.add_argument("--t", type=float, default=20, help="Top margin") + parser.add_argument("--b", type=float, default=20, help="Bottom margin") + parser.add_argument("--th", type=float, default=2, help="Frame thickness") + + try: + args = parser.parse_args() + add_frame( + args.input_pdf, + left=args.l, + right=args.r, + top=args.t, + bottom=args.b, + thickness=args.th + ) + except Exception as e: + print(f"Error: {e}\n") + parser.print_usage() + sys.exit(1) + + +if __name__ == "__main__": + main() diff --git a/pdf_border_frames/requirements.txt b/pdf_border_frames/requirements.txt new file mode 100644 index 000000000..db357ea91 --- /dev/null +++ b/pdf_border_frames/requirements.txt @@ -0,0 +1 @@ +PyMuPDF==1.26.0 \ No newline at end of file