#!/usr/bin/env python3 """ Scribus script: Create a print-ready PDF from an rSwag design image. Generates a new Scribus document with the design placed on a page with optional bleed and crop marks. Called via: scribus -g -ns -py rswag_export.py -- [args] """ import sys import os # Paper sizes in mm (width, height) PAPER_SIZES = { "A4": (210, 297), "A3": (297, 420), "A5": (148, 210), "Letter": (215.9, 279.4), "Tabloid": (279.4, 431.8), } BLEED_MM = 3.0 CROP_MARK_LEN = 5.0 CROP_MARK_OFFSET = 3.0 def parse_args(): args = {"bleed": False, "crop_marks": False} argv = sys.argv[1:] i = 0 while i < len(argv): if argv[i] == "--image" and i + 1 < len(argv): args["image"] = argv[i + 1] i += 2 elif argv[i] == "--output" and i + 1 < len(argv): args["output"] = argv[i + 1] i += 2 elif argv[i] == "--paper" and i + 1 < len(argv): args["paper"] = argv[i + 1] i += 2 elif argv[i] == "--dpi" and i + 1 < len(argv): args["dpi"] = int(argv[i + 1]) i += 2 elif argv[i] == "--title" and i + 1 < len(argv): args["title"] = argv[i + 1] i += 2 elif argv[i] == "--bleed": args["bleed"] = True i += 1 elif argv[i] == "--crop-marks": args["crop_marks"] = True i += 1 else: i += 1 return args def main(): try: import scribus except ImportError: print("ERROR: Must run inside Scribus") sys.exit(1) args = parse_args() image_path = args.get("image") output_path = args.get("output") paper = args.get("paper", "A4") dpi = args.get("dpi", 300) title = args.get("title", "rSwag Design") if not image_path or not output_path: print("ERROR: --image and --output required") sys.exit(1) if not os.path.exists(image_path): print(f"ERROR: Image not found: {image_path}") sys.exit(1) # Get paper dimensions paper_w, paper_h = PAPER_SIZES.get(paper, PAPER_SIZES["A4"]) # Calculate page size with bleed bleed = BLEED_MM if args["bleed"] else 0 page_w = paper_w + (bleed * 2) page_h = paper_h + (bleed * 2) # Create new document (dimensions in mm, SCRIBUS_UNIT_MILLIMETERS = 1) scribus.newDocument( (page_w, page_h), # page size (10, 10, 10, 10), # margins (left, right, top, bottom) scribus.PORTRAIT, 1, # first page number scribus.UNIT_MILLIMETERS, scribus.PAGE_1, # single page facing 0, # first page left 1, # number of pages ) # Place the image centered on the page # Calculate placement: center the image on the page margin = 15 # mm margin around image img_area_w = paper_w - (margin * 2) img_area_h = paper_h - (margin * 2) img_x = bleed + margin img_y = bleed + margin # Create image frame img_frame = scribus.createImage(img_x, img_y, img_area_w, img_area_h, "design") scribus.loadImage(image_path, img_frame) # Scale image to fit frame proportionally scribus.setScaleImageToFrame(True, True, img_frame) # Add title text below the image title_y = bleed + margin + img_area_h + 5 title_frame = scribus.createText( bleed + margin, title_y, img_area_w, 10, "title" ) scribus.setText(title, title_frame) scribus.setFontSize(12, title_frame) scribus.setTextAlignment(scribus.ALIGN_CENTERED, title_frame) # Add crop marks if requested if args["crop_marks"]: mark_color = "Registration" # Ensure Registration color exists (it's a default Scribus color) line_width = 0.25 # mm # Top-left corner for mark_args in [ # Top-left (bleed - CROP_MARK_OFFSET - CROP_MARK_LEN, bleed, CROP_MARK_LEN, 0), (bleed, bleed - CROP_MARK_OFFSET - CROP_MARK_LEN, 0, CROP_MARK_LEN), # Top-right (bleed + paper_w + CROP_MARK_OFFSET, bleed, CROP_MARK_LEN, 0), (bleed + paper_w, bleed - CROP_MARK_OFFSET - CROP_MARK_LEN, 0, CROP_MARK_LEN), # Bottom-left (bleed - CROP_MARK_OFFSET - CROP_MARK_LEN, bleed + paper_h, CROP_MARK_LEN, 0), (bleed, bleed + paper_h + CROP_MARK_OFFSET, 0, CROP_MARK_LEN), # Bottom-right (bleed + paper_w + CROP_MARK_OFFSET, bleed + paper_h, CROP_MARK_LEN, 0), (bleed + paper_w, bleed + paper_h + CROP_MARK_OFFSET, 0, CROP_MARK_LEN), ]: x, y, w, h = mark_args if w > 0: line = scribus.createLine(x, y, x + w, y) else: line = scribus.createLine(x, y, x, y + h) scribus.setLineWidth(line_width, line) # Export to PDF pdf = scribus.PDFfile() pdf.file = output_path pdf.quality = 0 # Maximum pdf.resolution = dpi pdf.version = 14 # PDF 1.4 pdf.compress = True pdf.compressmtd = 0 if args["bleed"]: pdf.useDocBleeds = False pdf.bleedt = BLEED_MM pdf.bleedb = BLEED_MM pdf.bleedl = BLEED_MM pdf.bleedr = BLEED_MM if args["crop_marks"]: pdf.cropMarks = True pdf.markLength = CROP_MARK_LEN pdf.markOffset = CROP_MARK_OFFSET pdf.save() scribus.closeDoc() print(f"Exported: {output_path}") if __name__ == "__main__": main()