cat > /workspace/scratch/verify_final.py <<'PY'
import fitz,json,os
from pypdf import PdfReader
from PIL import Image,ImageOps,ImageDraw
from lxml import etree as E
p='/workspace/output/catalogue_press.pdf';d=fitz.open(p);r=PdfReader(p)
print('Pages',len(d),'PDF',r.pdf_header)
print('Output intent',r.trailer['/Root']['/OutputIntents'][0].get_object())
meta=r.trailer['/Root']['/Metadata'].get_object().get_data();print('PDF/X-4 metadata',b'PDF/X-4' in meta)
profile=r.trailer['/Root']['/OutputIntents'][0].get_object()['/DestOutputProfile'].get_object().get_data();print('ICC bytes',len(profile),'complete source',profile==open('/workspace/input/profiles/ISOcoated_v2_300_bas.icc','rb').read())
copy=json.load(open('/workspace/scratch/approved.json'));plan=json.load(open('/workspace/input/page_plan.json'))['pages'];sheet=Image.new('RGB',(4*420,3*620),'#ddd')
for i,page in enumerate(d):
 pix=page.get_pixmap(matrix=fitz.Matrix(1.05,1.05),alpha=False);im=Image.frombytes('RGB',(pix.width,pix.height),pix.samples);im.save('/workspace/scratch/page%02d.png'%(i+1));im.thumbnail((405,580));sheet.paste(im,(i%4*420+7,i//4*620+20))
 txt=' '.join(page.get_text().split());print('Page',i+1,'boxes',r.pages[i].mediabox,r.pages[i].trimbox,r.pages[i].bleedbox,'images',[(x[2],x[3]) for x in page.get_images()])
 for s in plan[i]['skus']:
  for key in ['name','price','description']:
   v=' '.join(copy[s][key].split());assert v in txt,(s,key,v,txt)
  assert s in txt
 fonts=page.get_fonts(full=True)
 for f in fonts:
  data=d.extract_font(f[0]);assert len(data[3])>100
print('All copy and fonts verified')
sheet.save('/workspace/scratch/final_contact.jpg',quality=95)
# Native integrity, readable local links and unscaled pixel grid.
t=E.parse('/workspace/output/catalogue.sla');doc=t.find('DOCUMENT');objs=doc.findall('PAGEOBJECT');ims=[x for x in objs if x.get('PTYPE')=='2'];print('Native image count',len(ims))
for o in ims:
 path=o.get('PFILE');assert path.startswith('assets/'),path;assert os.path.isfile('/workspace/output/'+path)
 print(o.get('ANNAME'),path,'scale',o.get('LOCALSCX'),o.get('LOCALSCY'),'intent',o.get('IRENDER'))
PY
python /workspace/scratch/verify_final.py > /workspace/scratch/verify_final.log
cat /workspace/scratch/verify_final.log