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(''): text = item.replace('', '').replace('', '') 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(''): text = item.replace('', '').replace('', '') 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()