61 lines
4.1 KiB
Python
61 lines
4.1 KiB
Python
"""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))
|