Tyrosinimea
tyrosinemia
| Feature | Type I (TYR1) | Type II (TYR2) | Type III (TYR3) |
|---|---|---|---|
| Enzyme defect | FAH | TAT | HPD |
| Gene | FAH | TAT | HPD |
| Diagnostic marker | Succinylacetone (urine) | Elevated serum tyrosine | Elevated serum tyrosine |
| Liver disease | Severe (cirrhosis, HCC) | None | None |
| Renal (Fanconi) | Yes | No | No |
| Eye findings | No | Yes (corneal erosions) | No |
| Skin | No | Yes (palmoplantar keratosis) | No |
| Neurology | Porphyria-like crises | Mild intellectual disability | Intellectual disability, seizures |
| Key treatment | NTBC + diet ± liver Tx | Low-Tyr/Phe diet | Low-Tyr/Phe diet |
Generate the pdf
ls /home/daytona/workspace/ 2>/dev/null || mkdir -p /home/daytona/workspace
mkdir -p /home/daytona/workspace/tyrosinemia-pdf && cat > /home/daytona/workspace/tyrosinemia-pdf/generate.py << 'PYEOF' from reportlab.lib.pagesizes import A4 from reportlab.lib import colors from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib.units import cm, mm from reportlab.platypus import (SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, HRFlowable, KeepTogether) from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_JUSTIFY from reportlab.platypus import PageBreak OUTPUT = "/home/daytona/workspace/tyrosinemia-pdf/Tyrosinemia.pdf" # ── Colour palette ────────────────────────────────────────────────────────── DARK_BLUE = colors.HexColor("#1a3a5c") MID_BLUE = colors.HexColor("#2e6da4") LIGHT_BLUE = colors.HexColor("#d6e8f7") ACCENT = colors.HexColor("#e8a020") TABLE_HEAD = colors.HexColor("#2e6da4") TABLE_ODD = colors.HexColor("#f0f7ff") TABLE_EVEN = colors.white TEXT_DARK = colors.HexColor("#1c1c1c") BORDER_CLR = colors.HexColor("#2e6da4") # ── Document ──────────────────────────────────────────────────────────────── doc = SimpleDocTemplate( OUTPUT, pagesize=A4, leftMargin=2*cm, rightMargin=2*cm, topMargin=2.5*cm, bottomMargin=2*cm, title="Tyrosinemia - Clinical Overview", author="Orris Medical" ) styles = getSampleStyleSheet() # Custom styles title_style = ParagraphStyle( "DocTitle", parent=styles["Normal"], fontSize=26, textColor=colors.white, fontName="Helvetica-Bold", alignment=TA_CENTER, spaceAfter=4 ) subtitle_style = ParagraphStyle( "DocSub", parent=styles["Normal"], fontSize=12, textColor=colors.HexColor("#c8e0f5"), fontName="Helvetica", alignment=TA_CENTER, spaceAfter=2 ) h1 = ParagraphStyle( "H1", parent=styles["Normal"], fontSize=14, textColor=colors.white, fontName="Helvetica-Bold", spaceBefore=14, spaceAfter=6, backColor=MID_BLUE, borderPad=(6, 4, 6, 8), leftIndent=-10, rightIndent=-10 ) h2 = ParagraphStyle( "H2", parent=styles["Normal"], fontSize=12, textColor=DARK_BLUE, fontName="Helvetica-Bold", spaceBefore=10, spaceAfter=4, borderPad=(0, 0, 2, 0), ) h3 = ParagraphStyle( "H3", parent=styles["Normal"], fontSize=10.5, textColor=MID_BLUE, fontName="Helvetica-Bold", spaceBefore=7, spaceAfter=3 ) body = ParagraphStyle( "Body", parent=styles["Normal"], fontSize=9.5, textColor=TEXT_DARK, fontName="Helvetica", leading=14, spaceAfter=4, alignment=TA_JUSTIFY ) bullet = ParagraphStyle( "Bullet", parent=styles["Normal"], fontSize=9.5, textColor=TEXT_DARK, fontName="Helvetica", leading=13, spaceAfter=2, leftIndent=14, bulletIndent=4 ) highlight_box = ParagraphStyle( "Highlight", parent=styles["Normal"], fontSize=9.5, textColor=DARK_BLUE, fontName="Helvetica-BoldOblique", leading=13, backColor=colors.HexColor("#fff8e1"), borderColor=ACCENT, borderWidth=1, borderPad=6, spaceAfter=6, spaceBefore=4 ) source_style = ParagraphStyle( "Source", parent=styles["Normal"], fontSize=7.5, textColor=colors.grey, fontName="Helvetica-Oblique", spaceAfter=2, leading=11 ) # ── Helper builders ────────────────────────────────────────────────────────── def hr(): return HRFlowable(width="100%", thickness=1, color=MID_BLUE, spaceAfter=6, spaceBefore=2) def section_header(text): # Blue pill header data = [[Paragraph(f" {text}", ParagraphStyle( "SH", parent=styles["Normal"], fontSize=13, textColor=colors.white, fontName="Helvetica-Bold", leading=16 ))]] t = Table(data, colWidths=[17*cm]) t.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,-1), MID_BLUE), ("ROUNDEDCORNERS", [4]), ("TOPPADDING", (0,0), (-1,-1), 6), ("BOTTOMPADDING", (0,0), (-1,-1), 6), ("LEFTPADDING", (0,0), (-1,-1), 10), ])) return t def sub_header(text): return Paragraph(f"<b><font color='#{DARK_BLUE.hexval()[2:]}'>▸ {text}</font></b>", h2) def bullet_item(text): return Paragraph(f"• {text}", bullet) def build_table(headers, rows, col_widths=None): header_row = [Paragraph(f"<b>{h}</b>", ParagraphStyle( "TH", parent=styles["Normal"], fontSize=8.5, textColor=colors.white, fontName="Helvetica-Bold", alignment=TA_CENTER, leading=12 )) for h in headers] body_rows = [] for i, row in enumerate(rows): styled = [Paragraph(str(cell), ParagraphStyle( "TD", parent=styles["Normal"], fontSize=8.5, textColor=TEXT_DARK, fontName="Helvetica", leading=12, alignment=TA_CENTER )) for cell in row] body_rows.append(styled) all_rows = [header_row] + body_rows if col_widths is None: col_widths = [17*cm / len(headers)] * len(headers) t = Table(all_rows, colWidths=col_widths, repeatRows=1) style_cmds = [ ("BACKGROUND", (0,0), (-1,0), TABLE_HEAD), ("TEXTCOLOR", (0,0), (-1,0), colors.white), ("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"), ("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#b0c8e0")), ("ROWBACKGROUNDS",(0,1), (-1,-1), [TABLE_ODD, TABLE_EVEN]), ("TOPPADDING", (0,0), (-1,-1), 5), ("BOTTOMPADDING", (0,0), (-1,-1), 5), ("LEFTPADDING", (0,0), (-1,-1), 6), ("VALIGN", (0,0), (-1,-1), "MIDDLE"), ] t.setStyle(TableStyle(style_cmds)) return t # ── Title Banner ───────────────────────────────────────────────────────────── def title_banner(): data = [[ Paragraph("TYROSINEMIA", title_style), Paragraph("Inborn Errors of Tyrosine Metabolism", subtitle_style), Paragraph("Clinical Overview | Orris Medical | 2026", ParagraphStyle( "BannerSub2", parent=styles["Normal"], fontSize=9, textColor=colors.HexColor("#a0c4e8"), fontName="Helvetica", alignment=TA_CENTER )) ]] # Transpose to rows inner = [ [Paragraph("TYROSINEMIA", title_style)], [Paragraph("Inborn Errors of Tyrosine Metabolism", subtitle_style)], [Paragraph("Clinical Overview | Orris Medical | July 2026", ParagraphStyle( "BS2", parent=styles["Normal"], fontSize=9, textColor=colors.HexColor("#a0c4e8"), fontName="Helvetica", alignment=TA_CENTER ))] ] t = Table(inner, colWidths=[17*cm]) t.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,-1), DARK_BLUE), ("TOPPADDING", (0,0), (-1,-1), 8), ("BOTTOMPADDING", (0,0), (-1,-1), 8), ("LEFTPADDING", (0,0), (-1,-1), 10), ("RIGHTPADDING", (0,0), (-1,-1), 10), ])) return t # ══════════════════════════════════════════════════════════════════════════════ # BUILD STORY # ══════════════════════════════════════════════════════════════════════════════ story = [] # TITLE story.append(title_banner()) story.append(Spacer(1, 10)) # INTRO story.append(section_header("Overview")) story.append(Spacer(1, 6)) story.append(Paragraph( "Tyrosinemia is a group of <b>autosomal recessive inborn errors of metabolism</b> " "characterised by defective degradation of the amino acid <b>tyrosine</b>. Three distinct " "types exist, each caused by a different enzymatic defect along the tyrosine catabolism pathway. " "Type I is the most severe, with life-threatening liver disease, renal tubulopathy, and risk of " "hepatocellular carcinoma (HCC). Early diagnosis via newborn screening and treatment with " "<b>NTBC (nitisinone)</b> has transformed outcomes dramatically.", body)) story.append(Spacer(1, 4)) # PATHWAY BOX pathway_data = [ [Paragraph("<b>Tyrosine Catabolism Pathway</b>", ParagraphStyle( "PH", parent=styles["Normal"], fontSize=10, textColor=DARK_BLUE, fontName="Helvetica-Bold", alignment=TA_CENTER ))], [Paragraph( "Phenylalanine → <b>Tyrosine</b> → 4-Hydroxyphenylpyruvate (blocked in TYR III: HPD)<br/>" "→ Homogentisate → Maleylacetoacetate → Fumarylacetoacetate (blocked in TYR I: FAH)<br/>" "→ Fumarate + Acetoacetate<br/><br/>" "<i>Tyrosine aminotransferase (TAT) - first step; blocked in TYR II</i>", ParagraphStyle("PB", parent=styles["Normal"], fontSize=9, textColor=TEXT_DARK, fontName="Helvetica", leading=14, alignment=TA_CENTER) )] ] pt = Table(pathway_data, colWidths=[17*cm]) pt.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,0), LIGHT_BLUE), ("BACKGROUND", (0,1), (-1,-1), colors.HexColor("#f5faff")), ("BOX", (0,0), (-1,-1), 1, BORDER_CLR), ("TOPPADDING", (0,0), (-1,-1), 7), ("BOTTOMPADDING", (0,0), (-1,-1), 7), ("LEFTPADDING", (0,0), (-1,-1), 12), ])) story.append(pt) story.append(Spacer(1, 10)) # ── TYPE I ────────────────────────────────────────────────────────────────── story.append(section_header("Type I - Hepatorenal Tyrosinemia (Most Severe)")) story.append(Spacer(1, 6)) story.append(sub_header("Enzyme Defect & Genetics")) story.append(bullet_item("<b>Enzyme:</b> Fumarylacetoacetate hydrolase (FAH) - terminal enzyme in tyrosine catabolism")) story.append(bullet_item("<b>Gene:</b> FAH | Inheritance: Autosomal recessive")) story.append(bullet_item("<b>Incidence:</b> ~1:100,000 worldwide; 1:1,800 in Saguenay-Lac Saint-Jean, Quebec (founder effect)")) story.append(Spacer(1, 4)) story.append(sub_header("Pathophysiology")) story.append(bullet_item("Fumarylacetoacetate and maleylacetoacetate accumulate and are <b>directly hepatotoxic</b>")) story.append(bullet_item("<b>Succinylacetone</b> accumulates - the pathognomonic marker of TYR1")) story.append(bullet_item("Succinylacetone inhibits <b>delta-aminolevulinate dehydratase (ALA dehydratase)</b>, causing buildup of 5-ALA and producing a <b>porphyria-like neurologic syndrome</b>")) story.append(bullet_item("Succinylacetone-induced Fanconi syndrome causes renal tubulopathy and hypophosphatemic rickets")) story.append(Spacer(1, 4)) story.append(sub_header("Clinical Features")) # Two-column layout for clinical features col1 = [ Paragraph("<b>Acute (< 6 months)</b>", h3), bullet_item("Acute liver failure"), bullet_item("Coagulopathy, hypoglycemia"), bullet_item("Hypoalbuminemia"), bullet_item("Neonatal cholestasis"), bullet_item("Mildly elevated transaminases (disproportionate to liver dysfunction - key clue!)"), Spacer(1, 6), Paragraph("<b>Neurologic Crises (Porphyria-like)</b>", h3), bullet_item("Painful paresthesias"), bullet_item("Autonomic dysfunction"), bullet_item("Progressive paralysis"), bullet_item("Respiratory depression (can be fatal)"), ] col2 = [ Paragraph("<b>Chronic (> 6 months)</b>", h3), bullet_item("Failure to thrive"), bullet_item("Hepatomegaly, cirrhosis"), bullet_item("Renal Fanconi syndrome: glycosuria, proteinuria, aminoaciduria, hyperphosphaturia"), bullet_item("Hypophosphatemic rickets"), bullet_item("Very elevated AFP for age"), Spacer(1, 6), Paragraph("<b>Cardiac</b>", h3), bullet_item("Cardiomyopathy in ~30% at diagnosis"), bullet_item("Interventricular septal hypertrophy (most common)"), bullet_item("Resolves with treatment in most cases"), ] clin_table = Table([[col1, col2]], colWidths=[8.3*cm, 8.3*cm]) clin_table.setStyle(TableStyle([ ("VALIGN", (0,0), (-1,-1), "TOP"), ("LEFTPADDING", (0,0), (-1,-1), 4), ("RIGHTPADDING", (0,0), (-1,-1), 4), ("LINEAFTER", (0,0), (0,-1), 0.5, colors.HexColor("#b0c8e0")), ])) story.append(clin_table) story.append(Spacer(1, 4)) story.append(sub_header("Hepatocellular Carcinoma Risk")) story.append(Paragraph( "<b>Very high risk for HCC</b> in untreated patients - can occur as early as <b>2 years of age</b>. " "All patients with TYR1 require regular AFP surveillance and imaging. " "HCC risk persists even with NTBC therapy (though markedly reduced).", body)) story.append(Spacer(1, 4)) story.append(sub_header("Liver Histology")) hist_items = [ "Macrovesicular steatosis", "Pseudoacinar rosette formation of hepatocytes (may contain bile plugs)", "Hemosiderosis", "Hepatocyte necrosis and apoptosis", "Fine diffuse fibrosis progressing to micronodular cirrhosis", "Regenerative nodules; frank HCC in advanced/untreated cases", ] for item in hist_items: story.append(bullet_item(item)) story.append(Spacer(1, 4)) story.append(sub_header("Diagnosis")) diag_data = [ ["Test", "Finding", "Notes"], ["Urine succinylacetone", "ELEVATED (pathognomonic)", "Gold standard; specific for TYR1"], ["Plasma tyrosine", "Elevated (nonspecific)", "Also elevated in TYR2, TYR3, liver disease, prematurity"], ["Serum AFP", "Markedly elevated for age", "Used for diagnosis and HCC monitoring"], ["FAH enzyme activity", "Deficient", "In red blood cells (research labs)"], ["Newborn screen", "Succinylacetone as primary marker", "Tyrosine alone is unreliable in neonates"], ["Urine organic acids", "Succinylacetone detected", "Routine metabolic workup"], ] story.append(build_table(diag_data[0], diag_data[1:], col_widths=[5*cm, 5.5*cm, 6.5*cm])) story.append(Spacer(1, 4)) story.append(sub_header("Treatment")) tx_items = [ ("<b>NTBC (nitisinone)</b>", "Inhibits 4-hydroxyphenylpyruvate dioxygenase (upstream of FAH). Blocks succinylacetone production - becomes undetectable in urine almost immediately. First-line therapy."), ("<b>Dietary restriction</b>", "Low phenylalanine and tyrosine diet. Does not prevent liver decompensation or cirrhosis alone, but benefits renal function. Monitored by plasma amino acids."), ("<b>Liver transplantation</b>", "Indicated for: (1) liver failure progressing despite NTBC, (2) development of HCC. Reverses hepatic abnormalities, prevents neurologic disease, stabilises renal disease."), ("<b>AFP monitoring</b>", "Serial AFP and liver imaging every 6 months for HCC surveillance, even on NTBC."), ] for title_tx, desc in tx_items: story.append(Paragraph(f"{title_tx}: {desc}", bullet)) story.append(Spacer(1, 4)) story.append(Paragraph( "HIGH-YIELD: NTBC works by blocking UPSTREAM of the enzyme defect, preventing synthesis " "of the toxic intermediates (fumarylacetoacetate, succinylacetone) rather than clearing them.", highlight_box)) # ── TYPE II ────────────────────────────────────────────────────────────────── story.append(Spacer(1, 6)) story.append(section_header("Type II - Oculocutaneous Tyrosinemia (Richner-Hanhart Syndrome)")) story.append(Spacer(1, 6)) story.append(sub_header("Enzyme Defect & Genetics")) story.append(bullet_item("<b>Enzyme:</b> Hepatic tyrosine aminotransferase (TAT) - first step of tyrosine catabolism")) story.append(bullet_item("<b>Gene:</b> TAT | Inheritance: Autosomal recessive")) story.append(Spacer(1, 4)) story.append(sub_header("Clinical Triad")) triad_data = [ ["System", "Features"], ["Ocular", "Lacrimation, photophobia, corneal erosions (crystalline tyrosine deposits)\nNeovascularization, corneal opacification. Onset 1st-2nd year."], ["Skin (Palmoplantar)", "Painful hyperkeratotic, erosive lesions on palms and soles\nWeight-bearing areas, tracks along dermatoglyphs; bullae possible"], ["Neurologic", "Mild-moderate intellectual disability in >50%\nSelf-mutilation, language defects, incoordination"], ] story.append(build_table(triad_data[0], triad_data[1:], col_widths=[4*cm, 13*cm])) story.append(Spacer(1, 4)) story.append(Paragraph( "CLINICAL PEARL: In any child with palmoplantar keratoderma + photophobia/tearing, " "consider Tyrosinemia Type II. Elevated serum tyrosine (>0.18 mM) confirms the diagnosis.", highlight_box)) story.append(sub_header("Diagnosis")) story.append(bullet_item("Markedly elevated serum and urine tyrosine")) story.append(bullet_item("No succinylacetone (distinguishes from TYR1)")) story.append(bullet_item("No liver disease")) story.append(Spacer(1, 4)) story.append(sub_header("Treatment")) story.append(bullet_item("Low-tyrosine, low-phenylalanine diet - improves/prevents eye and skin lesions")) story.append(bullet_item("Oral retinoids for skin lesions")) story.append(bullet_item("Must be started early - established intellectual disability may NOT reverse with diet")) story.append(Spacer(1, 6)) # ── TYPE III ────────────────────────────────────────────────────────────────── story.append(section_header("Type III - Tyrosinemia (HPD Deficiency)")) story.append(Spacer(1, 6)) story.append(sub_header("Enzyme Defect & Genetics")) story.append(bullet_item("<b>Enzyme:</b> 4-Hydroxyphenylpyruvate dioxygenase (HPD)")) story.append(bullet_item("<b>Gene:</b> HPD | Inheritance: Autosomal recessive")) story.append(bullet_item("Rarest of the three types")) story.append(Spacer(1, 4)) story.append(sub_header("Clinical Features")) story.append(bullet_item("Primarily neurologic: intellectual disability, seizures, ataxia")) story.append(bullet_item("Mild hypertyrosinemia")) story.append(bullet_item("NO liver involvement, NO eye involvement, NO renal involvement")) story.append(Spacer(1, 4)) story.append(sub_header("Treatment")) story.append(bullet_item("Low-tyrosine, low-phenylalanine diet")) story.append(Spacer(1, 10)) # ── COMPARISON TABLE ────────────────────────────────────────────────────────── story.append(section_header("Comparison of Tyrosinemia Types")) story.append(Spacer(1, 6)) comp_headers = ["Feature", "Type I (TYR1)", "Type II (TYR2)", "Type III (TYR3)"] comp_rows = [ ["Enzyme defect", "FAH", "TAT", "HPD"], ["Gene", "FAH", "TAT", "HPD"], ["Diagnostic marker", "Succinylacetone (urine)", "Elevated serum tyrosine", "Elevated serum tyrosine"], ["Liver disease", "Severe (cirrhosis, HCC)", "None", "None"], ["Renal (Fanconi)", "Yes", "No", "No"], ["Eye findings", "No", "Yes (corneal erosions)", "No"], ["Skin", "No", "Yes (palmoplantar keratosis)", "No"], ["Neurology", "Porphyria-like crises", "Mild intellectual disability", "ID, seizures, ataxia"], ["HCC risk", "Very high", "None", "None"], ["Key treatment", "NTBC + diet ± liver Tx", "Low-Tyr/Phe diet ± retinoids", "Low-Tyr/Phe diet"], ] # Custom widths for this table comp_widths = [4.2*cm, 4.3*cm, 4.3*cm, 4.3*cm] story.append(build_table(comp_headers, comp_rows, col_widths=comp_widths)) story.append(Spacer(1, 10)) # ── HIGH-YIELD SUMMARY ──────────────────────────────────────────────────────── story.append(section_header("High-Yield Exam Points")) story.append(Spacer(1, 6)) hye = [ ("Disproportionate liver dysfunction", "Transaminases are only mildly elevated despite severe liver failure in TYR1 - a classic exam clue"), ("Succinylacetone = diagnostic for TYR1", "Not elevated in any other cause of hypertyrosinemia; gold standard diagnostic test"), ("NTBC mechanism", "Blocks 4-HPD (upstream of FAH), preventing synthesis of toxic intermediates - succinylacetone disappears from urine almost immediately"), ("AFP monitoring", "Markedly elevated at diagnosis; serial monitoring mandatory for HCC surveillance even on NTBC"), ("Neurologic crisis mechanism", "Succinylacetone inhibits ALA dehydratase -> ALA accumulation -> porphyria-like presentation"), ("Quebec founder effect", "1:1,800 incidence in Saguenay-Lac Saint-Jean due to a single FAH mutation"), ("Newborn screening", "Succinylacetone is the primary NBS marker (tyrosine alone is unreliable in newborn period)"), ("Cardiomyopathy", "30% of TYR1 at diagnosis; resolves with NTBC treatment"), ("TYR2 triad", "Corneal erosions + palmoplantar keratoderma + intellectual disability = Richner-Hanhart syndrome"), ("Diet alone insufficient in TYR1", "Dietary restriction does not prevent liver decompensation or cirrhosis - NTBC is essential"), ] for i, (point, detail) in enumerate(hye): bg = TABLE_ODD if i % 2 == 0 else TABLE_EVEN row_data = [[ Paragraph(f"<b>{point}</b>", ParagraphStyle("HYH", parent=styles["Normal"], fontSize=9, textColor=DARK_BLUE, fontName="Helvetica-Bold", leading=12)), Paragraph(detail, ParagraphStyle("HYD", parent=styles["Normal"], fontSize=9, textColor=TEXT_DARK, fontName="Helvetica", leading=12)) ]] t = Table(row_data, colWidths=[5.5*cm, 11.5*cm]) t.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,-1), bg), ("TOPPADDING", (0,0), (-1,-1), 5), ("BOTTOMPADDING",(0,0), (-1,-1), 5), ("LEFTPADDING", (0,0), (-1,-1), 8), ("GRID", (0,0), (-1,-1), 0.3, colors.HexColor("#b0c8e0")), ("VALIGN", (0,0), (-1,-1), "TOP"), ])) story.append(t) story.append(Spacer(1, 12)) # ── SOURCES ─────────────────────────────────────────────────────────────────── story.append(hr()) story.append(Paragraph("<b>Sources</b>", ParagraphStyle("SrcH", parent=styles["Normal"], fontSize=9, textColor=DARK_BLUE, fontName="Helvetica-Bold"))) sources = [ "Yamada's Textbook of Gastroenterology, 7th Edition", "Tietz Textbook of Laboratory Medicine, 7th Edition", "Adams and Victor's Principles of Neurology, 12th Edition", "Andrews' Diseases of the Skin - Clinical Dermatology", "Sleisenger and Fordtran's Gastrointestinal and Liver Disease", "Brenner and Rector's The Kidney, 2-Volume Set", ] for s in sources: story.append(Paragraph(f"• {s}", source_style)) story.append(Spacer(1, 6)) story.append(Paragraph("Generated by Orris Medical AI | July 2026 | For educational use only.", ParagraphStyle("Footer", parent=styles["Normal"], fontSize=7.5, textColor=colors.grey, fontName="Helvetica-Oblique", alignment=TA_CENTER))) # ── Build ───────────────────────────────────────────────────────────────────── doc.build(story) print(f"PDF generated: {OUTPUT}") PYEOF python3 /home/daytona/workspace/tyrosinemia-pdf/generate.py
Tyrosinemia
PDF Document · PDF