caterium-app/ops/pdf/render-audit.py

30 lines
1.2 KiB
Python

import sys, json
from pathlib import Path
import pypdfium2 as pdfium
from PIL import Image, ImageDraw, ImageFont
base=Path(__file__).resolve().parents[3]/'caterium-pdf-20260918'/'tmp'/'pdfs'
for phase in sys.argv[1:] or ['after']:
root=base/phase
rows=json.loads((root/'report.json').read_text(encoding='utf8'))
covers=[]; pages=[]
for row in rows:
doc=pdfium.PdfDocument(str(root/(row['id']+'.pdf')))
for n in range(len(doc)):
im=doc[n].render(scale=1.25).to_pil().convert('RGB')
im.save(root/f"{row['id']}-{n+1}.png")
pages.append((row['id']+f' / {n+1}',im))
if n==0: covers.append(pages[-1])
def sheet(entries,name,cols=4):
tw,th=250,380
out=Image.new('RGB',(tw*cols,th*((len(entries)+cols-1)//cols)),'#dce1e5')
d=ImageDraw.Draw(out)
for i,(label,im) in enumerate(entries):
tile=im.copy(); tile.thumbnail((tw-12,th-32))
x=(i%cols)*tw; y=(i//cols)*th
out.paste(tile,(x+6,y+25));d.text((x+6,y+6),label,fill='black')
out.save(root/name)
sheet(covers,'covers.png')
for start in range(0,len(pages),12):sheet(pages[start:start+12],f'pages-{start//12+1}.png')
print(phase,len(pages),'pages rendered')