# Renders synthetic samples from gt/*.txt (300 dpi PNG) + degraded scan of sample 01.
import random, numpy as np
from PIL import Image, ImageDraw, ImageFont, ImageFilter
F="/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"; FB="/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf"
font=ImageFont.truetype(F,42); bold=ImageFont.truetype(FB,42)  # ~10pt @300dpi
def page(lines, h=3508, w=2480):
    im=Image.new("L",(w,h),255); d=ImageDraw.Draw(im); y=200
    for l in lines: d.text((180,y),l,font=font,fill=0); y+=62
    return im.crop((0,0,w,y+200))
for n in ["01_clean_kk","02_mixed_kk_ru"]:
    page(open(f"gt/{n}.txt").read().splitlines()).save(f"samples/{n}.png",dpi=(300,300))
# invoice with table grid
L=open("gt/03_invoice_kk.txt").read().splitlines()
im=Image.new("L",(2480,1500),255); d=ImageDraw.Draw(im); y=150
d.text((180,y),L[0],font=bold,fill=0); y+=90
for l in L[1:5]: d.text((180,y),l,font=font,fill=0); y+=62
y+=30; cols=[180,280,900,1200,1400,1650,1950,2300]
hdr=["№","Тауар атауы","Өлш. бір.","Саны","Бағасы","Сомасы"]
rows=[r.split() for r in L[6:11]]
rows=[[r[0]," ".join(r[1:-4])]+r[-4:] for r in rows]
cw=[180,280,900,1200,1400,1650,1950]  # 6 cols -> use 7 boundaries
for i,row in enumerate([hdr]+rows):
    d.rectangle((180,y,1950,y+70),outline=0,width=2)
    for c in range(1,6): d.line((cw[c],y,cw[c],y+70),fill=0,width=2)
    for c,t in enumerate(row): d.text((cw[c]+12,y+12),t,font=bold if i==0 else font,fill=0)
    y+=70
y+=40
for l in L[11:]: d.text((180,y),l,font=font,fill=0); y+=62
im.crop((0,0,2480,y+150)).save("samples/03_invoice_kk.png",dpi=(300,300))
# degraded: 150dpi, rotate 2deg, blur, gaussian noise, JPEG q60
random.seed(1); np.random.seed(1)
im=Image.open("samples/01_clean_kk.png"); im=im.resize((im.width//2,im.height//2),Image.LANCZOS)
im=im.rotate(2,resample=Image.BICUBIC,expand=True,fillcolor=255).filter(ImageFilter.GaussianBlur(0.9))
a=np.asarray(im).astype(float)+np.random.normal(0,18,(im.height,im.width))
Image.fromarray(np.clip(a,0,255).astype("uint8")).save("samples/04_degraded_kk.jpg",quality=60,dpi=(150,150))
