Placental site trophoblastic tumors and make detail s p df
"placental site trophoblastic tumor" diagnosis treatment
PMID: 39322463
PMID: 40631439
ls /home/daytona/workspace/ 2>/dev/null && echo "---" && python3 -c "import reportlab; print('reportlab ok')" && python3 -c "from reportlab.lib.pagesizes import A4; print('A4 ok')"
mkdir -p /home/daytona/workspace/pstt-pdf && cat > /home/daytona/workspace/pstt-pdf/generate_pstt_pdf.py << 'PYEOF' import json, subprocess, base64, os from reportlab.lib.pagesizes import A4 from reportlab.lib import colors from reportlab.lib.units import cm, inch from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY from reportlab.platypus import ( SimpleDocTemplate, Paragraph, Spacer, PageBreak, Table, TableStyle, HRFlowable, KeepTogether, Image as RLImage ) from reportlab.platypus.flowables import Flowable from io import BytesIO # ─────────────────────────── FETCH IMAGES ────────────────────────────── PSTT_IMG_URL = "https://cdn.orris.care/cdss_images/14fb32cbf36336574acbe251c556abd3bc7b02ab42bc8712e8e828b6dfedb4f4.png" ETT_IMG_URL = "https://cdn.orris.care/cdss_images/b349711420534a6bff3574bf9c624529e770437ed42b21350141257127bfeab0.png" def fetch_image_bytes(url): try: result = json.loads(subprocess.check_output( ["node", "/home/daytona/skills/shared/scripts/fetch_images.js", url], timeout=30 )) if result and result[0]["base64"]: raw = base64.b64decode(result[0]["base64"].split(",")[1]) return BytesIO(raw) except Exception as e: print(f"Image fetch failed for {url}: {e}") return None pstt_img_data = fetch_image_bytes(PSTT_IMG_URL) ett_img_data = fetch_image_bytes(ETT_IMG_URL) # ─────────────────────────── DOCUMENT SETUP ──────────────────────────── OUTPUT = "/home/daytona/workspace/pstt-pdf/PSTT_Detailed_Review.pdf" doc = SimpleDocTemplate( OUTPUT, pagesize=A4, rightMargin=2*cm, leftMargin=2*cm, topMargin=2.2*cm, bottomMargin=2.2*cm, title="Placental Site Trophoblastic Tumor - Detailed Review", author="Orris Medical Library" ) W, H = A4 # ─────────────────────────── STYLES ──────────────────────────────────── styles = getSampleStyleSheet() TITLE_STYLE = ParagraphStyle( "CoverTitle", fontName="Helvetica-Bold", fontSize=26, leading=32, textColor=colors.HexColor("#1a3a5c"), alignment=TA_CENTER, spaceAfter=8, ) SUBTITLE_STYLE = ParagraphStyle( "CoverSub", fontName="Helvetica", fontSize=13, leading=18, textColor=colors.HexColor("#4a7cb5"), alignment=TA_CENTER, spaceAfter=4, ) H1 = ParagraphStyle( "H1", fontName="Helvetica-Bold", fontSize=16, leading=20, textColor=colors.HexColor("#1a3a5c"), spaceBefore=18, spaceAfter=6, borderPad=4, ) H2 = ParagraphStyle( "H2", fontName="Helvetica-Bold", fontSize=13, leading=17, textColor=colors.HexColor("#2e6da4"), spaceBefore=12, spaceAfter=4, ) H3 = ParagraphStyle( "H3", fontName="Helvetica-BoldOblique", fontSize=11, leading=15, textColor=colors.HexColor("#3d5a80"), spaceBefore=8, spaceAfter=3, ) BODY = ParagraphStyle( "Body", fontName="Helvetica", fontSize=10.5, leading=15.5, textColor=colors.HexColor("#222222"), alignment=TA_JUSTIFY, spaceAfter=6, ) BULLET = ParagraphStyle( "Bullet", fontName="Helvetica", fontSize=10.5, leading=15, textColor=colors.HexColor("#222222"), leftIndent=16, firstLineIndent=-10, spaceBefore=2, spaceAfter=2, ) CAPTION = ParagraphStyle( "Caption", fontName="Helvetica-Oblique", fontSize=9, leading=12, textColor=colors.HexColor("#555555"), alignment=TA_CENTER, spaceAfter=8, spaceBefore=4, ) SOURCE = ParagraphStyle( "Source", fontName="Helvetica-Oblique", fontSize=8.5, leading=11, textColor=colors.HexColor("#777777"), spaceBefore=2, spaceAfter=2, ) BOX_TITLE = ParagraphStyle( "BoxTitle", fontName="Helvetica-Bold", fontSize=11, leading=14, textColor=colors.white, alignment=TA_CENTER, spaceAfter=2, ) KEY_POINT = ParagraphStyle( "KeyPoint", fontName="Helvetica-Bold", fontSize=10.5, leading=14, textColor=colors.HexColor("#1a3a5c"), leftIndent=10, ) def hr(): return HRFlowable(width="100%", thickness=0.5, color=colors.HexColor("#aac4e0"), spaceAfter=4, spaceBefore=4) def blue_box(title, items): """Colored key-points box.""" content = [[Paragraph(title, BOX_TITLE)]] for item in items: content.append([Paragraph(f"• {item}", ParagraphStyle( "bi", fontName="Helvetica", fontSize=10, leading=14, textColor=colors.HexColor("#1a3a5c"), leftIndent=8, spaceAfter=2 ))]) tbl = Table(content, colWidths=[doc.width]) tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,0), colors.HexColor("#1a3a5c")), ("BACKGROUND", (0,1), (-1,-1), colors.HexColor("#e8f0fb")), ("BOX", (0,0), (-1,-1), 1, colors.HexColor("#2e6da4")), ("INNERGRID", (0,0), (-1,-1), 0.25, colors.HexColor("#aac4e0")), ("TOPPADDING", (0,0), (-1,-1), 6), ("BOTTOMPADDING", (0,0), (-1,-1), 5), ("LEFTPADDING", (0,0), (-1,-1), 10), ])) return tbl def image_flow(data, width_cm=14, caption=""): elems = [] if data: data.seek(0) img = RLImage(data, width=width_cm*cm, height=width_cm*cm*0.75) img.hAlign = "CENTER" elems.append(img) if caption: elems.append(Paragraph(caption, CAPTION)) return elems # ─────────────────────────── CONTENT ─────────────────────────────────── story = [] # ── COVER PAGE ── story.append(Spacer(1, 2.5*cm)) story.append(Paragraph("Placental Site Trophoblastic Tumor", TITLE_STYLE)) story.append(Paragraph("(PSTT)", TITLE_STYLE)) story.append(Spacer(1, 0.5*cm)) story.append(Paragraph("A Detailed Clinical & Pathological Review", SUBTITLE_STYLE)) story.append(Spacer(1, 0.4*cm)) story.append(HRFlowable(width="80%", thickness=2, color=colors.HexColor("#2e6da4"))) story.append(Spacer(1, 0.4*cm)) story.append(Paragraph("Including Epithelioid Trophoblastic Tumor (ETT)", SUBTITLE_STYLE)) story.append(Spacer(1, 1.2*cm)) cover_data = [ ["Sources:", "Robbins & Kumar Basic Pathology (10th ed.)"], ["", "Robbins, Cotran & Kumar Pathologic Basis of Disease (10th ed.)"], ["", "Berek & Novak's Gynecology (16th ed.)"], ["PubMed:", "Wang V et al., Hematol Oncol Clin North Am 2024"], ["", "Ngan HYS et al., Int J Gynaecol Obstet 2025"], ["Date:", "July 2026"], ] cover_tbl = Table(cover_data, colWidths=[3*cm, 13*cm]) cover_tbl.setStyle(TableStyle([ ("FONTNAME", (0,0), (0,-1), "Helvetica-Bold"), ("FONTNAME", (1,0), (1,-1), "Helvetica"), ("FONTSIZE", (0,0), (-1,-1), 10), ("TEXTCOLOR", (0,0), (0,-1), colors.HexColor("#1a3a5c")), ("VALIGN", (0,0), (-1,-1), "TOP"), ("TOPPADDING", (0,0), (-1,-1), 4), ("BOTTOMPADDING", (0,0), (-1,-1), 4), ("BACKGROUND", (0,0), (-1,-1), colors.HexColor("#f0f6ff")), ("BOX", (0,0), (-1,-1), 0.5, colors.HexColor("#aac4e0")), ])) story.append(cover_tbl) story.append(PageBreak()) # ── TABLE OF CONTENTS ── story.append(Paragraph("Table of Contents", H1)) story.append(hr()) toc_items = [ ("1.", "Overview and Classification"), ("2.", "Epidemiology and Incidence"), ("3.", "Pathogenesis and Cell of Origin"), ("4.", "Clinical Presentation"), ("5.", "Gross and Microscopic Pathology"), ("6.", "Immunohistochemistry"), ("7.", "Tumor Markers (hCG and hPL)"), ("8.", "Differential Diagnosis"), ("9.", "Epithelioid Trophoblastic Tumor (ETT)"), ("10.", "FIGO Staging"), ("11.", "WHO Risk Scoring"), ("12.", "Management - Surgery"), ("13.", "Management - Chemotherapy"), ("14.", "Prognosis and Outcome"), ("15.", "Fertility-Sparing Options"), ("16.", "Follow-Up and Surveillance"), ("17.", "Key Points Summary"), ("18.", "References"), ] for num, text in toc_items: story.append(Paragraph(f"<b>{num}</b> {text}", BULLET)) story.append(PageBreak()) # ── SECTION 1: OVERVIEW ── story.append(Paragraph("1. Overview and Classification", H1)) story.append(hr()) story.append(Paragraph( "Gestational trophoblastic disease (GTD) encompasses a spectrum of tumors and tumor-like conditions " "characterized by proliferation of placental tissue - either villous or trophoblastic. The major disorders " "are: hydatidiform mole (complete and partial), invasive mole, gestational choriocarcinoma, <b>placental " "site trophoblastic tumor (PSTT)</b>, and epithelioid trophoblastic tumor (ETT). All elaborate human " "chorionic gonadotropins (hCG) to varying degrees.", BODY )) story.append(Paragraph( "PSTT and ETT are uncommon but clinically important variants of gestational trophoblastic neoplasia (GTN) " "that consist predominantly of <b>intermediate trophoblast</b>. They are biologically and clinically distinct " "from choriocarcinoma - they are relatively insensitive to chemotherapy, rarely produce high hCG levels, " "and are primarily managed with surgery.", BODY )) story.append(Spacer(1, 0.3*cm)) story.append(blue_box("Classification of GTD", [ "Hydatidiform Mole: Complete (diploid) and Partial (triploid)", "Invasive Mole - myometrial invasion by molar villi", "Gestational Choriocarcinoma - highly malignant, hCG-producing", "Placental Site Trophoblastic Tumor (PSTT) - intermediate trophoblast", "Epithelioid Trophoblastic Tumor (ETT) - mononuclear trophoblasts", ])) story.append(Spacer(1, 0.3*cm)) # ── SECTION 2: EPIDEMIOLOGY ── story.append(Paragraph("2. Epidemiology and Incidence", H1)) story.append(hr()) story.append(Paragraph( "PSTT is a rare neoplasm, comprising <b>less than 2%</b> of all gestational trophoblastic neoplasms. " "It can follow any type of antecedent pregnancy:", BODY )) for item in [ "Normal term pregnancy - approximately 50% of cases", "Spontaneous abortion", "Hydatidiform mole (less commonly than after normal pregnancy)", "Ectopic pregnancy (rare)", ]: story.append(Paragraph(f"• {item}", BULLET)) story.append(Spacer(1, 0.2*cm)) story.append(Paragraph( "It typically presents months to years after the antecedent pregnancy - in some cases up to several " "years later. This long latency is clinically important, as patients or clinicians may not initially " "connect symptoms to a prior pregnancy. Cases diagnosed <b>48 months or more</b> from the antecedent " "pregnancy are classified as high-risk.", BODY )) # ── SECTION 3: PATHOGENESIS ── story.append(Paragraph("3. Pathogenesis and Cell of Origin", H1)) story.append(hr()) story.append(Paragraph( "PSTT arises from <b>extravillous (intermediate) trophoblasts</b> - cells that normally proliferate and " "migrate from the cytotrophoblast of the placenta and invade the maternal decidua and myometrium. These " "cells have features overlapping with both cytotrophoblasts and syncytiotrophoblasts.", BODY )) story.append(Paragraph( "Unlike syncytiotrophoblasts (which produce large amounts of hCG), intermediate trophoblasts produce " "<b>human placental lactogen (hPL)</b> as their primary secretory product. This explains the characteristic " "low or only mildly elevated serum hCG levels in PSTT - a key distinguishing feature from choriocarcinoma.", BODY )) story.append(Paragraph( "Cytogenetics: PSTT tumors are typically <b>diploid</b>, often with XX karyotype. Molecular studies show " "paternal DNA contribution (consistent with gestational origin). These tumors are capable of invading smooth " "muscle fibers and maternal vessels without causing the hemorrhage or necrosis typical of choriocarcinoma - " "reflecting the normal invasive capacity of intermediate trophoblasts.", BODY )) story.append(Spacer(1, 0.3*cm)) # ── SECTION 4: CLINICAL PRESENTATION ── story.append(Paragraph("4. Clinical Presentation", H1)) story.append(hr()) story.append(Paragraph( "The most common presenting symptoms are:", BODY )) for item in [ "Irregular or abnormal uterine bleeding (most common symptom)", "Amenorrhea - often misinterpreted as pregnancy", "Uterine enlargement / palpable uterine mass", "Mildly elevated or normal serum hCG (unlike choriocarcinoma where hCG is markedly elevated)", "Virilization (rare) - due to testosterone production", "Nephrotic syndrome (rare paraneoplastic manifestation)", "Symptoms of metastatic disease: dyspnea, hemoptysis, neurological symptoms (late)", ]: story.append(Paragraph(f"• {item}", BULLET)) story.append(Spacer(1, 0.2*cm)) story.append(Paragraph( "The interval from antecedent pregnancy to diagnosis ranges from a few months to many years. " "Metastasis is a late feature; the tumor tends to remain confined to the uterus for a prolonged " "period. When spread does occur, common sites include:", BODY )) for site in ["Lungs (most common extrauterine site)", "Liver", "Lymph nodes", "Peritoneum", "Brain (rare)"]: story.append(Paragraph(f"• {site}", BULLET)) story.append(Spacer(1, 0.3*cm)) # ── SECTION 5: PATHOLOGY ── story.append(Paragraph("5. Gross and Microscopic Pathology", H1)) story.append(hr()) story.append(Paragraph("<b>Gross Pathology</b>", H2)) story.append(Paragraph( "PSTT typically presents as a discrete, soft, tan-yellow to white uterine mass arising from the " "implantation site. The tumors may be polypoid, projecting into the uterine cavity, or may diffusely " "infiltrate the myometrium. Hemorrhage and necrosis are less prominent compared to choriocarcinoma. " "Tumor perforation of the myometrium can cause intraperitoneal bleeding.", BODY )) story.append(Paragraph("<b>Microscopic Pathology</b>", H2)) story.append(Paragraph( "Histologically, PSTT is composed of <b>polygonal mononuclear or binucleated extravillous trophoblasts</b> " "with abundant eosinophilic to clear cytoplasm. Key microscopic features include:", BODY )) for feat in [ "Sheets and cords of intermediate trophoblasts infiltrating between smooth muscle fibers (\"splay-apart\" pattern)", "Characteristic invasion of vessel walls - replacing endothelium (vascular invasion without destruction)", "Fibrinoid material deposited around tumor cells", "Absent chorionic villi (distinguishes from invasive mole)", "Low mitotic rate in typical/indolent cases; high mitotic rate in aggressive cases (>5 mitoses/10 HPF is adverse)", "Mononuclear cells predominate (unlike choriocarcinoma's biphasic pattern)", "May show clear cell change, rare giant cells", ]: story.append(Paragraph(f"• {feat}", BULLET)) story.append(Spacer(1, 0.4*cm)) # Images if pstt_img_data: story.extend(image_flow( pstt_img_data, width_cm=13, caption="Fig. 1 - PSTT Histology: Markedly atypical trophoblasts splaying apart smooth muscle fibers " "as they invade the myometrium. (Robbins, Cotran & Kumar Pathologic Basis of Disease, Fig. 22.57)" )) story.append(PageBreak()) # ── SECTION 6: IHC ── story.append(Paragraph("6. Immunohistochemistry (IHC)", H1)) story.append(hr()) story.append(Paragraph( "IHC is essential for diagnosis, particularly to distinguish PSTT from other trophoblastic and " "non-trophoblastic tumors. The characteristic IHC profile reflects the intermediate trophoblast origin:", BODY )) ihc_data = [ ["Marker", "PSTT", "ETT", "Choriocarcinoma", "Comment"], ["hPL", "Strong +", "Focal +", "Weak/negative", "Most characteristic for PSTT"], ["hCG", "Focal +", "Focal +", "Diffuse +", "Low-level; key distinguisher"], ["Mel-CAM (CD146)", "Strong +", "+/-", "+", "Intermediate trophoblast marker"], ["MUC4", "+", "+", "+", "Trophoblast marker"], ["p63", "Negative", "Strong +", "Negative", "Distinguishes ETT from PSTT"], ["Cyclin E", "+", "Strong +", "+/-", "Cell cycle marker"], ["Ki-67 (MIB-1)", "Variable", "Variable", "High", "Proliferation index"], ["Inhibin-alpha", "+/-", "+/-", "+", "Trophoblast marker"], ["CD10", "Focal", "Focal", "+/-", ""], ["EMA (MUC1)", "+", "+", "+/-", "Epithelial marker"], ] ihc_tbl = Table(ihc_data, colWidths=[3.5*cm, 2.5*cm, 2.5*cm, 3.5*cm, 5.5*cm]) ihc_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,0), colors.HexColor("#1a3a5c")), ("TEXTCOLOR", (0,0), (-1,0), colors.white), ("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"), ("FONTNAME", (0,1), (-1,-1), "Helvetica"), ("FONTSIZE", (0,0), (-1,-1), 9), ("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.white, colors.HexColor("#f0f6ff")]), ("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#aac4e0")), ("VALIGN", (0,0), (-1,-1), "MIDDLE"), ("TOPPADDING", (0,0), (-1,-1), 5), ("BOTTOMPADDING", (0,0), (-1,-1), 5), ("LEFTPADDING", (0,0), (-1,-1), 6), ])) story.append(ihc_tbl) story.append(Paragraph("IHC profile of PSTT versus related tumors. hPL = human placental lactogen; hCG = human chorionic gonadotropin.", CAPTION)) story.append(Spacer(1, 0.3*cm)) # ── SECTION 7: TUMOR MARKERS ── story.append(Paragraph("7. Tumor Markers: hCG and hPL", H1)) story.append(hr()) story.append(Paragraph( "<b>Human Chorionic Gonadotropin (hCG):</b> Unlike choriocarcinoma (where hCG is markedly elevated), " "PSTT produces only small amounts of hCG relative to tumor mass. Serum hCG may be <b>normal or only " "mildly elevated</b>. This makes hCG unreliable as the sole screening/monitoring marker for PSTT. " "Importantly, WHO risk scoring (based on hCG level) does <b>not</b> apply to PSTT/ETT.", BODY )) story.append(Paragraph( "<b>Human Placental Lactogen (hPL):</b> The primary secretory product of PSTT. Serum and tissue " "hPL levels may be elevated and can be used for monitoring treatment response. IHC staining for " "hPL is characteristically strong and diffuse in PSTT.", BODY )) story.append(Paragraph( "<b>Free beta-hCG and hyperglycosylated hCG:</b> Some centers measure these subforms for improved " "sensitivity in monitoring. Regular hCG follow-up remains required post-treatment despite its limited " "sensitivity as a standalone tumor marker in PSTT.", BODY )) story.append(Spacer(1, 0.3*cm)) # ── SECTION 8: DIFFERENTIAL DIAGNOSIS ── story.append(Paragraph("8. Differential Diagnosis", H1)) story.append(hr()) dd_data = [ ["Condition", "Key Distinguishing Features"], ["Choriocarcinoma", "Biphasic cytotrophoblast + syncytiotrophoblast, markedly elevated hCG, necrosis/hemorrhage, hPL negative"], ["Epithelioid Trophoblastic Tumor (ETT)", "p63 positive, cyclin E strong, geographic necrosis, hyaline material, tends to be cervical"], ["Exaggerated placental site", "Normal intermediate trophoblasts, NO atypia, no mitoses, benign course - not a neoplasm"], ["Placental site nodule", "Small, well-circumscribed, hyalinized - benign incidental finding"], ["Epithelioid smooth muscle tumor (PEComa)", "Desmin/SMA positive, HMB-45 positive, hPL negative, trophoblast markers negative"], ["Endometrial carcinoma", "EMA positive, cytokeratin patterns differ, trophoblast markers negative"], ["Poorly differentiated carcinoma", "Clinical history, p40/p63 pattern, trophoblast markers negative"], ] dd_tbl = Table(dd_data, colWidths=[5*cm, 12*cm]) dd_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,0), colors.HexColor("#2e6da4")), ("TEXTCOLOR", (0,0), (-1,0), colors.white), ("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"), ("FONTNAME", (0,1), (-1,-1), "Helvetica"), ("FONTSIZE", (0,0), (-1,-1), 9), ("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.white, colors.HexColor("#f0f6ff")]), ("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#aac4e0")), ("VALIGN", (0,0), (-1,-1), "TOP"), ("TOPPADDING", (0,0), (-1,-1), 5), ("BOTTOMPADDING", (0,0), (-1,-1), 5), ("LEFTPADDING", (0,0), (-1,-1), 6), ("WORDWRAP", (0,0), (-1,-1), True), ])) story.append(dd_tbl) story.append(Spacer(1, 0.4*cm)) story.append(PageBreak()) # ── SECTION 9: ETT ── story.append(Paragraph("9. Epithelioid Trophoblastic Tumor (ETT)", H1)) story.append(hr()) story.append(Paragraph( "ETT is a distinct neoplasm of <b>mononuclear trophoblast cells</b>, most commonly arising from " "chorionic-type intermediate trophoblasts. It is even rarer than PSTT and shares some clinical " "and pathological features but is considered a separate entity.", BODY )) story.append(Paragraph("<b>Clinical Features</b>", H2)) for item in [ "Presents after any type of antecedent pregnancy, often with amenorrhea or abnormal bleeding", "Most commonly intrauterine (fundal or lower uterine segment) or cervical location", "Extrauterine tumors occur (cervix, lung)", "Low/mildly elevated hCG (similar to PSTT)", "Capable of metastasis - most commonly to lungs and bone", "Approximately 10-15% of patients with metastatic ETT die of disease", ]: story.append(Paragraph(f"• {item}", BULLET)) story.append(Paragraph("<b>Pathology of ETT vs PSTT</b>", H2)) story.append(Paragraph( "ETT lacks the overt invasive features of PSTT. Key histological features include:", BODY )) for item in [ "Sheets of mononuclear cells with clear to eosinophilic cytoplasm", "Characteristic hyaline (pink) material - resembling keratin pearls", "Geographic (map-like) necrosis", "p63 positive - key IHC distinguisher from PSTT", "Cyclin E strong and diffuse", "hPL only focally positive (versus strong/diffuse in PSTT)", ]: story.append(Paragraph(f"• {item}", BULLET)) story.append(Spacer(1, 0.4*cm)) if ett_img_data: story.extend(image_flow( ett_img_data, width_cm=13, caption="Fig. 2 - ETT Histology: Sheets of mononuclear trophoblasts, many with clear cytoplasm, " "associated with characteristic pink hyaline material (lower right). " "(Robbins, Cotran & Kumar Pathologic Basis of Disease, Fig. 22.58)" )) story.append(Spacer(1, 0.3*cm)) # ── SECTION 10: FIGO STAGING ── story.append(Paragraph("10. FIGO Staging of GTN (Applied to PSTT/ETT)", H1)) story.append(hr()) story.append(Paragraph( "PSTT and ETT are staged using the FIGO anatomical staging system (same as other GTN). " "Note that the <b>WHO prognostic scoring system does NOT apply</b> to PSTT/ETT - stage and " "interval from antecedent pregnancy are the primary prognostic determinants.", BODY )) figo_data = [ ["FIGO Stage", "Definition"], ["Stage I", "Disease confined to the uterus"], ["Stage II", "GTN extends outside the uterus but is limited to the genital structures " "(adnexa, vagina, broad ligament)"], ["Stage III", "GTN extends to the lungs with or without known genital tract involvement"], ["Stage IV", "All other metastatic sites (brain, liver, kidney, GI tract, spleen)"], ] figo_tbl = Table(figo_data, colWidths=[4*cm, 13*cm]) figo_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,0), colors.HexColor("#1a3a5c")), ("TEXTCOLOR", (0,0), (-1,0), colors.white), ("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"), ("FONTNAME", (0,1), (-1,-1), "Helvetica"), ("FONTNAME", (0,1), (0,-1), "Helvetica-Bold"), ("FONTSIZE", (0,0), (-1,-1), 10), ("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.white, colors.HexColor("#f0f6ff")]), ("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#aac4e0")), ("VALIGN", (0,0), (-1,-1), "MIDDLE"), ("TOPPADDING", (0,0), (-1,-1), 7), ("BOTTOMPADDING", (0,0), (-1,-1), 7), ("LEFTPADDING", (0,0), (-1,-1), 8), ])) story.append(figo_tbl) story.append(Spacer(1, 0.3*cm)) story.append(Paragraph( "<b>High-risk PSTT/ETT is defined as:</b>", H3 )) for item in [ "Advanced stage (Stage II, III, or IV)", "Interval of 48 months or more from antecedent pregnancy to diagnosis", "High mitotic rate (>5 mitoses/10 HPF in some classifications)", "Deep myometrial invasion", ]: story.append(Paragraph(f"• {item}", BULLET)) story.append(PageBreak()) # ── SECTION 11: WHO SCORING ── story.append(Paragraph("11. WHO Risk Scoring - Why It Does NOT Apply to PSTT", H1)) story.append(hr()) story.append(Paragraph( "The WHO/FIGO prognostic scoring system (used for choriocarcinoma and other GTN to guide " "single-agent vs. multi-agent chemotherapy selection) uses hCG level as one of its primary " "parameters. Since PSTT/ETT produce very low hCG, this scoring system is <b>not applicable</b>.", BODY )) story.append(Paragraph( "The key prognostic factors specific to PSTT/ETT are:", BODY )) prognosis_data = [ ["Factor", "Low Risk", "High Risk"], ["FIGO Stage", "Stage I", "Stage II-IV"], ["Interval from pregnancy", "< 48 months", ">= 48 months"], ["Mitotic index", "Low (<5/10 HPF)", "High (>5/10 HPF)"], ["Myometrial invasion", "Superficial", "Deep / transmural"], ["Lymph node involvement", "Absent", "Present"], ["Distant metastases", "Absent", "Present"], ] prog_tbl = Table(prognosis_data, colWidths=[5*cm, 5.5*cm, 5.5*cm]) prog_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,0), colors.HexColor("#1a3a5c")), ("TEXTCOLOR", (0,0), (-1,0), colors.white), ("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"), ("FONTNAME", (0,1), (-1,-1), "Helvetica"), ("FONTNAME", (0,1), (0,-1), "Helvetica-Bold"), ("FONTSIZE", (0,0), (-1,-1), 10), ("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.white, colors.HexColor("#f0f6ff")]), ("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#aac4e0")), ("VALIGN", (0,0), (-1,-1), "MIDDLE"), ("TOPPADDING", (0,0), (-1,-1), 6), ("BOTTOMPADDING", (0,0), (-1,-1), 6), ("LEFTPADDING", (0,0), (-1,-1), 8), ("TEXTCOLOR", (1,1), (1,-1), colors.HexColor("#2d7a2d")), ("TEXTCOLOR", (2,1), (2,-1), colors.HexColor("#b52b2b")), ])) story.append(prog_tbl) story.append(Spacer(1, 0.3*cm)) # ── SECTION 12: MANAGEMENT - SURGERY ── story.append(Paragraph("12. Management: Surgery (Primary Treatment)", H1)) story.append(hr()) story.append(Paragraph( "Surgery is the <b>cornerstone of PSTT/ETT management</b>, in contrast to other GTN where " "chemotherapy is primary. PSTT/ETT are relatively chemoresistant, making complete surgical " "resection the most important treatment modality.", BODY )) story.append(Paragraph("<b>Standard Surgical Approach</b>", H2)) for item in [ "Total hysterectomy - standard treatment for Stage I disease", "Bilateral salpingo-oophorectomy - considered in postmenopausal women; not mandatory in young women", "Pelvic lymphadenectomy - indicated when lymph node involvement is suspected", "Surgical staging - thorough exploration of abdomen and pelvis", "Resection of metastatic foci (e.g., pulmonary metastasectomy) - considered for isolated, resectable disease", ]: story.append(Paragraph(f"• {item}", BULLET)) story.append(Paragraph("<b>Surgical Outcomes</b>", H2)) story.append(Paragraph( "Patients with localized disease (Stage I) have a good prognosis with surgical removal alone. " "Hysterectomy is curative in the majority of Stage I patients. The 5-year overall survival for " "Stage I PSTT approaches 90-100%, while Stage IV disease has poor survival despite aggressive treatment.", BODY )) story.append(Spacer(1, 0.3*cm)) # ── SECTION 13: CHEMOTHERAPY ── story.append(Paragraph("13. Management: Chemotherapy", H1)) story.append(hr()) story.append(Paragraph( "Unlike choriocarcinoma, PSTT/ETT are <b>relatively insensitive to single-agent chemotherapy</b>. " "Multi-agent regimens are used for high-risk or metastatic disease, usually in combination with surgery.", BODY )) story.append(Paragraph("<b>Indications for Chemotherapy</b>", H2)) for item in [ "Stage II-IV disease", "Interval >= 48 months from antecedent pregnancy", "Residual disease after surgery", "High-risk pathological features (high mitotic rate, deep invasion)", "Recurrent disease", ]: story.append(Paragraph(f"• {item}", BULLET)) story.append(Paragraph("<b>Preferred Chemotherapy Regimens</b>", H2)) chemo_data = [ ["Regimen", "Drugs", "Notes"], ["EMA-CO", "Etoposide, Methotrexate, Actinomycin D,\nCyclophosphamide, Vincristine", "Most commonly used multi-agent regimen"], ["EMA-EP", "Etoposide, Methotrexate, Actinomycin D,\nEtoposide, Cisplatin", "For EMA-CO resistant/high-risk cases"], ["TP/TE", "Paclitaxel + Cisplatin / Paclitaxel + Etoposide", "Alternative multi-agent regimen"], ["BEP", "Bleomycin, Etoposide, Cisplatin", "Used in some protocols"], ["Pembrolizumab", "Anti-PD-1 immunotherapy", "Emerging role in recurrent/refractory PSTT/ETT (2024 data)"], ] chemo_tbl = Table(chemo_data, colWidths=[3*cm, 7*cm, 7*cm]) chemo_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,0), colors.HexColor("#2e6da4")), ("TEXTCOLOR", (0,0), (-1,0), colors.white), ("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"), ("FONTNAME", (0,1), (-1,-1), "Helvetica"), ("FONTSIZE", (0,0), (-1,-1), 9), ("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.white, colors.HexColor("#f0f6ff")]), ("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#aac4e0")), ("VALIGN", (0,0), (-1,-1), "TOP"), ("TOPPADDING", (0,0), (-1,-1), 5), ("BOTTOMPADDING", (0,0), (-1,-1), 5), ("LEFTPADDING", (0,0), (-1,-1), 6), ])) story.append(chemo_tbl) story.append(Spacer(1, 0.2*cm)) story.append(Paragraph( "Note: Per the 2025 FIGO/IGCS update (Ngan et al., Int J Gynaecol Obstet 2025), multi-agent " "chemotherapy +/- pembrolizumab is now incorporated for high-risk PSTT/ETT. WHO risk scores " "are not applied; risk stratification is based on stage and interval from antecedent pregnancy.", SOURCE )) story.append(PageBreak()) # ── SECTION 14: PROGNOSIS ── story.append(Paragraph("14. Prognosis and Outcome", H1)) story.append(hr()) story.append(Paragraph( "Overall, PSTT follows a more indolent clinical course than choriocarcinoma. The prognosis is " "strongly stage-dependent:", BODY )) prognosis_summary_data = [ ["Stage / Risk Group", "Approximate Survival"], ["Stage I (uterus confined)", ">90-95% long-term survival with hysterectomy"], ["Stage II (local spread)", "Good with combined surgery + chemotherapy"], ["Stage III (lung metastases)", "Variable; 50-70% with aggressive treatment"], ["Stage IV (distant metastases)", "Poor; <30% long-term survival"], ["High-risk (interval >=48 months)", "Significantly worse prognosis; novel therapies needed"], ["Overall (all stages)", "10-15% of patients with disseminated disease die of tumor"], ] ps_tbl = Table(prognosis_summary_data, colWidths=[8*cm, 9*cm]) ps_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,0), colors.HexColor("#1a3a5c")), ("TEXTCOLOR", (0,0), (-1,0), colors.white), ("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"), ("FONTNAME", (0,1), (-1,-1), "Helvetica"), ("FONTSIZE", (0,0), (-1,-1), 10), ("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.white, colors.HexColor("#f0f6ff")]), ("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#aac4e0")), ("VALIGN", (0,0), (-1,-1), "MIDDLE"), ("TOPPADDING", (0,0), (-1,-1), 7), ("BOTTOMPADDING", (0,0), (-1,-1), 7), ("LEFTPADDING", (0,0), (-1,-1), 8), ])) story.append(ps_tbl) story.append(Spacer(1, 0.3*cm)) story.append(Paragraph( "Poor prognostic factors include: Stage IV disease, long interval from antecedent pregnancy " "(>= 48 months), high mitotic rate, deep myometrial invasion, and lymphovascular invasion. " "Recurrence after initial treatment is associated with a significantly worse outcome.", BODY )) # ── SECTION 15: FERTILITY-SPARING ── story.append(Paragraph("15. Fertility-Sparing Options", H1)) story.append(hr()) story.append(Paragraph( "Hysterectomy is the standard treatment, but <b>fertility-sparing surgery</b> has been reported " "in carefully selected patients with localized uterine-confined disease who wish to preserve fertility.", BODY )) for item in [ "Uterine-confined (Stage I) disease only", "Thorough curettage or hysteroscopic resection of focal PSTT", "Must be combined with careful post-operative hCG monitoring", "Limited case reports in literature; not yet standard of care", "Requires expert center with multidisciplinary GTD team", "Hysterectomy recommended after completion of childbearing", ]: story.append(Paragraph(f"• {item}", BULLET)) story.append(Paragraph( "Per Wang et al. (Hematol Oncol Clin North Am 2024, PMID 39322463), there are case reports of " "fertility-sparing surgery for uterine-confined PSTT/ETT, but hysterectomy remains the standard recommendation.", SOURCE )) story.append(Spacer(1, 0.3*cm)) # ── SECTION 16: FOLLOW-UP ── story.append(Paragraph("16. Follow-Up and Surveillance", H1)) story.append(hr()) story.append(Paragraph( "Post-treatment surveillance is based on serial hCG monitoring, though this is less sensitive " "than for choriocarcinoma due to PSTT's low hCG production. Key principles:", BODY )) for item in [ "Serial serum hCG measurements - mainstay of follow-up", "hPL levels can be used as adjunct monitoring marker", "Imaging (CT chest/abdomen/pelvis) at regular intervals especially for high-risk cases", "Long-term follow-up required - late recurrences can occur even years after treatment", "Pregnancy can be considered after documented remission and full staging clearance", "Duration of hCG monitoring varies: longer surveillance for high-risk features", ]: story.append(Paragraph(f"• {item}", BULLET)) story.append(PageBreak()) # ── SECTION 17: KEY POINTS ── story.append(Paragraph("17. Key Points Summary", H1)) story.append(hr()) story.append(blue_box("PSTT - Key Points to Remember", [ "PSTT < 2% of all GTN; arises from intermediate (extravillous) trophoblasts", "Can follow any antecedent pregnancy; 50% follow normal term deliveries", "hCG is LOW or normal; hPL is the primary tumor marker", "WHO prognostic scoring does NOT apply to PSTT/ETT", "Diploid tumor, often XX karyotype; invades without hemorrhage or destruction", "Relatively CHEMORESISTANT - surgery (hysterectomy) is the primary treatment", "Multi-agent chemotherapy (EMA-CO, EMA-EP, TP/TE) for high-risk/metastatic disease", "High-risk = Stage II+ OR interval >= 48 months from antecedent pregnancy", "IHC: hPL strong+, hCG focal+, p63 NEGATIVE (p63 positive = ETT not PSTT)", "Stage I: excellent prognosis (>90%); Stage IV: poor prognosis (<30%)", "ETT = mononuclear cells + p63+, hyaline material, geographic necrosis", "Pembrolizumab now considered for recurrent/refractory PSTT/ETT (2024-2025 data)", ])) story.append(Spacer(1, 0.4*cm)) # Comparison table story.append(Paragraph("<b>PSTT vs. ETT vs. Choriocarcinoma - Quick Comparison</b>", H2)) comp_data = [ ["Feature", "PSTT", "ETT", "Choriocarcinoma"], ["Cell of origin", "Implantation site\nintermediate trophoblast", "Chorionic-type\nintermediate trophoblast", "Cytotrophoblast +\nSyncytiotrophoblast"], ["hCG level", "Low/normal", "Low/normal", "Markedly elevated"], ["hPL", "Strong +", "Focal +", "Negative"], ["p63 IHC", "Negative", "Strong +", "Negative"], ["Histology", "Polygonal cells, vessel\ninvasion, fibrinoid", "Clear cells, hyaline,\ngeographic necrosis", "Biphasic, hemorrhage,\nnecrosis"], ["Chemo response", "Relatively resistant", "Relatively resistant", "Highly sensitive"], ["Primary treatment", "Hysterectomy", "Hysterectomy", "Chemotherapy"], ["WHO risk score", "Not applied", "Not applied", "Applied"], ["Prognosis (stage I)", "Excellent", "Good", "Excellent"], ] comp_tbl = Table(comp_data, colWidths=[4.5*cm, 4.5*cm, 4*cm, 4*cm]) comp_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,0), colors.HexColor("#1a3a5c")), ("TEXTCOLOR", (0,0), (-1,0), colors.white), ("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"), ("FONTNAME", (0,1), (0,-1), "Helvetica-Bold"), ("FONTNAME", (1,1), (-1,-1), "Helvetica"), ("FONTSIZE", (0,0), (-1,-1), 9), ("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.white, colors.HexColor("#f0f6ff")]), ("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#aac4e0")), ("VALIGN", (0,0), (-1,-1), "TOP"), ("TOPPADDING", (0,0), (-1,-1), 5), ("BOTTOMPADDING", (0,0), (-1,-1), 5), ("LEFTPADDING", (0,0), (-1,-1), 6), ])) story.append(comp_tbl) story.append(PageBreak()) # ── SECTION 18: REFERENCES ── story.append(Paragraph("18. References", H1)) story.append(hr()) refs = [ ("Robbins & Kumar Basic Pathology, 10th ed.", "Kumar V, Abbas AK, Aster JC. Chapter 17: The Female Genital Tract. Gestational Trophoblastic Disease, pp. 619-621. Philadelphia: Elsevier, 2023."), ("Robbins, Cotran & Kumar Pathologic Basis of Disease, 10th ed.", "Kumar V, Abbas AK, Aster JC. Chapter 22: Female Genital Tract - Tumors of Extravascular Trophoblasts. Philadelphia: Elsevier, 2024."), ("Berek & Novak's Gynecology, 16th ed.", "Berek JS et al. Chapter: Gestational Trophoblastic Neoplasia - Placental-Site Trophoblastic Tumor and Epithelioid Trophoblastic Tumor, pp. 2507-2509. Philadelphia: Wolters Kluwer, 2020."), ("Wang V, Elias KM, Berkowitz RS, Horowitz NS (2024)", "Placental Site Trophoblastic Tumors and Epithelioid Trophoblastic Tumors. Hematology/Oncology Clinics of North America, 2024 Dec. PMID: 39322463. DOI: 10.1016/j.hoc.2024.08.016"), ("Ngan HYS, Seckl MJ, Berkowitz RS, et al. (2025)", "Diagnosis and management of gestational trophoblastic disease: 2025 update. Int J Gynaecol Obstet. 2025 Sep. PMID: 40631439. DOI: 10.1002/ijgo.70275"), ("Kaur B (2024)", "Pathology of Gestational Trophoblastic Disease (GTD). Hematology/Oncology Clinics of North America, 2024 Dec. PMID: 39322461"), ("Chawla T, Bouchard-Fortier G, Turashvili G (2023)", "Gestational trophoblastic disease: an update. Abdominal Radiology, 2023 May. PMID: 36763119"), ] for i, (short, full) in enumerate(refs, 1): story.append(Paragraph(f"[{i}] <b>{short}</b>", BULLET)) story.append(Paragraph(f" {full}", SOURCE)) story.append(Spacer(1, 0.15*cm)) # ─────────────────────────── BUILD ───────────────────────────────────── def add_page_number(canvas, doc): canvas.saveState() canvas.setFont("Helvetica", 8) canvas.setFillColor(colors.HexColor("#777777")) canvas.drawString(2*cm, 1.2*cm, "Placental Site Trophoblastic Tumor (PSTT) - Detailed Review | Orris Medical Library | July 2026") canvas.drawRightString(A4[0] - 2*cm, 1.2*cm, f"Page {doc.page}") canvas.restoreState() doc.build(story, onFirstPage=add_page_number, onLaterPages=add_page_number) print(f"PDF created: {OUTPUT}") PYEOF echo "Script written."
cd /home/daytona/workspace/pstt-pdf && python3 generate_pstt_pdf.py 2>&1
ls -lh /home/daytona/workspace/pstt-pdf/PSTT_Detailed_Review.pdf
PSTT Detailed Review
PDF Document · PDF
| Feature | PSTT | Choriocarcinoma |
|---|---|---|
| hCG | Low / normal | Markedly elevated |
| Primary marker | hPL | hCG |
| Histology | Mononuclear cells, vessel invasion | Biphasic, hemorrhage, necrosis |
| Chemo sensitivity | Resistant | Highly sensitive |
| Primary Rx | Hysterectomy | Chemotherapy |
| WHO risk score | Not applied | Applied |
