Skip to content

Instantly share code, notes, and snippets.

@sirk390
Created April 10, 2026 13:09
Show Gist options
  • Select an option

  • Save sirk390/24d3faf832e2964a251409c210d4e459 to your computer and use it in GitHub Desktop.

Select an option

Save sirk390/24d3faf832e2964a251409c210d4e459 to your computer and use it in GitHub Desktop.
rotate_bug.py
from PIL import Image, ImageDraw, ImageFont
import pypdf
import random
import io
PAGE_W = 1240
PAGE_H = 1754
NO_ROTATE_PDF = "pdf_OK.pdf"
WITH_ROTATE_PDF = "pdf_NOK.pdf"
def render_page(number: str) -> Image.Image:
img = Image.new("RGB", (PAGE_W, PAGE_H), "white")
draw = ImageDraw.Draw(img)
font = ImageFont.load_default(100)
text = f"Number: {number}"
bbox = draw.textbbox((0, 0), text, font=font)
text_width = bbox[2] - bbox[0]
x = (PAGE_W - text_width) / 2
y = 100 - bbox[1]
draw.text((x, y), text, fill="black", font=font)
return img
def save_pdf(image: Image.Image, path: str, rotate: int) -> None:
buf = io.BytesIO()
image.save(buf, format="PDF", resolution=200.0)
buf.seek(0)
reader = pypdf.PdfReader(buf)
writer = pypdf.PdfWriter()
page = reader.pages[0]
if rotate:
# page.rotate() only updates the /Rotate entry in the page
page.rotate(rotate)
writer.add_page(page)
with open(path, "wb") as f:
writer.write(f)
def generate_pdfs(number: str) -> None:
"""Write two visually identical PDFs that differ only in /Rotate."""
upright = render_page(number)
# PDF A: bitmap stored upright (1240 x 1754), no /Rotate flag.
save_pdf(upright, NO_ROTATE_PDF, rotate=0)
# PDF B: bitmap stored rotated 90 degrees clockwise. /Rotate 270 to rotate the page
sideways = upright.rotate(-90, expand=True)
save_pdf(sideways, WITH_ROTATE_PDF, rotate=270)
number = f"{random.randint(100000, 999999)}"
generate_pdfs(number)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment