"""Overview plus unchanged PDFs exported by the application. Fictional order data.""" from pathlib import Path import json from reportlab.pdfgen import canvas from reportlab.lib.colors import HexColor from reportlab.lib.utils import ImageReader from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.ttfonts import TTFont from pypdf import PdfReader, PdfWriter root=Path(__file__).resolve().parents[3]/'caterium-pdf-20260918' audit=root/'tmp'/'pdfs'/'after' output=root/'output'/'pdf';output.mkdir(parents=True,exist_ok=True) pdfmetrics.registerFont(TTFont('Body','C:/Windows/Fonts/arial.ttf')) pdfmetrics.registerFont(TTFont('Title','C:/Windows/Fonts/georgia.ttf')) names=['Минимализм','Luxury Dark','Editorial Magazine','Warm Sun','Bento Cards','Event Story','Food First','Personal Letter','Event Ticket','Solar Experience','Ночной минимализм','Изумрудная классика','Изумрудный акцент','Кремовая классика','Неоновое меню','Изумрудные круги','Тёмный чек-лист','Гастро-витрина','Изумруд и золото','Премиум тёмный','Премиум изумрудный'] rows=json.loads((audit/'report.json').read_text(encoding='utf8')) overview=root/'tmp'/'pdfs'/'overview.pdf' W,H=595.28,841.89 c=canvas.Canvas(str(overview),pagesize=(W,H)) c.setTitle('Caterium - обновлённые предложения клиенту') def background(): c.setFillColor(HexColor('#faf7ef'));c.rect(0,0,W,H,fill=1,stroke=0) c.setFillColor(HexColor('#20362d')) def text(x,y,value,size=12,font='Body'): c.setFont(font,size);c.drawString(x,y,value) background() text(44,H-66,'Caterium',17) text(44,H-150,'Предложения,',38,'Title') text(44,H-198,'которые хочется',38,'Title') text(44,H-246,'отправить клиенту',38,'Title') text(44,H-304,'Обзор 21 стиля и три полных образца',15) c.setStrokeColor(HexColor('#b19464'));c.line(44,H-340,W-44,H-340) text(44,H-380,'Что изменилось',20,'Title') for i,line in enumerate(['Вернули композиции первых обложек и развели стили.', 'Выровняли поля, цены и карточки меню.', 'Сохранили полные названия, состав, вес и расчёт стоимости.', 'Шрифты загружаются вместе с приложением.', 'Предпросмотр и скачанный PDF используют одни страницы.']): text(44,H-418-i*26,line,11) text(44,190,'В этом файле',20,'Title') text(44,158,'Стр. 2-4: обзор всех вариантов оформления.',11) starts={};page_no=5 selected=['light','editorial-grid','premium-dark'] for id in selected: i=next(i for i,r in enumerate(rows) if r['id']==id);count=rows[i]['pages'];starts[id]=page_no text(44,130-selected.index(id)*24,f'Стр. {page_no}-{page_no+count-1}: {names[i]}.',11);page_no+=count text(44,39,'18 сентября 2026 · Учебный заказ, не клиентская заявка',9) c.showPage() for start in range(0,len(rows),9): background();text(34,H-44,'Коллекция оформлений',25,'Title');text(34,H-69,f'{start+1}-{min(start+9,len(rows))} из 21',11) for i,row in enumerate(rows[start:start+9]): col=i%3;line=i//3;x=34+col*178;y=H-106-line*235 c.drawImage(str(audit/(row['id']+'-1.png')),x,y-209,width=148,height=209) text(x,y-224,f'{start+i+1:02d} {names[start+i]}',8.4) text(34,27,'Полные примеры далее. Любой стиль доступен в приложении.',9) c.showPage() c.save() writer=PdfWriter();writer.append(PdfReader(str(overview))) for id in selected:writer.append(PdfReader(str(audit/(id+'.pdf')))) writer.add_metadata({'/Title':'Caterium - коллекция предложений клиенту','/Author':'Caterium'}) target=output/'Caterium-предложения-образцы.pdf' writer.write(str(target)) print(target, 'pages:',len(writer.pages))