#!/usr/bin/env python3 """Add text watermark to PDF pages.""" import argparse, json, sys, io from pathlib import Path def add_watermark(input_path, output_path, text='CONFIDENTIAL', opacity=0.3, angle=45, font_size=48): from PyPDF2 import PdfReader, PdfWriter from reportlab.pdfgen import canvas reader = PdfReader(input_path) writer = PdfWriter() for page in reader.pages: media = page.mediabox pw = float(media.width) ph = float(media.height) packet = io.BytesIO() c = canvas.Canvas(packet, pagesize=(pw, ph)) c.saveState() c.setFont("Helvetica-Bold", font_size) c.setFillAlpha(opacity) c.setFillColorRGB(0.5, 0.5, 0.5) c.translate(pw / 2, ph / 2) c.rotate(angle) c.drawCentredString(0, 0, text) c.restoreState() c.save() packet.seek(0) overlay = PdfReader(packet) page.merge_page(overlay.pages[0]) writer.add_page(page) if not output_path: output_path = str(Path(input_path).with_stem(Path(input_path).stem + '_watermarked')) with open(output_path, 'wb') as f: writer.write(f) return output_path def main(): parser = argparse.ArgumentParser(description='Add watermark to PDF') parser.add_argument('--input', required=True) parser.add_argument('--output', required=True) parser.add_argument('--text', default='CONFIDENTIAL') parser.add_argument('--opacity', type=float, default=0.3) parser.add_argument('--angle', type=float, default=45) parser.add_argument('--font-size', type=int, default=48) args = parser.parse_args() try: result = add_watermark(args.input, args.output, args.text, args.opacity, args.angle, args.font_size) print(json.dumps({"success": True, "output": result, "message": "Watermark added successfully"})) except Exception as e: print(json.dumps({"success": False, "output": "", "message": str(e)})) sys.exit(1) if __name__ == '__main__': main()