awacke1's picture
Update app.py
15f6774 verified
raw
history blame
4.42 kB
def create_main_pdf(markdown_text):
buffer = io.BytesIO()
doc = SimpleDocTemplate(
buffer,
pagesize=(A4[1], A4[0]), # Landscape A4: 841.89 x 595.27 points
leftMargin=36,
rightMargin=36,
topMargin=36,
bottomMargin=36
)
styles = getSampleStyleSheet()
story = []
page_height = A4[0] - 72
title_height = 20
spacer_height = 10
available_content_height = page_height - title_height - spacer_height
# Process columns first
left_column, right_column = markdown_to_pdf_content(markdown_text)
# Calculate total items by explicitly handling the unpacking
total_items = 0
for col in (left_column, right_column):
for item in col:
if isinstance(item, list):
main_item, sub_items = item # Unpack here
total_items += 1 + len(sub_items)
else:
total_items += 1
# Dynamic font sizes
base_font_size = max(6, min(11, 200 / total_items))
item_font_size = base_font_size
subitem_font_size = base_font_size * 0.9
section_font_size = base_font_size * 1.2
# Create custom styles
title_style = styles['Heading1']
title_style.textColor = colors.darkblue
title_style.alignment = 1
title_style.fontSize = min(16, base_font_size * 1.5)
section_style = ParagraphStyle(
'SectionStyle',
parent=styles['Heading2'],
textColor=colors.darkblue,
fontSize=section_font_size,
leading=section_font_size * 1.2,
spaceAfter=2
)
item_style = ParagraphStyle(
'ItemStyle',
parent=styles['Normal'],
fontSize=item_font_size,
leading=item_font_size * 1.2,
fontName='Helvetica-Bold',
spaceAfter=1
)
subitem_style = ParagraphStyle(
'SubItemStyle',
parent=styles['Normal'],
fontSize=subitem_font_size,
leading=subitem_font_size * 1.2,
leftIndent=10,
spaceAfter=1
)
# Add title
story.append(Paragraph("Cutting-Edge ML Outline (ReportLab)", title_style))
story.append(Spacer(1, spacer_height))
# Prepare data for table
left_cells = []
for item in left_column:
if isinstance(item, str) and item.startswith('<b>'):
text = item.replace('<b>', '').replace('</b>', '')
left_cells.append(Paragraph(text, section_style))
elif isinstance(item, list):
main_item, sub_items = item
left_cells.append(Paragraph(main_item, item_style))
for sub_item in sub_items:
left_cells.append(Paragraph(sub_item, subitem_style))
else:
left_cells.append(Paragraph(item, item_style))
right_cells = []
for item in right_column:
if isinstance(item, str) and item.startswith('<b>'):
text = item.replace('<b>', '').replace('</b>', '')
right_cells.append(Paragraph(text, section_style))
elif isinstance(item, list):
main_item, sub_items = item
right_cells.append(Paragraph(main_item, item_style))
for sub_item in sub_items:
right_cells.append(Paragraph(sub_item, subitem_style))
else:
right_cells.append(Paragraph(item, item_style))
# Make columns equal length
max_cells = max(len(left_cells), len(right_cells))
left_cells.extend([""] * (max_cells - len(left_cells)))
right_cells.extend([""] * (max_cells - len(right_cells)))
# Create table data
table_data = list(zip(left_cells, right_cells))
# Calculate column widths
col_width = (A4[1] - 72) / 2.0
# Create and style table
table = Table(table_data, colWidths=[col_width, col_width], hAlign='CENTER')
table.setStyle(TableStyle([
('VALIGN', (0, 0), (-1, -1), 'TOP'),
('ALIGN', (0, 0), (-1, -1), 'LEFT'),
('BACKGROUND', (0, 0), (-1, -1), colors.white),
('GRID', (0, 0), (-1, -1), 0, colors.white),
('LINEAFTER', (0, 0), (0, -1), 0.5, colors.grey),
('LEFTPADDING', (0, 0), (-1, -1), 2),
('RIGHTPADDING', (0, 0), (-1, -1), 2),
('TOPPADDING', (0, 0), (-1, -1), 1),
('BOTTOMPADDING', (0, 0), (-1, -1), 1),
]))
story.append(table)
doc.build(story)
buffer.seek(0)
return buffer.getvalue()