Make this booklet into left and right per page..anatropic nephrolithiotmy and cysteine stones mention under radioopaque stone
cd /home/daytona/workspace/attachments/ea490fdc-5360-4819-af64-b62d53ec2ff4/ && python3 -c " import pdfplumber with pdfplumber.open('Urolithiasis.pdf') as pdf: print(f'Total pages: {len(pdf.pages)}') for i, page in enumerate(pdf.pages[:3]): print(f'\n--- Page {i+1} ---') print(page.extract_text()[:800]) "
python3 -c " from pypdf import PdfReader import os path = '/home/daytona/workspace/attachments/ea490fdc-5360-4819-af64-b62d53ec2ff4/Urolithiasis.pdf' reader = PdfReader(path) print(f'Pages: {len(reader.pages)}') page = reader.pages[0] print(f'Page 1 size: {page.mediabox}') print(f'Resources: {list(page.get(\"/Resources\", {}).keys()) if page.get(\"/Resources\") else \"none\"}') # Check for images if page.images: print(f'Images on page 1: {len(page.images)}') img = page.images[0] print(f'Image name: {img.name}, size: {img.width}x{img.height}') else: print('No images found on page 1 via pypdf') "
python3 -c "import fitz; print('pymupdf ok')" 2>/dev/null || echo "not available" python3 -c "from pdf2image import convert_from_path; print('pdf2image ok')" 2>/dev/null || echo "pdf2image not available"
mkdir -p /home/daytona/workspace/urolithiasis-booklet/pages python3 -c " from pdf2image import convert_from_path from PIL import Image import os pdf_path = '/home/daytona/workspace/attachments/ea490fdc-5360-4819-af64-b62d53ec2ff4/Urolithiasis.pdf' out_dir = '/home/daytona/workspace/urolithiasis-booklet/pages' pages = convert_from_path(pdf_path, dpi=150) print(f'Total pages: {len(pages)}') for i, page in enumerate(pages): out_path = os.path.join(out_dir, f'page_{i+1:02d}.png') page.save(out_path, 'PNG') print(f'Saved page {i+1}: {page.size}') print('Done extracting pages.') "
python3 -c " from PIL import Image import os # Create small thumbnails for inspection pages_dir = '/home/daytona/workspace/urolithiasis-booklet/pages' thumb_dir = '/home/daytona/workspace/urolithiasis-booklet/thumbs' os.makedirs(thumb_dir, exist_ok=True) for i in range(1, 13): img = Image.open(f'{pages_dir}/page_{i:02d}.png') # Make thumbnail at 30% size w, h = img.size thumb = img.resize((w//4, h//4), Image.LANCZOS) thumb.save(f'{thumb_dir}/thumb_{i:02d}.jpg', 'JPEG', quality=85) print('Thumbnails created') "
python3 << 'EOF' from PIL import Image, ImageDraw, ImageFont import os pages_dir = '/home/daytona/workspace/urolithiasis-booklet/pages' out_dir = '/home/daytona/workspace/urolithiasis-booklet' # Load page 3 (radiopaque calculi) page3 = Image.open(f'{pages_dir}/page_03.png') w, h = page3.size print(f'Page 3 size: {w}x{h}') # Check what fonts are available import subprocess result = subprocess.run(['fc-list', '--format=%{file}\n'], capture_output=True, text=True) fonts = [f.strip() for f in result.stdout.split('\n') if 'DejaVu' in f or 'Liberation' in f or 'Roboto' in f or 'Arial' in f or 'Ubuntu' in f] for f in fonts[:10]: print(f) EOF
python3 << 'EOF' from PIL import Image, ImageDraw, ImageFont import os pages_dir = '/home/daytona/workspace/urolithiasis-booklet/pages' out_dir = '/home/daytona/workspace/urolithiasis-booklet' # Load fonts font_bold = ImageFont.truetype('/usr/share/fonts/truetype/liberation/LiberationSans-Bold.ttf', 52) font_reg = ImageFont.truetype('/usr/share/fonts/truetype/liberation/LiberationSans-Regular.ttf', 44) font_small = ImageFont.truetype('/usr/share/fonts/truetype/liberation/LiberationSans-Regular.ttf', 38) font_small_bold = ImageFont.truetype('/usr/share/fonts/truetype/liberation/LiberationSans-Bold.ttf', 40) # Load page 3 (Radiopaque Calculi - Common) page3 = Image.open(f'{pages_dir}/page_03.png').copy() draw = ImageDraw.Draw(page3) w, h = page3.size # 2867x1600 # Add a "Also Radiopaque:" note box at the bottom of the slide # The slide has two main columns. We add a full-width banner at the bottom. # Background banner banner_y_start = h - 220 banner_y_end = h - 20 banner_color = (44, 62, 80) # dark navy border_color = (255, 193, 7) # amber/yellow # Draw filled rectangle banner draw.rectangle([40, banner_y_start, w-40, banner_y_end], fill=banner_color, outline=border_color, width=4) # Title text title_text = "Also Radiopaque (Rare):" draw.text((70, banner_y_start + 18), title_text, font=font_small_bold, fill=(255, 193, 7)) # Cystine stones text cystine_text = "• Cystine Stones — Hexagonal crystals, seen in acidic urine; very hard, resistant to ESWL." draw.text((70, banner_y_start + 70), cystine_text, font=font_small, fill=(255, 255, 255)) # Anatropic nephrolithotomy anatrop_text = "• Anatropic Nephrolithotomy — Surgical approach for large/staghorn stones; incision along avascular plane of kidney." draw.text((70, banner_y_start + 120), anatrop_text, font=font_small, fill=(255, 255, 255)) page3.save(f'{pages_dir}/page_03_modified.png') print("Page 3 modified and saved.") # Create a thumbnail to check thumb = page3.resize((716, 400), Image.LANCZOS) thumb.save(f'{out_dir}/thumbs/thumb_03_modified.jpg', 'JPEG', quality=88) print("Thumbnail saved.") EOF
python3 << 'EOF' from PIL import Image from reportlab.lib.pagesizes import A3, landscape from reportlab.pdfgen import canvas import os, io pages_dir = '/home/daytona/workspace/urolithiasis-booklet/pages' out_path = '/home/daytona/workspace/urolithiasis-booklet/Urolithiasis_Booklet_2up.pdf' # Build ordered list of 12 slide image paths (page_03 uses modified version) slides = [] for i in range(1, 13): if i == 3: slides.append(f'{pages_dir}/page_03_modified.png') else: slides.append(f'{pages_dir}/page_{i:02d}.png') # A3 landscape: 1190.55 x 841.89 pts (each half = ~595 x 841 pt = approx A4) page_w, page_h = landscape(A3) # ~1190.55 x 841.89 half_w = page_w / 2 margin = 8 # small margin in pts c = canvas.Canvas(out_path, pagesize=landscape(A3)) for pair_idx in range(0, len(slides), 2): left_path = slides[pair_idx] right_path = slides[pair_idx + 1] if pair_idx + 1 < len(slides) else None # Draw left slide left_img = Image.open(left_path) lw, lh = left_img.size # Scale to fit half_w x page_h with margin avail_w = half_w - 2 * margin avail_h = page_h - 2 * margin scale = min(avail_w / lw, avail_h / lh) draw_w = lw * scale draw_h = lh * scale x_offset = margin + (avail_w - draw_w) / 2 y_offset = margin + (avail_h - draw_h) / 2 # Save left img to bytes buffer buf = io.BytesIO() left_img.save(buf, format='PNG') buf.seek(0) c.drawImage(buf, x_offset, y_offset, width=draw_w, height=draw_h) # Draw right slide if right_path: right_img = Image.open(right_path) rw, rh = right_img.size scale2 = min(avail_w / rw, avail_h / rh) draw_w2 = rw * scale2 draw_h2 = rh * scale2 x_offset2 = half_w + margin + (avail_w - draw_w2) / 2 y_offset2 = margin + (avail_h - draw_h2) / 2 buf2 = io.BytesIO() right_img.save(buf2, format='PNG') buf2.seek(0) c.drawImage(buf2, x_offset2, y_offset2, width=draw_w2, height=draw_h2) # Draw center dividing line (subtle) c.setStrokeColorRGB(0.7, 0.7, 0.7) c.setLineWidth(0.5) c.line(half_w, 10, half_w, page_h - 10) c.showPage() print(f'Sheet {pair_idx//2 + 1} done') c.save() print(f'\nBooklet saved to: {out_path}') import os size_mb = os.path.getsize(out_path) / (1024*1024) print(f'File size: {size_mb:.1f} MB') EOF
python3 << 'EOF' from PIL import Image from reportlab.lib.pagesizes import A3, landscape from reportlab.pdfgen import canvas from reportlab.lib.utils import ImageReader import os, io pages_dir = '/home/daytona/workspace/urolithiasis-booklet/pages' out_path = '/home/daytona/workspace/urolithiasis-booklet/Urolithiasis_Booklet_2up.pdf' # Build ordered list of 12 slide image paths slides = [] for i in range(1, 13): if i == 3: slides.append(f'{pages_dir}/page_03_modified.png') else: slides.append(f'{pages_dir}/page_{i:02d}.png') page_w, page_h = landscape(A3) # ~1190.55 x 841.89 half_w = page_w / 2 margin = 8 c = canvas.Canvas(out_path, pagesize=landscape(A3)) for pair_idx in range(0, len(slides), 2): left_path = slides[pair_idx] right_path = slides[pair_idx + 1] if pair_idx + 1 < len(slides) else None # Draw left slide left_img = Image.open(left_path) lw, lh = left_img.size avail_w = half_w - 2 * margin avail_h = page_h - 2 * margin scale = min(avail_w / lw, avail_h / lh) draw_w = lw * scale draw_h = lh * scale x_offset = margin + (avail_w - draw_w) / 2 y_offset = margin + (avail_h - draw_h) / 2 ir = ImageReader(left_img) c.drawImage(ir, x_offset, y_offset, width=draw_w, height=draw_h) if right_path: right_img = Image.open(right_path) rw, rh = right_img.size scale2 = min(avail_w / rw, avail_h / rh) draw_w2 = rw * scale2 draw_h2 = rh * scale2 x_offset2 = half_w + margin + (avail_w - draw_w2) / 2 y_offset2 = margin + (avail_h - draw_h2) / 2 ir2 = ImageReader(right_img) c.drawImage(ir2, x_offset2, y_offset2, width=draw_w2, height=draw_h2) # Center dividing line c.setStrokeColorRGB(0.6, 0.6, 0.6) c.setLineWidth(0.5) c.line(half_w, 8, half_w, page_h - 8) c.showPage() print(f'Sheet {pair_idx//2 + 1} done') c.save() print(f'\nBooklet saved: {out_path}') size_mb = os.path.getsize(out_path) / (1024*1024) print(f'File size: {size_mb:.1f} MB') EOF
Urolithiasis Booklet 2up
PDF Document · PDF
No make it into notes
What format should the notes be in? · What style of notes do you want?