diff --git a/main.py b/main.py index 8b33c0a..2cdede4 100644 --- a/main.py +++ b/main.py @@ -453,16 +453,17 @@ def _render_png_with_magick( run_logger: RunLogger, section_title: str, png_name: str = "diagram.png", - size: str | None = None, + size: tuple[int, int] | None = None, + padding: int = 0, ) -> Optional[Path]: png_path = run_dir / png_name - # Use first page only; remove alpha to avoid transparency surprises. + # Base command: use first page, 300 DPI, and flatten transparency cmd = [ "magick", "-density", "300", - str(pdf_path) + "[0]", + f"{pdf_path}[0]", "-background", "white", "-alpha", @@ -471,23 +472,33 @@ def _render_png_with_magick( "off", ] - # If size is specified, add center-fit resizing (e.g., "1200x630") if size: + width, height = size + # Calculate the target size for the content after subtracting margins + inner_width = width - (2 * padding) + inner_height = height - (2 * padding) + inner_size = f"{inner_width}x{inner_height}" + size_str = f"{width}x{height}" + cmd.extend( [ "-resize", - size, + inner_size, # Resize to fit within margin bounds "-gravity", - "center", + "center", # Center the image "-extent", - size, + size_str, # Pad out to the full requested size ] ) + elif padding > 0: + # If no size is fixed but margin is requested, use -border + cmd.extend(["-bordercolor", "white", "-border", str(padding)]) cmd.append(str(png_path)) code, out = _run_cmd(cmd, cwd=run_dir, timeout_s=5, py_logger=run_logger.py) run_logger.section(section_title, out) + if code == 0 and png_path.exists(): return png_path return None @@ -599,7 +610,8 @@ def _compile_phase( run_log, section_title=f"{phase}.magick.preview", png_name="preview.png", - size="1200x630", + size=(1200, 630), + padding=20, ) if pdf_path else None