30 lines
1.2 KiB
Python
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')
|