Neoplasia literally means "new growth" (Greek: neo = new, plasia = formation). Neoplastic cells are said to be "transformed" because they replicate incessantly as a result of resistance to the regulatory influences that control normal cells.
"Neoplasms enjoy a degree of autonomy, but some important dependencies remain. All neoplasms, for example, depend on the host for their nutrition and blood supply." - Robbins Basic Pathology, p. 214
In common usage, a neoplasm is referred to as a tumor, and the study of tumors is called oncology (Greek: oncos = tumor).
Key features shared by all cancers:
Cancer is a genetic disorder caused by DNA mutations (somatic or inherited), plus epigenetic alterations
Genetic alterations are heritable (passed to daughter cells) - subject to Darwinian selection
Individual tumors are clonal (progeny of one transformed cell)
Tumor progression occurs by clonal evolution favoring subclones with more aggressive characteristics
Components of all tumors (benign and malignant):
Component
Description
Parenchyma
Neoplastic/transformed cells - determines biologic behavior and gives tumor its name
Tumors are broadly categorized as benign or malignant based on microscopic and gross characteristics.
A. Benign Tumors
A tumor is benign when its characteristics indicate it will remain localized and is amenable to local surgical removal; patients are generally curable.
Naming convention: Suffix -oma attached to the cell of origin.
Cell/Tissue of Origin
Benign Tumor Name
Fibroblast
Fibroma
Cartilage
Chondroma
Fat
Lipoma
Bone
Osteoma
Smooth muscle
Leiomyoma
Blood vessel
Hemangioma
Nerve
Neuroma
Special benign epithelial tumor terms:
Adenoma - benign epithelial neoplasm (glandular or non-glandular), e.g. thyroid adenoma, colonic adenoma
Papilloma - produces fingerlike fronds (e.g. papilloma of bladder, intraductal papilloma of breast)
Polyp - projects above a mucosal surface (e.g. colonic polyp)
Cystadenoma - hollow cystic mass (e.g. ovarian cystadenoma)
B. Malignant Tumors
A tumor is malignant when it is locally invasive and has the capacity to spread to distant sites (metastasize). All malignant tumors are collectively called cancers (Latin: crab).
Naming convention by tissue of origin:
Origin
Malignant Tumor Name
Example
Epithelium (any germ layer)
Carcinoma
- Glandular epithelium
Adenocarcinoma
Colon adenocarcinoma, breast adenocarcinoma
- Squamous epithelium
Squamous cell carcinoma
Lung SCC, cervical SCC
- Transitional epithelium
Transitional cell carcinoma
Bladder carcinoma
- Poorly differentiated
Undifferentiated carcinoma
Anaplastic thyroid carcinoma
Mesenchymal tissue
Sarcoma
- Fat
Liposarcoma
- Cartilage
Chondrosarcoma
- Smooth muscle
Leiomyosarcoma
- Striated muscle
Rhabdomyosarcoma
- Bone
Osteosarcoma
Blood cells
Leukemia / Lymphoma
CML, Hodgkin lymphoma
Important exceptions (malignant despite -oma suffix):
Teratoma - contains cells from more than one germ layer; can be benign (mature) or malignant (immature); arises from totipotent germ cells of ovary/testis
Hamartoma - disorganized mass of tissue native to that site (e.g. pulmonary hamartoma); benign
Choristoma - heterotopic nest of cells (e.g. pancreatic tissue in gastric submucosa); not truly neoplastic
Benign vs. Malignant - Key Distinguishing Features
Fig. 6.10: Comparison between benign leiomyoma and malignant leiomyosarcoma of the uterus (Robbins Basic Pathology)
Feature
Benign
Malignant
Differentiation
Well differentiated
Variable; may be anaplastic
Growth rate
Slow
Usually rapid
Local invasion
Non-invasive, encapsulated
Invasive, no capsule
Metastasis
Absent
Present (hallmark)
Nuclear pleomorphism
Minimal
Marked
Mitoses
Rare, normal
Frequent, atypical
Necrosis
Rare
Common
Three features that most reliably distinguish benign from malignant:
Differentiation and anaplasia
Local invasion
Metastasis
3. Routes/Modes of Spread of Malignant Tumors
Metastasis is defined as the spread of a tumor to sites that are physically discontinuous with the primary tumor and is one of the hallmarks of malignancy.
"Approximately 30% of patients with newly diagnosed solid tumors present with clinically evident metastases, and an additional 20% have occult metastases at the time of diagnosis." - Robbins Basic Pathology, p. 221
Malignant neoplasms disseminate by three pathways:
Route 1: Seeding Within Body Cavities (Transcoelomic Spread)
Occurs when neoplasms invade a body cavity and shed cells that implant on peritoneal, pleural, or pericardial surfaces.
Mechanism: Tumor cells penetrate the wall of a body cavity → shed into the cavity → float freely → implant and grow on serosal surfaces without necessarily invading the underlying tissue.
Classic Examples:
Tumor
Cavity
Result
Ovarian carcinoma
Peritoneal cavity
Widely seeds the peritoneal surfaces ("carcinomatosis peritonei"), may spare underlying tissue
Medulloblastoma / Ependymoma
CSF (cerebral ventricles)
Seeding of meningeal surfaces of brain and spinal cord via cerebrospinal fluid
Gastric carcinoma
Peritoneal cavity
Krukenberg tumor (bilateral ovarian metastasis via transcoelomic spread)
Mesothelioma
Pleural cavity
Diffuse pleural implants
Route 2: Lymphatic Spread
The most common initial route, particularly for carcinomas (epithelial malignancies).
Mechanism:
Tumor cells invade lymphatic channels
Travel to regional lymph nodes
Cells may pass through proximal nodes and be trapped in subsequent nodes ("skip metastases")
Cells can eventually reach the vascular compartment via the thoracic duct
Sentinel lymph node: The first regional lymph node receiving lymph flow from a primary tumor. Identified by injection of dyes or radiolabeled tracers. Biopsy determines extent of spread.
Important caveat: Enlarged nodes near a tumor do not always mean cancer - reactive hyperplasia (lymphadenitis) from tumor necrosis products can also enlarge nodes. Biopsy is necessary.
Classic Examples:
Tumor
Pattern of Lymphatic Spread
Breast carcinoma
Initially to axillary nodes; medial lesions spread to internal mammary nodes; later, supraclavicular and infraclavicular nodes seeded
Lung carcinoma
Hilar and mediastinal nodes
Colorectal carcinoma
Mesenteric nodes
Cervical carcinoma
Pelvic lymph nodes
Gastric carcinoma
Left supraclavicular node (Virchow's node / Troisier's sign) via thoracic duct
Route 3: Hematogenous Spread
The dominant route for sarcomas (mesenchymal malignancies), though carcinomas also use this pathway.
Mechanism:
Tumor cells preferentially penetrate thin-walled veins rather than arteries
Bloodborne cells arrest in the first capillary bed they encounter
Portal system drains to the liver → liver most common site of hematogenous metastasis from GI tumors
Caval blood flows to lungs → lungs most common site from systemic tumors
Organs near the vertebral column (thyroid, prostate) drain via the paravertebral (Batson's) plexus → spine metastases
Classic Examples:
Primary Tumor
Preferred Sites of Hematogenous Metastasis
Mechanism
Colorectal carcinoma
Liver (first), then lungs
Portal venous drainage to liver
Lung carcinoma
Brain, adrenal glands, liver, bone
Systemic arterial spread via pulmonary veins
Prostatic carcinoma
Bone (osteoblastic)
Paravertebral venous plexus (Batson's plexus)
Thyroid carcinoma
Bone, lungs
Paravertebral plexus + hematogenous
Renal cell carcinoma
Lungs, bone; also grows within the inferior vena cava
Direct venous extension
Hepatocellular carcinoma
Grows within hepatic veins and inferior vena cava to right heart
Intravascular growth
Neuroblastoma
Liver and bone
Hematogenous
Uveal melanoma
Liver
Organ-specific homing
Breast carcinoma
Bone, liver, lungs, brain
Systemic hematogenous spread
Why some organs are rarely involved despite rich blood supply: Skeletal muscle, for example, is rarely a site of metastases - the molecular basis involves specific tumor cell-organ interactions (organ-specific homing molecules).
Liver Studded with Metastatic Cancer (Hematogenous Spread)
Fig. 6.9: A liver studded with metastatic cancer - multiple yellowish-white tumor nodules scattered throughout the liver parenchyma (Robbins Basic Pathology, p. 221)
Summary Table: Routes of Spread
Route
Typical Tumors
Classic Example
Transcoelomic (cavity seeding)
Carcinomas involving serosal surfaces
Ovarian carcinoma → peritoneal seeding
Lymphatic
Carcinomas (first route)
Breast Ca → axillary nodes
Hematogenous
Sarcomas primarily; also carcinomas
Colorectal Ca → liver; Lung Ca → brain
Key rule: Carcinomas tend to spread via lymphatics first, then blood. Sarcomas tend to spread hematogenously. However, all routes can be used by any malignant tumor.
All content sourced from: Robbins & Kumar Basic Pathology (Robbins Pathology), pp. 214-222
Create a comparison table of benign vs malignant tumor characteristics as a PDF reference
mkdir -p /tmp/workspace/neoplasia-pdf && cat > /tmp/workspace/neoplasia-pdf/generate_pdf.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, Table, TableStyle, Paragraph,
Spacer, HRFlowable, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import PageBreak
OUTPUT = "/tmp/workspace/neoplasia-pdf/Benign_vs_Malignant_Tumor.pdf"
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
leftMargin=1.8*cm,
rightMargin=1.8*cm,
topMargin=1.8*cm,
bottomMargin=1.8*cm,
)
# ── Colour palette ──────────────────────────────────────────────────────────
DARK_BLUE = colors.HexColor("#1A3A5C")
MED_BLUE = colors.HexColor("#2D6A9F")
LIGHT_BLUE = colors.HexColor("#D6E8FA")
BENIGN_COL = colors.HexColor("#1B7A3E") # deep green
BENIGN_BG = colors.HexColor("#D6F0E0") # light green
MALIG_COL = colors.HexColor("#B52B27") # deep red
MALIG_BG = colors.HexColor("#FAD7D6") # light red
HEADER_BG = colors.HexColor("#1A3A5C") # same as DARK_BLUE
ROW_ALT = colors.HexColor("#F4F8FC")
WHITE = colors.white
BLACK = colors.HexColor("#1A1A1A")
GOLD = colors.HexColor("#C8973A")
SECTION_BG = colors.HexColor("#EBF3FB")
styles = getSampleStyleSheet()
title_style = ParagraphStyle(
"Title", parent=styles["Normal"],
fontSize=22, textColor=WHITE, alignment=TA_CENTER,
spaceAfter=4, fontName="Helvetica-Bold", leading=26,
)
subtitle_style = ParagraphStyle(
"Subtitle", parent=styles["Normal"],
fontSize=10, textColor=LIGHT_BLUE, alignment=TA_CENTER,
spaceAfter=2, fontName="Helvetica", leading=13,
)
section_style = ParagraphStyle(
"Section", parent=styles["Normal"],
fontSize=11, textColor=DARK_BLUE, alignment=TA_LEFT,
fontName="Helvetica-Bold", leading=14,
spaceBefore=8, spaceAfter=4,
)
body_style = ParagraphStyle(
"Body", parent=styles["Normal"],
fontSize=8.5, textColor=BLACK, alignment=TA_LEFT,
fontName="Helvetica", leading=11,
)
cell_style = ParagraphStyle(
"Cell", parent=styles["Normal"],
fontSize=8, textColor=BLACK, alignment=TA_LEFT,
fontName="Helvetica", leading=10.5,
)
benign_cell = ParagraphStyle(
"BenignCell", parent=cell_style,
textColor=BENIGN_COL, fontName="Helvetica-Bold",
)
malig_cell = ParagraphStyle(
"MaligCell", parent=cell_style,
textColor=MALIG_COL, fontName="Helvetica-Bold",
)
feature_cell = ParagraphStyle(
"FeatureCell", parent=cell_style,
textColor=WHITE, fontName="Helvetica-Bold",
fontSize=8,
)
note_style = ParagraphStyle(
"Note", parent=styles["Normal"],
fontSize=7.5, textColor=colors.HexColor("#555555"),
fontName="Helvetica-Oblique", leading=10, alignment=TA_LEFT,
)
footer_style = ParagraphStyle(
"Footer", parent=styles["Normal"],
fontSize=7, textColor=colors.HexColor("#888888"),
fontName="Helvetica", alignment=TA_CENTER,
)
P = Paragraph # shorthand
# ── Helper ───────────────────────────────────────────────────────────────────
def pc(text, style=cell_style): return P(text, style)
def fc(text): return P(text, feature_cell)
def bc(text): return P(text, benign_cell)
def mc(text): return P(text, malig_cell)
# ── TITLE BLOCK ─────────────────────────────────────────────────────────────
title_table = Table(
[[P("Benign vs Malignant Tumor", title_style)],
[P("A Comprehensive Pathology Reference Table", subtitle_style)],
[P("Based on Robbins & Kumar Basic Pathology, 11th Edition", subtitle_style)]],
colWidths=[17.4*cm],
)
title_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), DARK_BLUE),
("TOPPADDING", (0,0), (-1,0), 14),
("BOTTOMPADDING", (0,-1), (-1,-1), 12),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
("LINEBELOW", (0,0), (-1,0), 1, GOLD),
]))
# ── MAIN COMPARISON TABLE ────────────────────────────────────────────────────
col_w = [4.5*cm, 6.2*cm, 6.2*cm]
header_row = [
fc("CHARACTERISTIC"),
P("<b>BENIGN TUMOR</b>", ParagraphStyle("BH", parent=cell_style,
textColor=WHITE, fontName="Helvetica-Bold", fontSize=9, alignment=TA_CENTER)),
P("<b>MALIGNANT TUMOR</b>", ParagraphStyle("MH", parent=cell_style,
textColor=WHITE, fontName="Helvetica-Bold", fontSize=9, alignment=TA_CENTER)),
]
rows = [
# feature, benign, malignant
("Differentiation",
"Well differentiated; closely resembles cells of origin",
"Variable — from well to poorly differentiated; may be anaplastic (undifferentiated)"),
("Anaplasia",
"Absent; cells are mature",
"May be marked; cells show pleomorphism, hyperchromatic nuclei, abnormal mitoses"),
("Rate of Growth",
"Slow, progressive; may stop or regress",
"Usually rapid; rate correlates with degree of undifferentiation"),
("Nuclear Features",
"Normal nuclear-cytoplasmic ratio; uniform chromatin",
"Increased N:C ratio; hyperchromasia; prominent nucleoli; irregular chromatin"),
("Mitoses",
"Rare; normal configuration",
"Frequent; atypical tripolar or multipolar mitotic figures"),
("Encapsulation",
"Usually encapsulated (fibrous capsule); clearly demarcated from surrounding tissue",
"No capsule; poorly demarcated; infiltrative, irregular margins"),
("Local Invasion",
"Non-invasive; grows by expansion and compression",
"Locally invasive; penetrates and destroys surrounding tissue (hallmark)"),
("Metastasis",
"Absent — defining feature of benign tumors",
"Present — most reliable indicator of malignancy; ~30% of solid tumors present with metastases"),
("Necrosis & Hemorrhage",
"Rare; well-vascularised, slow growth",
"Common; rapid growth outstrips blood supply → ischaemic necrosis and haemorrhage"),
("Recurrence after Surgery",
"Rare after complete excision",
"Common if margins not clear; wide excision margins required"),
("Effect on Host",
"Usually benign; may cause pressure on adjacent structures or obstruction",
"Cachexia, paraneoplastic syndromes, organ destruction, death if untreated"),
("Prognosis",
"Generally curable with local excision",
"Variable; depends on type, grade, stage; may be fatal"),
("Stroma / Desmoplasia",
"Stroma usually minimal and well organised",
"May induce dense fibrous stroma (desmoplasia) — scirrhous tumour"),
("Tumour Markers",
"Not typically elevated",
"May produce tumour markers (CEA, AFP, PSA, CA-125, etc.)"),
]
table_data = [header_row]
for feat, ben, mal in rows:
table_data.append([
fc(feat),
bc(ben),
mc(mal),
])
# Alternating row styling
ts = [
# Header
("BACKGROUND", (0,0), (-1,0), HEADER_BG),
("BACKGROUND", (1,0), (1,0), BENIGN_COL),
("BACKGROUND", (2,0), (2,0), MALIG_COL),
("ALIGN", (0,0), (-1,-1), "LEFT"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING",(0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING",(0,0), (-1,-1), 6),
("GRID", (0,0), (-1,-1), 0.5, colors.HexColor("#CCCCCC")),
("LINEBELOW", (0,0), (-1,0), 1.5, GOLD),
("LINEAFTER", (0,0), (0,-1), 1.5, DARK_BLUE),
]
for i in range(1, len(table_data)):
bg = ROW_ALT if i % 2 == 0 else WHITE
ts.append(("BACKGROUND", (0,i), (0,i), DARK_BLUE)) # feature col always dark
ts.append(("BACKGROUND", (1,i), (1,i), BENIGN_BG if i % 2 == 0 else colors.HexColor("#E8F7EE")))
ts.append(("BACKGROUND", (2,i), (2,i), MALIG_BG if i % 2 == 0 else colors.HexColor("#FDF0EF")))
main_table = Table(table_data, colWidths=col_w, repeatRows=1)
main_table.setStyle(TableStyle(ts))
# ── NOMENCLATURE SECTION ──────────────────────────────────────────────────────
nom_header = Table(
[[P("<b>TUMOUR NOMENCLATURE QUICK REFERENCE</b>", ParagraphStyle(
"NomH", parent=cell_style, textColor=WHITE, fontSize=9.5,
fontName="Helvetica-Bold", alignment=TA_CENTER))]],
colWidths=[17.4*cm],
)
nom_header.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), MED_BLUE),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
]))
nom_col_w = [4.3*cm, 4.3*cm, 4.3*cm, 4.3*cm]
nom_head_row = [
P("<b>Tissue of Origin</b>", ParagraphStyle("nh", parent=cell_style, textColor=WHITE,
fontName="Helvetica-Bold", alignment=TA_CENTER)),
P("<b>Benign</b>", ParagraphStyle("nh2", parent=cell_style, textColor=WHITE,
fontName="Helvetica-Bold", alignment=TA_CENTER)),
P("<b>Malignant</b>", ParagraphStyle("nh3", parent=cell_style, textColor=WHITE,
fontName="Helvetica-Bold", alignment=TA_CENTER)),
P("<b>Example / Notes</b>", ParagraphStyle("nh4", parent=cell_style, textColor=WHITE,
fontName="Helvetica-Bold", alignment=TA_CENTER)),
]
nom_rows_data = [
("Fibrous tissue", "Fibroma", "Fibrosarcoma", "Dermatofibrosarcoma"),
("Fat", "Lipoma", "Liposarcoma", "Retroperitoneal liposarcoma"),
("Cartilage", "Chondroma", "Chondrosarcoma", "Long bones"),
("Bone", "Osteoma", "Osteosarcoma", "Most common primary bone cancer"),
("Smooth muscle", "Leiomyoma", "Leiomyosarcoma", "Uterine fibroids (benign)"),
("Striated muscle", "Rhabdomyoma", "Rhabdomyosarcoma", "Paediatric soft tissue"),
("Blood vessels", "Hemangioma", "Angiosarcoma", "Liver angiosarcoma"),
("Glandular epithelium", "Adenoma", "Adenocarcinoma", "Colon, thyroid, breast"),
("Squamous epithelium", "Squamous papilloma", "Squamous cell carcinoma", "Skin, cervix, lung"),
("Transitional epithelium", "Transitional papilloma", "Transitional cell carcinoma", "Bladder"),
("Melanocytes", "Melanocytic naevus (mole)", "Melanoma*", "Skin; *-oma suffix = malignant"),
("Lymphoid tissue", "—", "Lymphoma*", "*Always malignant despite suffix"),
("Plasma cells", "—", "Multiple myeloma*", "Bone marrow"),
("Germ cells (testis/ovary)", "Mature teratoma", "Seminoma* / Immature teratoma", "*Malignant despite -oma"),
("Mesothelium", "—", "Mesothelioma*", "Pleura/peritoneum; asbestos"),
]
nom_data = [nom_head_row]
for row in nom_rows_data:
nom_data.append([pc(c) for c in row])
nom_ts = [
("BACKGROUND", (0,0), (-1,0), DARK_BLUE),
("ALIGN", (0,0), (-1,-1), "LEFT"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 5),
("RIGHTPADDING",(0,0), (-1,-1), 5),
("GRID", (0,0), (-1,-1), 0.5, colors.HexColor("#CCCCCC")),
("LINEBELOW", (0,0), (-1,0), 1.5, GOLD),
]
for i in range(1, len(nom_data)):
bg = ROW_ALT if i % 2 == 0 else WHITE
nom_ts.append(("BACKGROUND", (0,i), (-1,i), bg))
nom_table = Table(nom_data, colWidths=nom_col_w, repeatRows=1)
nom_table.setStyle(TableStyle(nom_ts))
# ── ROUTES OF SPREAD BOX ─────────────────────────────────────────────────────
spread_header = Table(
[[P("<b>ROUTES OF SPREAD OF MALIGNANT TUMOURS</b>", ParagraphStyle(
"SpH", parent=cell_style, textColor=WHITE, fontSize=9.5,
fontName="Helvetica-Bold", alignment=TA_CENTER))]],
colWidths=[17.4*cm],
)
spread_header.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), MALIG_COL),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
]))
spread_col_w = [3.5*cm, 5.0*cm, 4.5*cm, 4.2*cm]
spread_head_row = [
P("<b>Route</b>", ParagraphStyle("sh", parent=cell_style, textColor=WHITE,
fontName="Helvetica-Bold", alignment=TA_CENTER)),
P("<b>Mechanism</b>", ParagraphStyle("sh2", parent=cell_style, textColor=WHITE,
fontName="Helvetica-Bold", alignment=TA_CENTER)),
P("<b>Typical Tumours</b>", ParagraphStyle("sh3", parent=cell_style, textColor=WHITE,
fontName="Helvetica-Bold", alignment=TA_CENTER)),
P("<b>Classic Example</b>", ParagraphStyle("sh4", parent=cell_style, textColor=WHITE,
fontName="Helvetica-Bold", alignment=TA_CENTER)),
]
spread_rows = [
("1. Lymphatic Spread",
"Tumor cells enter lymphatics → regional nodes → skip metastases possible → thoracic duct → blood",
"Carcinomas (most common initial route)",
"Breast Ca → axillary nodes; Gastric Ca → Virchow's node"),
("2. Hematogenous Spread",
"Penetrate thin-walled veins; arrest in first capillary bed; portal → liver; caval → lungs",
"Sarcomas (primary); also carcinomas",
"Colorectal Ca → liver; Lung Ca → brain/adrenal; Prostatic Ca → bone (Batson's plexus)"),
("3. Transcoelomic (Cavity Seeding)",
"Invade body cavity wall; shed cells implant on serosal surfaces",
"Ovarian Ca, GI tumours, CNS tumours",
"Ovarian Ca → peritoneal 'carcinomatosis'; Medulloblastoma → CSF spread"),
("4. Direct / Contiguous Spread",
"Infiltrate and destroy immediately adjacent tissues; cross tissue planes",
"Most carcinomas at advanced stage",
"Rectal Ca → bladder; Cervical Ca → pelvic wall; Pancreatic Ca → duodenum"),
]
spread_data = [spread_head_row]
for row in spread_rows:
spread_data.append([pc(c) for c in row])
spr_ts = [
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#8B0000")),
("ALIGN", (0,0), (-1,-1), "LEFT"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING",(0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 5),
("RIGHTPADDING",(0,0), (-1,-1), 5),
("GRID", (0,0), (-1,-1), 0.5, colors.HexColor("#CCCCCC")),
("LINEBELOW", (0,0), (-1,0), 1.5, GOLD),
]
for i in range(1, len(spread_data)):
bg = colors.HexColor("#FDF0EF") if i % 2 == 0 else colors.HexColor("#FEF7F7")
spr_ts.append(("BACKGROUND", (0,i), (-1,i), bg))
spr_ts.append(("TEXTCOLOR", (0,i), (0,i), MALIG_COL))
spr_ts.append(("FONTNAME", (0,i), (0,i), "Helvetica-Bold"))
spread_table = Table(spread_data, colWidths=spread_col_w, repeatRows=1)
spread_table.setStyle(TableStyle(spr_ts))
# ── KEY RULES BOX ────────────────────────────────────────────────────────────
rules_data = [
[P("<b>KEY PATHOLOGY RULES TO REMEMBER</b>", ParagraphStyle(
"rh", parent=cell_style, textColor=WHITE, fontSize=9,
fontName="Helvetica-Bold"))],
[P("""<b>1. Metastasis = Malignancy</b> — Only malignant tumours metastasize; this is the most reliable single indicator of malignancy.<br/>
<b>2. Exceptions to -oma rule:</b> Melanoma, Lymphoma, Mesothelioma, Seminoma, Myeloma — all malignant despite the "-oma" suffix.<br/>
<b>3. Carcinoma vs Sarcoma:</b> Carcinomas arise from epithelium (all germ layers); Sarcomas from mesenchyme. Carcinomas spread via lymphatics first; Sarcomas via blood.<br/>
<b>4. Anaplasia = reliable sign of malignancy</b> — The more undifferentiated (anaplastic), the more aggressive the tumour.<br/>
<b>5. Sentinel node biopsy</b> — First node receiving lymph drainage; its status guides staging and treatment planning.<br/>
<b>6. Batson's paravertebral plexus</b> — Explains why prostate and thyroid cancers preferentially metastasize to the vertebral column (spine).<br/>
<b>7. Portal drainage → Liver metastases</b> — GI tract, pancreas, and spleen all drain via portal vein → liver is first capillary bed = most common site of GI tumour metastasis.""",
ParagraphStyle("rb", parent=cell_style, fontSize=7.8, leading=11.5))],
]
rules_table = Table(rules_data, colWidths=[17.4*cm])
rules_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), MED_BLUE),
("BACKGROUND", (0,1), (-1,1), LIGHT_BLUE),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 7),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("BOX", (0,0), (-1,-1), 1, MED_BLUE),
]))
# ── FOOTER ───────────────────────────────────────────────────────────────────
footer = P(
"Reference: Robbins & Kumar Basic Pathology, 11th Ed. (Robbins Pathology) — Neoplasia Chapter, pp. 214–229 | For educational use only",
footer_style
)
# ── BUILD DOCUMENT ────────────────────────────────────────────────────────────
story = [
title_table,
Spacer(1, 5*mm),
P("<b>BENIGN vs MALIGNANT: CHARACTERISTICS COMPARISON</b>", section_style),
main_table,
Spacer(1, 6*mm),
nom_header,
nom_table,
Spacer(1, 6*mm),
spread_header,
spread_table,
Spacer(1, 6*mm),
rules_table,
Spacer(1, 4*mm),
footer,
]
doc.build(story)
print(f"PDF created: {OUTPUT}")
PYEOF
python /tmp/workspace/neoplasia-pdf/generate_pdf.py
Your PDF reference sheet is ready. Here's what's included:
Benign vs Malignant Tumor
PDF Document · PDF
The PDF contains four colour-coded sections on a single page:
Main Comparison Table (14 characteristics) - Side-by-side benign (green) vs malignant (red) across: differentiation, anaplasia, growth rate, nuclear features, mitoses, encapsulation, local invasion, metastasis, necrosis, recurrence, host effects, prognosis, desmoplasia, and tumour markers.
Tumour Nomenclature Quick Reference - 15 tissue types with benign/malignant names and clinical examples (including the important "-oma exceptions": melanoma, lymphoma, mesothelioma, seminoma, myeloma).
Routes of Spread of Malignant Tumours - All 4 routes (lymphatic, hematogenous, transcoelomic, direct spread) with mechanism, typical tumour types, and classic examples.
Key Pathology Rules - 7 high-yield exam rules including Batson's plexus, sentinel node, portal drainage logic, and the carcinoma vs sarcoma distinction.