"""Verify editable text, slide bounds, PDF text roundtrip, and render proofs."""
from pathlib import Path
import json,re,zipfile,hashlib,xml.etree.ElementTree as E
import pypdfium2 as pdfium
from pypdf import PdfReader
from PIL import Image,ImageDraw
root=Path(__file__).resolve().parents[6];out=root/'oss/local-deliveries/k12-campus-meal-refined-20260912';stem='康比特校园餐数字治理一体化解决方案-对外精简版';ppt=out/(stem+'.pptx');pdf=out/(stem+'.pdf')
ns={'a':'http://schemas.openxmlformats.org/drawingml/2006/main','p':'http://schemas.openxmlformats.org/presentationml/2006/main'}
norm=lambda t:re.sub(r'\s+','',t)
reader=PdfReader(pdf);assert len(reader.pages)==10
z=zipfile.ZipFile(ppt);assert z.testzip() is None
pages=[]
for i in range(1,11):
 el=E.fromstring(z.read(f'ppt/slides/slide{i}.xml'));ts=[''.join(t.text or '' for t in sp.findall('.//a:t',ns)) for sp in el.findall('.//p:sp',ns)];ts=[x for x in ts if x]
 pdftext=norm(reader.pages[i-1].extract_text());missing=[x for x in ts if norm(x) not in pdftext]
 assert not missing,(i,missing)
 assert len(ts)>0,(i,'No native editable text')
 assert f'ppt/notesSlides/notesSlide{i}.xml' in z.namelist()
 pages.append({'page':i,'editable_text_objects':len(ts),'visible_characters':sum(len(x) for x in ts),'pdf_text_roundtrip':'pass'})
manifest=json.loads((out/'layout-manifest.json').read_text());assert all(o['x']>=0 and o['y']>=0 and o['x']+o['w']<=13.334 and o['y']+o['h']<=7.501 for o in manifest)
doc=pdfium.PdfDocument(str(pdf));canvas=Image.new('RGB',(1600,2375),'#ddd');draw=ImageDraw.Draw(canvas)
for i in range(10):
 im=doc[i].render(scale=1.6).to_pil().convert('RGB');im.save(out/f'page-{i+1:02}.png');im.thumbnail((790,440));x=i%2*800;y=i//2*475;canvas.paste(im,(x,y+25));draw.text((x+8,y+7),str(i+1),fill='black')
canvas.save(out/'全稿预览.jpg')
result={'pages':pages,'canvas_bounds':'pass','zip_integrity':'pass','editable_objects':sum(x['editable_text_objects'] for x in pages),'files':{x.name:{'bytes':x.stat().st_size,'sha256':hashlib.sha256(x.read_bytes()).hexdigest()} for x in [ppt,pdf]}}
(out/'verification.json').write_text(json.dumps(result,ensure_ascii=False,indent=2));print(json.dumps(result,ensure_ascii=False,indent=2))
