**Create a premium, high-end Personal Career Development Plan PDF in a polished academic style.** The document must look like a professionally designed university submission, with a luxurious but formal medical aesthetic, refined spacing, elegant typography, and a strong sense of structure. ### Overall design direction - Use **A4 portrait** format. - Make it look like a **top-tier medical school career plan report**. - Use a **clean premium color palette**: deep navy, royal blue, teal, soft gold, white, and light gray. - Add a **professional cover page**, **table of contents**, page numbers, header/footer, and clear section separation. - Use a **modern editorial layout** with strong visual hierarchy. - Make headings bold, clean, and elegant. - Use subtle borders, thin dividers, and carefully balanced white space. - Make the document feel **premium, formal, and visually impressive** without looking crowded. - Keep the style suitable for an international clinical medicine assignment. ### Premium visual style - Use a **formal executive-report design**. - Add a tasteful **medical academic look** with minimal icons or symbols. - Use soft shadows, clean lines, and refined section blocks. - Highlight personal details in a boxed profile card on the cover or first page. - Use a table of contents with clean dot leaders and page alignment. - Add a **timeline-style goal section** or a polished progress roadmap if possible. - Present the content in a way that feels like a **beautiful final-year professional report**. - The overall appearance should be elegant, sophisticated, and submission-ready. ### Student details - **Name:** Junaid Wahid - **Student ID:** 235019015 - **Major:** Clinical Medicine - **Current Academic Year:** 4th Year - **University:** Shandong Medical and Pharmaceutical University, China - **Date:** 24 May 2026 - **Target Specialty:** Neurosurgery ### Required document structure #### Cover Page Create a premium cover page with: - Main title: **Personal Career Development Plan** - Subtitle: **A structured pathway toward becoming a Neurosurgeon** - Student information in a neat professional box - A formal academic tone - A visually attractive top or center layout #### Table of Contents Include a clean and elegant table of contents with: - Career Vision - Personal Profile Summary - Self-Assessment Analysis - Career Environment Scan - Goal System Construction - Implementation Pathway Design - Risk Management Plan - Conclusion / Final Statement #### Career Vision Write a concise but powerful paragraph describing the long-term goal of becoming a competent, ethical, and internationally minded neurosurgeon who can diagnose, treat, and serve patients with excellence. #### Personal Profile Summary Include: - Name - Student ID - Major - Academic Year - Target Specialty - Core Career Identity #### Self-Assessment Analysis 1. **Clarification of Professional Values** - Explain the motivation for choosing medicine - Mention compassion, responsibility, service, precision, and lifelong learning - Explain why neurosurgery is the preferred path 2. **Competency Matrix Evaluation** - Mention strengths in diagnostic interviewing, clinical reasoning, emergency judgment, communication, and adaptability - Mention cross-cultural advantages from studying in China - Mention areas for growth such as surgical confidence, procedure skills, and advanced decision-making 3. **Career Personality Positioning** - Use Holland Code language - Highlight Investigative, Realistic, and Social traits - Explain why these traits fit neurosurgery #### Career Environment Scan 1. **Target Region Practice Landscape** - Explain the plan to return to Pakistan after graduation - Mention the licensing exam requirement - Mention the FCPS route toward neurosurgery - Also mention international alternatives such as USMLE, PLAB, AMC, and other foreign licensing exams 2. **Industry Trend Analysis** - Mention AI-assisted diagnosis, digital imaging, modern surgical planning, wearable monitoring, and evidence-based medicine - Explain why modern neurosurgeons need adaptability, technical literacy, and continuous professional development #### Goal System Construction 1. **Short-Term Goals: Before Graduation** - Strengthen clinical courses and core medical knowledge - Improve case presentation, history taking, and clinical reasoning - Complete in-depth case reports - Improve English medical communication and academic reading 2. **Mid-Term Goals: Five Years After Graduation** - Complete licensing and enter specialist training - Build clinical discipline, surgical understanding, and decision-making - Participate in research and mentorship - Gain exposure to tertiary hospital practice 3. **Long-Term Goals: Ten Years After Graduation** - Become a qualified neurosurgeon - Serve patients in Pakistan - Contribute to advanced surgical care - Build academic and cross-border professional collaboration #### Implementation Pathway Design 1. **Academic Preparation Phase: During Studies** - Improve one weakness each semester - Focus on surgical anatomy, ECG interpretation, emergency response, and case analysis - Join research and learn from mentors 2. **Credentialing Phase: One to Two Years After Graduation** - Prepare for the licensing exam - Build a structured study system - Prepare documents and certificates in advance - Keep alternative pathways open 3. **Specialization Phase: Three to Five Years After Graduation** - Build strong neurosurgical knowledge and operative skill - Attend conferences and workshops - Observe experienced neurosurgeons - Build presentations and academic experience #### Risk Management Plan 1. **Major Risk Response** - Licensing exam failure: add extra preparation time and transitional work options - Policy or visa changes: maintain flexibility with two pathways - Burnout: maintain balance, health, and discipline 2. **Dynamic Evaluation Mechanism** - Review progress every quarter - Revise the plan yearly with mentors or senior doctors #### Conclusion / Final Statement End with a strong and polished conclusion stating that becoming a neurosurgeon requires dedication, academic excellence, ethical responsibility, research awareness, and lifelong learning. ### Writing style - The writing should be **formal, intelligent, and motivational**. - Keep it clear and professional, but not too plain. - Make the content sound like an excellent final-year medical student submission. - Maintain consistency, balance, and refinement throughout. - Make the final result feel like a **premium printed PDF**. ### Final output instruction Provide the response in a **beautifully structured document format**, ready to paste into Word, Google Docs, Canva, or any PDF design tool and export as a professional PDF. *** **Also create the content with a luxury academic presentation style: centered cover page, boxed personal details, dot-leader table of contents, refined section headers, timeline visuals, and clean editorial spacing.** Make me a pdf
ls /home/daytona/workspace/ 2>/dev/null || echo "workspace is empty or does not …
mkdir -p /home/daytona/workspace/career-plan && python3 -c "from reportlab.lib i…
~/career-plan/build_pdf.py
#!/usr/bin/env python3
"""
Premium Personal Career Development Plan PDF
Junaid Wahid – Clinical Medicine – Shandong Medical and Pharmaceutical University
"""
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import mm, cm
from reportlab.lib.styles import ParagraphStyle, getSampleStyleSheet
from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_RIGHT, TA_JUSTIFY
from reportlab.platypus import (
BaseDocTemplate, PageTemplate, Frame, Paragraph, Spacer,
Table, TableStyle, HRFlowable, PageBreak, KeepTogether,
NextPageTemplate, FrameBreak
)
from reportlab.platypus.flowables import Flowable
from reportlab.pdfgen import canvas
from reportlab.graphics.shapes import Drawing, Rect, Line, Circle, String, Polygon
from reportlab.graphics import renderPDF
import os
# ─── COLOR PALETTE ────────────────────────────────────────────────────────────
NAVY = colors.HexColor("#0D1B3E") # deep navy
ROYAL = colors.HexColor("#1A4A8A") # royal blue
TEAL = colors.HexColor("#0A7EA4") # medical teal
GOLD = colors.HexColor("#B8922A") # soft gold
GOLD_LIGHT = colors.HexColor("#D4AF37") # gold accent
WHITE = colors.white
LIGHT_GRAY = colors.HexColor("#F4F6FA") # soft background
MID_GRAY = colors.HexColor("#C8D0DC") # divider
DARK_GRAY = colors.HexColor("#4A5568") # body text
PALE_BLUE = colors.HexColor("#E8EFF8") # section bg tint
TEAL_LIGHT = colors.HexColor("#E0F3FA") # teal tint
# ─── PAGE DIMENSIONS ──────────────────────────────────────────────────────────
PAGE_W, PAGE_H = A4 # 595.28 x 841.89 pt
MARGIN_L = 2.2 * cm
MARGIN_R = 2.2 * cm
MARGIN_T = 2.5 * cm
MARGIN_B = 2.2 * cm
BODY_W = PAGE_W - MARGIN_L - MARGIN_R
OUTPUT = "/home/daytona/workspace/career-plan/Junaid_Wahid_Career_Development_Plan.pdf"
# ─── STYLES ───────────────────────────────────────────────────────────────────
def make_styles():
base = getSampleStyleSheet()
cover_title = ParagraphStyle(
"CoverTitle",
fontName="Helvetica-Bold",
fontSize=26,
leading=34,
textColor=WHITE,
alignment=TA_CENTER,
spaceAfter=6,
)
cover_subtitle = ParagraphStyle(
"CoverSubtitle",
fontName="Helvetica",
fontSize=12,
leading=18,
textColor=colors.HexColor("#A8C4E8"),
alignment=TA_CENTER,
spaceAfter=4,
)
cover_info = ParagraphStyle(
"CoverInfo",
fontName="Helvetica",
fontSize=10,
leading=16,
textColor=WHITE,
alignment=TA_CENTER,
)
cover_label = ParagraphStyle(
"CoverLabel",
fontName="Helvetica-Bold",
fontSize=8.5,
leading=14,
textColor=GOLD_LIGHT,
alignment=TA_LEFT,
letterSpacing=1.5,
)
cover_value = ParagraphStyle(
"CoverValue",
fontName="Helvetica",
fontSize=10,
leading=15,
textColor=WHITE,
alignment=TA_LEFT,
)
toc_heading = ParagraphStyle(
"TOCHeading",
fontName="Helvetica-Bold",
fontSize=11,
leading=20,
textColor=NAVY,
alignment=TA_LEFT,
)
toc_entry = ParagraphStyle(
"TOCEntry",
fontName="Helvetica",
fontSize=10.5,
leading=22,
textColor=DARK_GRAY,
alignment=TA_LEFT,
)
toc_sub = ParagraphStyle(
"TOCSub",
fontName="Helvetica",
fontSize=9.5,
leading=18,
textColor=colors.HexColor("#6B7A96"),
leftIndent=18,
alignment=TA_LEFT,
)
sec_num = ParagraphStyle(
"SecNum",
fontName="Helvetica-Bold",
fontSize=8,
leading=12,
textColor=GOLD,
alignment=TA_LEFT,
letterSpacing=2,
spaceAfter=2,
)
sec_heading = ParagraphStyle(
"SectionHeading",
fontName="Helvetica-Bold",
fontSize=16,
leading=22,
textColor=NAVY,
spaceBefore=4,
spaceAfter=10,
)
sub_heading = ParagraphStyle(
"SubHeading",
fontName="Helvetica-Bold",
fontSize=11.5,
leading=17,
textColor=ROYAL,
spaceBefore=10,
spaceAfter=6,
)
body = ParagraphStyle(
"BodyText",
fontName="Helvetica",
fontSize=10,
leading=16.5,
textColor=DARK_GRAY,
alignment=TA_JUSTIFY,
spaceAfter=8,
)
bullet = ParagraphStyle(
"BulletText",
fontName="Helvetica",
fontSize=10,
leading=16,
textColor=DARK_GRAY,
leftIndent=18,
bulletIndent=6,
spaceAfter=4,
alignment=TA_LEFT,
)
caption = ParagraphStyle(
"Caption",
fontName="Helvetica-Oblique",
fontSize=8.5,
leading=12,
textColor=colors.HexColor("#8896A8"),
alignment=TA_CENTER,
)
profile_label = ParagraphStyle(
"ProfileLabel",
fontName="Helvetica-Bold",
fontSize=8.5,
leading=13,
textColor=TEAL,
letterSpacing=1,
)
profile_value = ParagraphStyle(
"ProfileValue",
fontName="Helvetica",
fontSize=10.5,
leading=15,
textColor=NAVY,
)
timeline_label = ParagraphStyle(
"TimelineLabel",
fontName="Helvetica-Bold",
fontSize=10,
leading=14,
textColor=WHITE,
alignment=TA_CENTER,
)
timeline_body = ParagraphStyle(
"TimelineBody",
fontName="Helvetica",
fontSize=9,
leading=14,
textColor=DARK_GRAY,
alignment=TA_LEFT,
spaceAfter=3,
)
conclusion = ParagraphStyle(
"Conclusion",
fontName="Helvetica-Oblique",
fontSize=10.5,
leading=18,
textColor=NAVY,
alignment=TA_JUSTIFY,
leftIndent=10,
rightIndent=10,
)
return dict(
cover_title=cover_title, cover_subtitle=cover_subtitle,
cover_info=cover_info, cover_label=cover_label, cover_value=cover_value,
toc_heading=toc_heading, toc_entry=toc_entry, toc_sub=toc_sub,
sec_num=sec_num, sec_heading=sec_heading, sub_heading=sub_heading,
body=body, bullet=bullet, caption=caption,
profile_label=profile_label, profile_value=profile_value,
timeline_label=timeline_label, timeline_body=timeline_body,
conclusion=conclusion,
)
# ─── DECORATIVE FLOWABLES ─────────────────────────────────────────────────────
class GoldDivider(Flowable):
def __init__(self, width=None, thickness=1.2):
Flowable.__init__(self)
self._width = width
self.thickness = thickness
self.height = self.thickness + 4
def wrap(self, availWidth, availHeight):
self.width = self._width or availWidth
return self.width, self.height
def draw(self):
c = self.canv
c.setStrokeColor(GOLD)
c.setLineWidth(self.thickness)
c.line(0, 2, self.width, 2)
class NavyTealDivider(Flowable):
"""Two-tone decorative divider: navy left 60% + teal right 40%"""
def __init__(self, width=None):
Flowable.__init__(self)
self._width = width
self.height = 3
def wrap(self, availWidth, availHeight):
self.width = self._width or availWidth
return self.width, self.height
def draw(self):
c = self.canv
split = self.width * 0.65
c.setStrokeColor(NAVY)
c.setLineWidth(2)
c.line(0, 1.5, split, 1.5)
c.setStrokeColor(TEAL)
c.setLineWidth(2)
c.line(split, 1.5, self.width, 1.5)
class SectionHeaderBlock(Flowable):
"""Colored block with section number + title"""
def __init__(self, number, title, width=None):
Flowable.__init__(self)
self.number = number
self.title = title
self._width = width
self.height = 38
def wrap(self, availWidth, availHeight):
self.width = self._width or availWidth
return self.width, self.height
def draw(self):
c = self.canv
# Background gradient simulation: navy full bar
c.setFillColor(NAVY)
c.roundRect(0, 0, self.width, self.height, 4, fill=1, stroke=0)
# Gold left accent strip
c.setFillColor(GOLD)
c.rect(0, 0, 5, self.height, fill=1, stroke=0)
# Section number
c.setFillColor(GOLD_LIGHT)
c.setFont("Helvetica-Bold", 8)
c.drawString(14, self.height - 14, self.number)
# Title
c.setFillColor(WHITE)
c.setFont("Helvetica-Bold", 15)
c.drawString(14, 10, self.title)
class SubSectionBar(Flowable):
"""Subtle left-accent bar for sub-sections"""
def __init__(self, title, width=None):
Flowable.__init__(self)
self.title = title
self._width = width
self.height = 26
def wrap(self, availWidth, availHeight):
self.width = self._width or availWidth
return self.width, self.height
def draw(self):
c = self.canv
c.setFillColor(PALE_BLUE)
c.roundRect(0, 0, self.width, self.height, 3, fill=1, stroke=0)
c.setFillColor(TEAL)
c.rect(0, 0, 4, self.height, fill=1, stroke=0)
c.setFillColor(ROYAL)
c.setFont("Helvetica-Bold", 11)
c.drawString(12, 8, self.title)
class ProfileCard(Flowable):
"""Boxed personal info card"""
def __init__(self, data, width=None):
Flowable.__init__(self)
self.data = data # list of (label, value) tuples
self._width = width
self.row_h = 22
self.pad = 14
self.height = self.pad * 2 + self.row_h * len(data) + 10
def wrap(self, availWidth, availHeight):
self.width = self._width or availWidth
return self.width, self.height
def draw(self):
c = self.canv
h = self.height
w = self.width
# Outer border
c.setStrokeColor(TEAL)
c.setLineWidth(1.2)
c.roundRect(0, 0, w, h, 6, fill=0, stroke=1)
# Header strip
c.setFillColor(NAVY)
c.roundRect(0, h - 30, w, 30, 6, fill=1, stroke=0)
c.rect(0, h - 30, w, 15, fill=1, stroke=0) # flatten bottom corners
c.setFillColor(GOLD_LIGHT)
c.setFont("Helvetica-Bold", 9)
c.drawCentredString(w/2, h - 20, "STUDENT PROFILE")
# Alternating row backgrounds
y = h - 30
for i, (label, value) in enumerate(self.data):
row_y = y - self.pad - (i + 1) * self.row_h
if i % 2 == 0:
c.setFillColor(PALE_BLUE)
c.rect(1, row_y, w - 2, self.row_h, fill=1, stroke=0)
# Left accent dot
c.setFillColor(TEAL)
c.circle(12, row_y + self.row_h / 2, 2.5, fill=1, stroke=0)
# Label
c.setFillColor(TEAL)
c.setFont("Helvetica-Bold", 8)
c.drawString(22, row_y + self.row_h / 2 + 2, label.upper())
# Value
c.setFillColor(NAVY)
c.setFont("Helvetica", 10)
c.drawString(w * 0.42, row_y + self.row_h / 2 + 2, value)
# Bottom gold line
c.setStrokeColor(GOLD)
c.setLineWidth(1.5)
c.line(10, 6, w - 10, 6)
class TimelineFlowable(Flowable):
"""Horizontal timeline with 3 phases"""
def __init__(self, phases, width=None):
Flowable.__init__(self)
self.phases = phases # list of (label, years, bullets)
self._width = width
self.height = 140
def wrap(self, availWidth, availHeight):
self.width = self._width or availWidth
return self.width, self.height
def draw(self):
c = self.canv
n = len(self.phases)
col_w = self.width / n
line_y = self.height - 30
# Backbone line
c.setStrokeColor(MID_GRAY)
c.setLineWidth(2)
c.line(col_w * 0.5, line_y, self.width - col_w * 0.5, line_y)
phase_colors = [NAVY, ROYAL, TEAL]
for i, (label, years, bullets) in enumerate(self.phases):
cx = col_w * i + col_w * 0.5
# Connector line segment
if i > 0:
c.setStrokeColor(phase_colors[i])
c.setLineWidth(2)
c.line(col_w * i, line_y, cx, line_y)
# Circle node
c.setFillColor(phase_colors[i % len(phase_colors)])
c.circle(cx, line_y, 14, fill=1, stroke=0)
c.setFillColor(WHITE)
c.setFont("Helvetica-Bold", 8)
c.drawCentredString(cx, line_y - 3, str(i + 1))
# Label box
box_w = col_w - 12
box_x = cx - box_w / 2
c.setFillColor(phase_colors[i % len(phase_colors)])
c.roundRect(box_x, line_y + 18, box_w, 22, 3, fill=1, stroke=0)
c.setFillColor(WHITE)
c.setFont("Helvetica-Bold", 8.5)
c.drawCentredString(cx, line_y + 26, label)
# Years subtitle
c.setFillColor(GOLD)
c.setFont("Helvetica-Bold", 7.5)
c.drawCentredString(cx, line_y + 43, years)
# Bullet content below
text_y = line_y - 30
for bullet in bullets[:3]:
c.setFillColor(TEAL)
c.circle(col_w * i + 14, text_y + 3, 2, fill=1, stroke=0)
c.setFillColor(DARK_GRAY)
c.setFont("Helvetica", 7.5)
# Wrap text manually
words = bullet.split()
line = ""
x_start = col_w * i + 20
for word in words:
test = line + " " + word if line else word
if c.stringWidth(test, "Helvetica", 7.5) < col_w - 28:
line = test
else:
c.drawString(x_start, text_y, line)
text_y -= 10
line = word
if line:
c.drawString(x_start, text_y, line)
text_y -= 13
class RiskTable(Flowable):
"""Clean risk management table"""
def __init__(self, rows, width=None):
Flowable.__init__(self)
self.rows = rows
self._width = width
self.row_h = 36
self.height = 30 + self.row_h * len(rows)
def wrap(self, availWidth, availHeight):
self.width = self._width or availWidth
return self.width, self.height
def draw(self):
c = self.canv
col1 = self.width * 0.32
col2 = self.width * 0.68
y = self.height
# Header
c.setFillColor(NAVY)
c.rect(0, y - 28, self.width, 28, fill=1, stroke=0)
c.setFillColor(GOLD_LIGHT)
c.setFont("Helvetica-Bold", 9)
c.drawString(10, y - 18, "RISK FACTOR")
c.drawString(col1 + 10, y - 18, "MITIGATION STRATEGY")
y -= 28
for i, (risk, mitigation) in enumerate(self.rows):
bg = PALE_BLUE if i % 2 == 0 else WHITE
c.setFillColor(bg)
c.rect(0, y - self.row_h, self.width, self.row_h, fill=1, stroke=0)
# Left border accent
c.setFillColor(TEAL if i % 2 == 0 else ROYAL)
c.rect(0, y - self.row_h, 3, self.row_h, fill=1, stroke=0)
# Grid lines
c.setStrokeColor(MID_GRAY)
c.setLineWidth(0.4)
c.line(0, y, self.width, y)
c.line(col1, y, col1, y - self.row_h)
# Risk text
c.setFillColor(NAVY)
c.setFont("Helvetica-Bold", 9)
c.drawString(10, y - 14, risk)
# Mitigation text (wrap)
c.setFillColor(DARK_GRAY)
c.setFont("Helvetica", 8.5)
words = mitigation.split()
line = ""
ly = y - 13
for word in words:
test = line + " " + word if line else word
if c.stringWidth(test, "Helvetica", 8.5) < col2 - 20:
line = test
else:
c.drawString(col1 + 10, ly, line)
ly -= 11
line = word
if line:
c.drawString(col1 + 10, ly, line)
y -= self.row_h
# Bottom border
c.setStrokeColor(NAVY)
c.setLineWidth(0.8)
c.line(0, y, self.width, y)
# ─── PAGE TEMPLATES ───────────────────────────────────────────────────────────
class CoverPageCanvas:
"""Draws the full cover page background"""
@staticmethod
def draw(c, doc):
c.saveState()
w, h = A4
# Deep navy full background
c.setFillColor(NAVY)
c.rect(0, 0, w, h, fill=1, stroke=0)
# Royal blue upper band (hero)
c.setFillColor(ROYAL)
c.rect(0, h * 0.52, w, h * 0.48, fill=1, stroke=0)
# Teal diagonal accent strip
c.setFillColor(TEAL)
path = c.beginPath()
path.moveTo(0, h * 0.52)
path.lineTo(w, h * 0.52)
path.lineTo(w, h * 0.48)
path.lineTo(0, h * 0.50)
path.close()
c.drawPath(path, fill=1, stroke=0)
# Gold horizontal rule lines
c.setStrokeColor(GOLD)
c.setLineWidth(1.5)
c.line(30, h * 0.50 - 2, w - 30, h * 0.50 - 2)
c.setStrokeColor(GOLD_LIGHT)
c.setLineWidth(0.5)
c.line(30, h * 0.50 - 6, w - 30, h * 0.50 - 6)
# Medical cross watermark (subtle)
c.setFillColor(colors.HexColor("#162558"))
cross_cx, cross_cy = w * 0.85, h * 0.75
cw, ch = 60, 60
c.rect(cross_cx - 8, cross_cy - ch/2, 16, ch, fill=1, stroke=0)
c.rect(cross_cx - cw/2, cross_cy - 8, cw, 16, fill=1, stroke=0)
# Decorative circles
c.setStrokeColor(colors.HexColor("#1E3A6E"))
c.setLineWidth(1)
c.circle(w * 0.1, h * 0.78, 55, fill=0, stroke=1)
c.circle(w * 0.1, h * 0.78, 40, fill=0, stroke=1)
c.circle(w * 0.1, h * 0.78, 25, fill=0, stroke=1)
c.setStrokeColor(colors.HexColor("#1E3A6E"))
c.circle(w * 0.88, h * 0.85, 40, fill=0, stroke=1)
# University banner at top
c.setFillColor(colors.HexColor("#0A1530"))
c.rect(0, h - 55, w, 55, fill=1, stroke=0)
c.setFillColor(GOLD_LIGHT)
c.setFont("Helvetica-Bold", 9)
c.drawCentredString(w/2, h - 22, "SHANDONG MEDICAL AND PHARMACEUTICAL UNIVERSITY")
c.setFillColor(colors.HexColor("#A8C4E8"))
c.setFont("Helvetica", 8)
c.drawCentredString(w/2, h - 36, "Faculty of Clinical Medicine · International Education Department")
# Gold top border
c.setFillColor(GOLD)
c.rect(0, h - 4, w, 4, fill=1, stroke=0)
# Bottom area: info box background
c.setFillColor(colors.HexColor("#0A1530"))
c.roundRect(30, 28, w - 60, h * 0.46 - 40, 8, fill=1, stroke=0)
c.setStrokeColor(TEAL)
c.setLineWidth(1)
c.roundRect(30, 28, w - 60, h * 0.46 - 40, 8, fill=0, stroke=1)
# Thin gold bottom strip
c.setFillColor(GOLD)
c.rect(0, 0, w, 4, fill=1, stroke=0)
c.restoreState()
class InnerPageCanvas:
"""Draws header/footer on inner pages"""
@staticmethod
def draw(c, doc):
c.saveState()
w, h = A4
# Header: navy bar
c.setFillColor(NAVY)
c.rect(0, h - 32, w, 32, fill=1, stroke=0)
# Gold top edge
c.setFillColor(GOLD)
c.rect(0, h - 3, w, 3, fill=1, stroke=0)
# Header text
c.setFillColor(colors.HexColor("#A8C4E8"))
c.setFont("Helvetica", 7.5)
c.drawString(MARGIN_L, h - 20, "Personal Career Development Plan · Junaid Wahid · 235019015")
c.setFillColor(GOLD_LIGHT)
c.setFont("Helvetica-Bold", 7.5)
c.drawRightString(w - MARGIN_R, h - 20, "Clinical Medicine · Neurosurgery")
# Footer
c.setFillColor(PALE_BLUE)
c.rect(0, 0, w, 26, fill=1, stroke=0)
c.setStrokeColor(TEAL)
c.setLineWidth(0.6)
c.line(MARGIN_L, 26, w - MARGIN_R, 26)
c.setFillColor(DARK_GRAY)
c.setFont("Helvetica", 7.5)
c.drawString(MARGIN_L, 9, "Shandong Medical and Pharmaceutical University · May 2026")
# Page number
c.setFillColor(NAVY)
c.setFont("Helvetica-Bold", 8)
c.drawRightString(w - MARGIN_R, 9, f"Page {doc.page}")
c.restoreState()
def on_cover_page(canvas_obj, doc):
CoverPageCanvas.draw(canvas_obj, doc)
def on_inner_page(canvas_obj, doc):
InnerPageCanvas.draw(canvas_obj, doc)
# ─── DOCUMENT BUILD ───────────────────────────────────────────────────────────
def build_pdf():
S = make_styles()
# Frame for cover (full bleed, content positioned manually)
cover_frame = Frame(
MARGIN_L, MARGIN_B + 15,
PAGE_W - MARGIN_L - MARGIN_R,
PAGE_H - MARGIN_T - MARGIN_B,
id="cover"
)
inner_frame = Frame(
MARGIN_L, MARGIN_B + 30,
PAGE_W - MARGIN_L - MARGIN_R,
PAGE_H - MARGIN_T - MARGIN_B - 40,
id="inner", leftPadding=0, rightPadding=0,
topPadding=0, bottomPadding=0
)
doc = BaseDocTemplate(
OUTPUT,
pagesize=A4,
leftMargin=MARGIN_L,
rightMargin=MARGIN_R,
topMargin=MARGIN_T,
bottomMargin=MARGIN_B,
title="Personal Career Development Plan",
author="Junaid Wahid",
subject="Clinical Medicine - Neurosurgery Career Plan",
)
cover_template = PageTemplate(id="Cover", frames=[cover_frame], onPage=on_cover_page)
inner_template = PageTemplate(id="Inner", frames=[inner_frame], onPage=on_inner_page)
doc.addPageTemplates([cover_template, inner_template])
story = []
# ── COVER PAGE ────────────────────────────────────────────────────────────
# Title area (placed in upper half)
story.append(Spacer(1, 4.8 * cm))
story.append(Paragraph("Personal Career Development Plan", S["cover_title"]))
story.append(Spacer(1, 0.3 * cm))
story.append(Paragraph(
"A Structured Pathway Toward Becoming a Neurosurgeon",
S["cover_subtitle"]
))
story.append(Spacer(1, 0.2 * cm))
# Gold decorative line under subtitle (drawn as thin HR)
story.append(HRFlowable(
width=BODY_W * 0.5, thickness=1, color=GOLD_LIGHT,
hAlign="CENTER", spaceAfter=6
))
story.append(Spacer(1, 0.2 * cm))
story.append(Paragraph(
"Clinical Medicine · 4th Year · International Program",
S["cover_info"]
))
story.append(Spacer(1, 1.1 * cm))
# Profile box data
profile_data = [
("Student Name", "Junaid Wahid"),
("Student ID", "235019015"),
("Major / Program", "Clinical Medicine (MBBS)"),
("Academic Year", "4th Year"),
("Target Specialty","Neurosurgery"),
("University", "Shandong Medical and Pharmaceutical University"),
("Submission Date", "24 May 2026"),
]
story.append(ProfileCard(profile_data, width=BODY_W))
# Page break → go to Inner template
story.append(NextPageTemplate("Inner"))
story.append(PageBreak())
# ── TABLE OF CONTENTS ─────────────────────────────────────────────────────
story.append(SectionHeaderBlock("CONTENTS", "Table of Contents", width=BODY_W))
story.append(Spacer(1, 0.5 * cm))
toc_items = [
("01", "Career Vision", "3"),
("02", "Personal Profile Summary", "3"),
("03", "Self-Assessment Analysis", "4"),
("04", "Career Environment Scan", "5"),
("05", "Goal System Construction", "6"),
("06", "Implementation Pathway Design", "7"),
("07", "Risk Management Plan", "8"),
("08", "Conclusion / Final Statement", "9"),
]
toc_sub_items = {
"03": [
"3.1 Clarification of Professional Values",
"3.2 Competency Matrix Evaluation",
"3.3 Career Personality Positioning",
],
"04": [
"4.1 Target Region Practice Landscape",
"4.2 Industry Trend Analysis",
],
"05": [
"5.1 Short-Term Goals: Before Graduation",
"5.2 Mid-Term Goals: Five Years After Graduation",
"5.3 Long-Term Goals: Ten Years After Graduation",
],
"06": [
"6.1 Academic Preparation Phase",
"6.2 Credentialing Phase",
"6.3 Specialization Phase",
],
"07": [
"7.1 Major Risk Response",
"7.2 Dynamic Evaluation Mechanism",
],
}
for num, title, page in toc_items:
# Build dot leader row
dot_count = 60
# Use a Table for dot leaders
num_para = Paragraph(f'<font color="#B8922A"><b>{num}</b></font>', S["toc_entry"])
title_para = Paragraph(f'<font color="#0D1B3E"><b>{title}</b></font>', S["toc_entry"])
dots_para = Paragraph(
'<font color="#C8D0DC">' + '.' * dot_count + '</font>',
ParagraphStyle("dots", fontName="Helvetica", fontSize=9, leading=22, textColor=MID_GRAY)
)
page_para = Paragraph(
f'<font color="#1A4A8A"><b>{page}</b></font>',
ParagraphStyle("pg", fontName="Helvetica-Bold", fontSize=10, leading=22, alignment=TA_RIGHT)
)
toc_row = Table(
[[num_para, title_para, dots_para, page_para]],
colWidths=[1.2 * cm, 8.5 * cm, None, 1.2 * cm],
hAlign="LEFT"
)
toc_row.setStyle(TableStyle([
("VALIGN", (0, 0), (-1, -1), "MIDDLE"),
("LEFTPADDING", (0, 0), (-1, -1), 2),
("RIGHTPADDING", (0, 0), (-1, -1), 2),
]))
story.append(toc_row)
# Sub-items
if num in toc_sub_items:
for sub in toc_sub_items[num]:
story.append(Paragraph(f"<font color='#6B7A96'>› {sub}</font>", S["toc_sub"]))
story.append(Spacer(1, 2))
story.append(Spacer(1, 0.4 * cm))
story.append(NavyTealDivider(width=BODY_W))
story.append(Spacer(1, 0.2 * cm))
story.append(Paragraph(
"This document has been prepared as a formal academic submission in fulfilment of the "
"Personal Career Development Plan requirement for the Clinical Medicine programme.",
S["caption"]
))
story.append(PageBreak())
# ─── HELPER: section + subsection ─────────────────────────────────────────
def section(num, title):
story.append(Spacer(1, 0.15 * cm))
story.append(SectionHeaderBlock(num, title, width=BODY_W))
story.append(Spacer(1, 0.35 * cm))
def subsection(title):
story.append(Spacer(1, 0.2 * cm))
story.append(SubSectionBar(title, width=BODY_W))
story.append(Spacer(1, 0.25 * cm))
def body(text):
story.append(Paragraph(text, S["body"]))
def bullet(text):
story.append(Paragraph(
f'<bullet><font color="#0A7EA4">•</font></bullet>{text}',
S["bullet"]
))
def spacer(h=0.3):
story.append(Spacer(1, h * cm))
def gold_div():
story.append(GoldDivider(width=BODY_W))
story.append(Spacer(1, 0.2 * cm))
# ─── 01 CAREER VISION ────────────────────────────────────────────────────
section("01", "Career Vision")
body(
"The central ambition driving this career plan is to become a highly competent, ethically grounded, "
"and internationally minded neurosurgeon capable of diagnosing and treating the full spectrum of "
"neurological and neurosurgical conditions with skill, precision, and compassion. Neurosurgery "
"represents one of the most demanding yet profoundly meaningful disciplines in clinical medicine, "
"sitting at the intersection of advanced scientific knowledge, exceptional technical skill, and "
"deep human responsibility. The long-term vision is not merely to attain a surgical qualification, "
"but to build a career defined by genuine patient service, continuous scientific engagement, and "
"a commitment to improving neurosurgical care in Pakistan and beyond."
)
body(
"This vision is shaped by the belief that the best physicians are those who remain learners throughout "
"their professional lives, who hold their patients' welfare above all institutional pressures, and who "
"pursue excellence not for recognition but out of a sincere duty to serve. The journey described in "
"this document is guided by that belief at every stage, from the final years of medical school through "
"to independent specialist practice."
)
gold_div()
# ─── 02 PERSONAL PROFILE SUMMARY ─────────────────────────────────────────
section("02", "Personal Profile Summary")
profile_rows = [
["Full Name", "Junaid Wahid"],
["Student ID", "235019015"],
["Major", "Clinical Medicine (MBBS International Program)"],
["Academic Year", "Fourth Year"],
["Target Specialty", "Neurosurgery"],
["University", "Shandong Medical and Pharmaceutical University, China"],
["Core Identity", "Aspiring neurosurgeon, evidence-based clinician, cross-cultural practitioner"],
]
tbl = Table(
profile_rows,
colWidths=[4.5 * cm, BODY_W - 4.5 * cm],
hAlign="LEFT"
)
tbl.setStyle(TableStyle([
("BACKGROUND", (0, 0), (0, -1), PALE_BLUE),
("BACKGROUND", (1, 0), (1, -1), WHITE),
("TEXTCOLOR", (0, 0), (0, -1), TEAL),
("TEXTCOLOR", (1, 0), (1, -1), NAVY),
("FONTNAME", (0, 0), (0, -1), "Helvetica-Bold"),
("FONTNAME", (1, 0), (1, -1), "Helvetica"),
("FONTSIZE", (0, 0), (-1, -1), 9.5),
("LEADING", (0, 0), (-1, -1), 15),
("ROWBACKGROUNDS",(0, 0), (-1, -1), [PALE_BLUE, colors.HexColor("#EEF3FB")]),
("BOX", (0, 0), (-1, -1), 1, TEAL),
("INNERGRID", (0, 0), (-1, -1), 0.4, MID_GRAY),
("LEFTPADDING", (0, 0), (-1, -1), 10),
("RIGHTPADDING", (0, 0), (-1, -1), 10),
("TOPPADDING", (0, 0), (-1, -1), 6),
("BOTTOMPADDING", (0, 0), (-1, -1), 6),
("VALIGN", (0, 0), (-1, -1), "MIDDLE"),
]))
story.append(tbl)
spacer(0.3)
gold_div()
# ─── 03 SELF-ASSESSMENT ANALYSIS ─────────────────────────────────────────
section("03", "Self-Assessment Analysis")
subsection("3.1 Clarification of Professional Values")
body(
"The decision to pursue medicine arose from a deeply personal recognition of the value of human "
"life and the profound difference that a skilled, caring physician can make in moments of vulnerability. "
"From early clinical exposure, it became clear that medicine demands not only intellectual rigour but "
"also an enduring commitment to compassion, responsibility, and service. These values have been "
"reinforced through years of academic training, clinical observation, and cross-cultural experience "
"in China, where exposure to a high-volume, technologically advanced healthcare environment has "
"broadened both clinical perspective and professional aspiration."
)
body(
"Neurosurgery was identified as the preferred specialty because it combines the highest levels of "
"diagnostic precision with the most direct and consequential forms of therapeutic intervention. "
"Conditions of the brain and spinal cord affect every dimension of a patient's existence, from "
"movement and cognition to identity itself. The opportunity to intervene meaningfully in such cases, "
"guided by evidence and surgical mastery, represents the highest expression of what it means to be "
"a physician. The specialty also demands lifelong learning, technical refinement, and research "
"engagement, all of which align with a deeply held commitment to professional excellence."
)
subsection("3.2 Competency Matrix Evaluation")
body(
"An honest evaluation of current competencies reveals a set of meaningful strengths alongside "
"clearly identified areas for further development. The following matrix summarises this assessment:"
)
comp_data = [
["STRENGTH AREA", "LEVEL", "NOTES"],
["Diagnostic History Taking", "Strong", "Systematic, patient-centred approach"],
["Clinical Reasoning", "Strong", "Hypothesis-driven differential thinking"],
["Emergency Judgment", "Developing","Improving with simulation experience"],
["Medical Communication", "Strong", "Effective in English and Mandarin contexts"],
["Cross-Cultural Adaptability","Excellent", "Sustained by 4 years of study in China"],
["Surgical Procedural Skills", "Early-stage","Requires structured supervised exposure"],
["Advanced Decision-Making", "Developing","Growing through case study and mentorship"],
["Research Literacy", "Moderate", "Evidence appraisal skills actively developing"],
]
comp_tbl = Table(
comp_data,
colWidths=[6.0 * cm, 3.0 * cm, BODY_W - 9.0 * cm],
hAlign="LEFT"
)
comp_tbl.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, 0), NAVY),
("TEXTCOLOR", (0, 0), (-1, 0), GOLD_LIGHT),
("FONTNAME", (0, 0), (-1, 0), "Helvetica-Bold"),
("FONTSIZE", (0, 0), (-1, -1), 8.5),
("FONTNAME", (0, 1), (-1, -1), "Helvetica"),
("TEXTCOLOR", (0, 1), (-1, -1), DARK_GRAY),
("ROWBACKGROUNDS",(0, 1), (-1, -1), [WHITE, PALE_BLUE]),
("BOX", (0, 0), (-1, -1), 1, NAVY),
("INNERGRID", (0, 0), (-1, -1), 0.4, MID_GRAY),
("LEFTPADDING", (0, 0), (-1, -1), 8),
("RIGHTPADDING", (0, 0), (-1, -1), 8),
("TOPPADDING", (0, 0), (-1, -1), 5),
("BOTTOMPADDING", (0, 0), (-1, -1), 5),
("VALIGN", (0, 0), (-1, -1), "MIDDLE"),
("ALIGN", (1, 0), (1, -1), "CENTER"),
]))
story.append(comp_tbl)
spacer(0.2)
subsection("3.3 Career Personality Positioning")
body(
"Using the Holland Occupational Codes (RIASEC) framework as a reference point, the dominant "
"personality profile can be characterised as <b>Investigative (I), Realistic (R), and Social (S)</b>. "
"The Investigative dimension reflects an inherent drive to analyse, question, and understand complex "
"systems, a trait directly applicable to the diagnostic reasoning and research demands of neurosurgery. "
"The Realistic dimension captures a preference for concrete, hands-on problem solving and technical "
"mastery, which aligns closely with the precision and procedural nature of surgical practice. The "
"Social dimension reflects a genuine orientation toward patient care, communication, and the relational "
"dimensions of medicine that are too often undervalued in highly technical specialties."
)
body(
"This combination of traits supports a career in neurosurgery precisely because the specialty requires "
"not only technical excellence and intellectual depth, but also the capacity to engage meaningfully "
"with patients and families during periods of extreme vulnerability. A neurosurgeon who lacks the "
"social dimension risks becoming technically proficient but humanly absent, a deficit that this career "
"plan is explicitly designed to guard against."
)
story.append(PageBreak())
# ─── 04 CAREER ENVIRONMENT SCAN ──────────────────────────────────────────
section("04", "Career Environment Scan")
subsection("4.1 Target Region Practice Landscape")
body(
"Upon completion of the MBBS programme, the plan is to return to Pakistan, where there exists both "
"a significant need for well-trained neurosurgical specialists and a structured pathway toward "
"specialist qualification. The first step upon return will be to sit and pass the <b>Pakistan Medical "
"and Dental Council (PMDC)</b> licensing examination, which is a mandatory requirement for any "
"internationally trained graduate seeking registration to practice in Pakistan."
)
body(
"The primary specialist training route is the <b>Fellowship of the College of Physicians and Surgeons "
"Pakistan (FCPS)</b> in Neurosurgery, which involves a structured multi-year residency programme at "
"an accredited training institution. This route is the most recognised and accessible pathway within "
"Pakistan, and preparation for its Part I examination will begin well before graduation."
)
body(
"Parallel to the domestic pathway, international options will remain under active consideration. "
"These include the <b>United States Medical Licensing Examination (USMLE)</b> for those seeking "
"residency training in the United States, the <b>Professional and Linguistic Assessments Board (PLAB)</b> "
"examination for the United Kingdom, and the <b>Australian Medical Council (AMC)</b> examination "
"for Australia. Maintaining awareness of these alternative pathways ensures resilience and flexibility "
"in the face of policy changes or limited domestic training opportunities."
)
subsection("4.2 Industry Trend Analysis")
body(
"The landscape of modern neurosurgery is being reshaped by a convergence of technological, "
"analytical, and educational forces that a new generation of surgeons must be prepared to engage "
"with from the earliest stages of their careers. Key developments include:"
)
bullet("Artificial intelligence applications in neuroimaging analysis, tumour segmentation, and preoperative surgical planning")
bullet("High-resolution digital imaging modalities including functional MRI, diffusion tensor imaging, and intraoperative neuronavigation")
bullet("Minimally invasive and endoscopic neurosurgical techniques that require refined technical training beyond traditional open surgical exposure")
bullet("Wearable and implantable monitoring technologies for postoperative neurological surveillance and remote patient management")
bullet("A global shift toward evidence-based medicine, requiring all clinicians to engage critically with primary literature and clinical guidelines")
spacer(0.2)
body(
"These trends collectively reinforce the need for the modern neurosurgeon to be not only a skilled "
"technical operator but also a technically literate, data-informed, and research-engaged clinician. "
"Continuous professional development will be a non-negotiable component of long-term career success, "
"and this plan is designed with that reality explicitly in mind."
)
story.append(PageBreak())
# ─── 05 GOAL SYSTEM CONSTRUCTION ─────────────────────────────────────────
section("05", "Goal System Construction")
# Timeline visual
timeline_phases = [
(
"SHORT-TERM",
"Before Graduation (2026)",
[
"Strengthen core clinical knowledge",
"Master case presentation skills",
"Complete in-depth case reports",
]
),
(
"MID-TERM",
"1–5 Years Post-Graduation",
[
"Complete licensing (PMDC/FCPS Part I)",
"Enter specialist training programme",
"Engage in clinical research",
]
),
(
"LONG-TERM",
"5–10 Years Post-Graduation",
[
"Qualify as a neurosurgeon",
"Serve patients in Pakistan",
"Build academic collaborations",
]
),
]
story.append(TimelineFlowable(timeline_phases, width=BODY_W))
spacer(0.3)
subsection("5.1 Short-Term Goals: Before Graduation")
bullet("Achieve thorough command of all core clinical medicine subjects, with particular depth in neurology, anatomy, and pharmacology")
bullet("Develop proficiency in structured case presentation, systematic history taking, and clinical reasoning frameworks")
bullet("Complete at least two substantive case reports or clinical analyses to build research writing skills")
bullet("Strengthen English academic reading and medical communication for international professional engagement")
bullet("Begin preparatory review of FCPS Part I neurosurgery content and USMLE Step 1 foundations")
bullet("Seek mentorship from attending physicians with experience in surgery or neurology")
spacer(0.2)
subsection("5.2 Mid-Term Goals: Five Years After Graduation")
bullet("Successfully complete the PMDC licensing examination and secure full registration to practice in Pakistan")
bullet("Enter and progress through a recognised FCPS neurosurgery training programme at an accredited tertiary institution")
bullet("Build surgical discipline through structured exposure to operative neurosurgery under senior supervision")
bullet("Participate in hospital-based or multicentre clinical research and contribute to at least one peer-reviewed publication")
bullet("Establish mentorship relationships with senior neurosurgeons and gain exposure to subspecialty areas")
bullet("Attend relevant national and international conferences to build professional networks and academic awareness")
spacer(0.2)
subsection("5.3 Long-Term Goals: Ten Years After Graduation")
bullet("Attain full qualification as a Fellow in Neurosurgery (FCPS or equivalent international fellowship)")
bullet("Establish an independent clinical practice providing high-quality neurosurgical care to patients across Pakistan")
bullet("Contribute to the advancement of neurosurgical standards through research, teaching, and institutional engagement")
bullet("Build cross-border professional collaborations, particularly with institutions in China, to facilitate knowledge exchange")
bullet("Serve as a mentor and educator for the next generation of surgical trainees")
gold_div()
story.append(PageBreak())
# ─── 06 IMPLEMENTATION PATHWAY DESIGN ────────────────────────────────────
section("06", "Implementation Pathway Design")
subsection("6.1 Academic Preparation Phase: During Studies (2024–2026)")
body(
"The immediate academic phase is focused on systematic consolidation and targeted improvement. "
"A structured study programme will be adopted in which one identified weakness is addressed "
"each semester, ensuring continuous measurable progress rather than diffuse effort. Priority "
"areas include:"
)
bullet("Surgical anatomy: deep review of neuroanatomy, spinal column structure, and cranial nerve pathways")
bullet("Electrocardiogram interpretation and cardiac emergencies as part of comprehensive clinical readiness")
bullet("Emergency medicine principles including airway management, resuscitation protocols, and trauma response")
bullet("Structured case analysis through systematic review of real clinical cases with attending supervision")
bullet("Active engagement with research methodology to build the skills required for postgraduate research")
spacer(0.2)
body(
"Mentorship will be sought actively and maintained consistently. Learning from attending physicians, "
"senior residents, and international faculty will supplement formal curriculum delivery and accelerate "
"professional maturity."
)
subsection("6.2 Credentialing Phase: One to Two Years After Graduation (2026–2028)")
body(
"The credentialing phase is a period of focused preparation and formal examination. A structured "
"daily study system will be established from the final months of the undergraduate programme, "
"ensuring no gap between graduation and active preparation for licensing."
)
bullet("Systematic PMDC examination preparation using approved study guides, past papers, and clinical case banks")
bullet("Simultaneous preparation of all required documentation including transcripts, internship certifications, and reference letters")
bullet("Parallel study of FCPS Part I neurosurgery content to reduce time to specialist training entry")
bullet("Maintenance of at least one international pathway (USMLE Step 1) as a contingency option")
bullet("Engagement in supervised clinical work during internship to consolidate practical skills and build professional references")
spacer(0.2)
subsection("6.3 Specialization Phase: Three to Five Years After Graduation (2028–2031)")
body(
"The specialisation phase marks the transition from licensed general practitioner to surgical trainee, "
"and demands the greatest investment of focus, time, and professional commitment."
)
bullet("Building a comprehensive theoretical foundation in neurosurgical pathology, neuroradiology, and operative principles")
bullet("Acquiring structured operative exposure through supervised participation in increasing complexity of neurosurgical procedures")
bullet("Attending neurosurgery-specific workshops, cadaveric dissection courses, and simulation training programmes")
bullet("Observing and learning from experienced neurosurgeons in tertiary referral centres, including potential international elective placements")
bullet("Developing academic presentation skills through conference presentations and departmental case discussions")
bullet("Initiating an original research project appropriate for publication in a peer-reviewed surgical journal")
gold_div()
story.append(PageBreak())
# ─── 07 RISK MANAGEMENT PLAN ─────────────────────────────────────────────
section("07", "Risk Management Plan")
subsection("7.1 Major Risk Response")
risk_rows = [
("Licensing Exam Failure",
"Allocate additional preparation time of 3–6 months; consider transitional clinical or research roles; maintain financial planning to support extended preparation period."),
("Policy or Visa Changes",
"Maintain active preparation on two parallel licensing pathways (PMDC + USMLE or PLAB); keep documentation current for multiple jurisdictions."),
("Burnout & Mental Health",
"Implement structured rest cycles; maintain physical activity, social connection, and mindfulness practices; seek formal support when early warning signs appear."),
("Limited Training Positions",
"Build a broad professional network early; seek positions at multiple institutions simultaneously; consider fellowship opportunities abroad if domestic slots are limited."),
("Financial Constraints",
"Research scholarship and bursary options proactively; plan postgraduate finances before graduation; explore employer-sponsored training arrangements."),
("Technology Skill Gap",
"Engage in self-directed digital learning; seek training in neuronavigation and imaging software during residency; attend relevant technology workshops."),
]
story.append(RiskTable(risk_rows, width=BODY_W))
spacer(0.3)
subsection("7.2 Dynamic Evaluation Mechanism")
body(
"A career plan of this scope requires not only strong initial design but also a disciplined "
"ongoing process of review and revision. Rigid adherence to a fixed plan in the face of changing "
"circumstances would be counterproductive; the plan must instead be treated as a living document "
"that responds intelligently to new information and evolving conditions."
)
eval_data = [
["REVIEW FREQUENCY", "REVIEW FOCUS", "KEY ACTIONS"],
["Quarterly", "Goal progress", "Track milestones; identify gaps; adjust study schedule"],
["Annual", "Full plan revision", "Review with mentor; update pathways; revise timelines"],
["Post-Examination", "Results analysis", "Identify weak areas; plan targeted remediation"],
["Career Transitions","Strategic realignment","Consult senior advisors; reassess international options"],
]
eval_tbl = Table(
eval_data,
colWidths=[3.8 * cm, 4.0 * cm, BODY_W - 7.8 * cm],
hAlign="LEFT"
)
eval_tbl.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, 0), ROYAL),
("TEXTCOLOR", (0, 0), (-1, 0), WHITE),
("FONTNAME", (0, 0), (-1, 0), "Helvetica-Bold"),
("FONTSIZE", (0, 0), (-1, -1), 8.5),
("FONTNAME", (0, 1), (-1, -1), "Helvetica"),
("TEXTCOLOR", (0, 1), (-1, -1), DARK_GRAY),
("ROWBACKGROUNDS",(0, 1), (-1, -1), [WHITE, PALE_BLUE]),
("BOX", (0, 0), (-1, -1), 1, ROYAL),
("INNERGRID", (0, 0), (-1, -1), 0.4, MID_GRAY),
("LEFTPADDING", (0, 0), (-1, -1), 8),
("RIGHTPADDING", (0, 0), (-1, -1), 8),
("TOPPADDING", (0, 0), (-1, -1), 5),
("BOTTOMPADDING", (0, 0), (-1, -1), 5),
("VALIGN", (0, 0), (-1, -1), "MIDDLE"),
]))
story.append(eval_tbl)
spacer(0.3)
gold_div()
story.append(PageBreak())
# ─── 08 CONCLUSION ────────────────────────────────────────────────────────
section("08", "Conclusion / Final Statement")
body(
"This career development plan has been constructed with care, honesty, and a genuine sense of "
"long-term purpose. It is grounded in a clear professional vision, supported by an honest "
"assessment of current capabilities, informed by an understanding of the clinical environment, "
"and organised around a realistic and achievable sequence of goals."
)
body(
"Becoming a neurosurgeon is one of the most demanding ambitions a medical student can hold. "
"It requires years of rigorous academic preparation, sustained surgical training, and the kind "
"of personal discipline that does not waver under pressure or fatigue. It requires, above all, "
"an unwavering commitment to the patient, whose life may depend on the quality of judgment "
"exercised in the operating theatre. That responsibility is understood, and it is embraced."
)
body(
"The academic formation received at Shandong Medical and Pharmaceutical University, combined "
"with the cross-cultural experience of studying and working in China, has laid a strong "
"foundation for the career described in this document. The years ahead will demand more, but "
"the direction is clear, the commitment is firm, and the motivation is genuine."
)
spacer(0.3)
# Final quote box
quote_data = [[
Paragraph(
'"The practice of medicine is an art, not a trade; a calling, not a business; '
'a calling in which your heart will be exercised equally with your head."',
S["conclusion"]
)
]]
quote_tbl = Table(
quote_data,
colWidths=[BODY_W],
hAlign="CENTER"
)
quote_tbl.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, -1), PALE_BLUE),
("BOX", (0, 0), (-1, -1), 1.5, GOLD),
("LEFTPADDING", (0, 0), (-1, -1), 20),
("RIGHTPADDING", (0, 0), (-1, -1), 20),
("TOPPADDING", (0, 0), (-1, -1), 14),
("BOTTOMPADDING", (0, 0), (-1, -1), 14),
]))
story.append(quote_tbl)
spacer(0.2)
story.append(Paragraph(
"— Sir William Osler",
ParagraphStyle("quoteattr", fontName="Helvetica-BoldOblique", fontSize=9,
textColor=GOLD, alignment=TA_RIGHT)
))
spacer(0.4)
gold_div()
# Signature block
sig_data = [
[
Paragraph("<b>Student Name:</b> Junaid Wahid", S["body"]),
Paragraph("<b>Student ID:</b> 235019015", S["body"]),
Paragraph("<b>Date:</b> 24 May 2026", S["body"]),
]
]
sig_tbl = Table(sig_data, colWidths=[BODY_W / 3] * 3, hAlign="LEFT")
sig_tbl.setStyle(TableStyle([
("VALIGN", (0, 0), (-1, -1), "TOP"),
("LEFTPADDING", (0, 0), (-1, -1), 0),
("RIGHTPADDING", (0, 0), (-1, -1), 10),
]))
story.append(sig_tbl)
spacer(0.3)
story.append(Paragraph(
"Submitted in partial fulfilment of the career development requirements for the "
"Clinical Medicine programme, Shandong Medical and Pharmaceutical University, China.",
S["caption"]
))
# ── BUILD ─────────────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF created: {OUTPUT}")
print(f"File size: {os.path.getsize(OUTPUT):,} bytes")
if __name__ == "__main__":
build_pdf()
cd /home/daytona/workspace/career-plan && python3 build_pdf.py 2>&1
python3 -c " from pypdf import PdfReader r = PdfReader('/home/daytona/workspace/…
Junaid Wahid Career Development Plan
PDF Document · PDF
Just change the first cover page coloring and layout to more beautiful layout and colors and make pages less than now, merge contents sub headings closer and don't let more spaces in between each section
~/career-plan/build_pdf.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/career-plan/build_pdf.py'
~/career-plan/build_pdf.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/career-plan/build_pdf.py'
~/career-plan/build_pdf.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/career-plan/build_pdf.py'
~/career-plan/build_pdf.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/career-plan/build_pdf.py'
~/career-plan/build_pdf.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/career-plan/build_pdf.py'
~/career-plan/build_pdf.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/career-plan/build_pdf.py'
~/career-plan/build_pdf.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/career-plan/build_pdf.py'
~/career-plan/build_pdf.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/career-plan/build_pdf.py'
~/career-plan/build_pdf.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/career-plan/build_pdf.py'
~/career-plan/build_pdf.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/career-plan/build_pdf.py'
~/career-plan/build_pdf.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/career-plan/build_pdf.py'
~/career-plan/build_pdf.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/career-plan/build_pdf.py'
cd /home/daytona/workspace/career-plan && python3 build_pdf.py 2>&1
python3 -c " from pypdf import PdfReader r = PdfReader('/home/daytona/workspace/…
Junaid Wahid Career Development Plan
PDF Document · PDF
Some words or headings are overlaping each other and the color grading in cover page is still not good, make cover page light coloring combination and make every heading clear and non overlaping on other part, also don't give so much space between each part like you have left page 7 and page later than that empty which is not good, take the other part starts just after one ends and Don't leave empty pages with just one or two sentences given. Do it professionally one final
~/career-plan/build_pdf.py
#!/usr/bin/env python3
"""
Premium Personal Career Development Plan PDF – Final Version
Junaid Wahid · Clinical Medicine · Shandong Medical and Pharmaceutical University
"""
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import cm
from reportlab.lib.styles import ParagraphStyle
from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_RIGHT, TA_JUSTIFY
from reportlab.platypus import (
BaseDocTemplate, PageTemplate, Frame, Paragraph, Spacer,
Table, TableStyle, HRFlowable, PageBreak, KeepTogether, NextPageTemplate
)
from reportlab.platypus.flowables import Flowable
import os
# ═══════════════════════════════════════════════════════════════════════════════
# COLOR PALETTE
# ═══════════════════════════════════════════════════════════════════════════════
# Inner pages – deep professional
NAVY = colors.HexColor("#0D1B3E")
ROYAL = colors.HexColor("#1A4A8A")
TEAL = colors.HexColor("#0A7EA4")
GOLD = colors.HexColor("#B8922A")
GOLD_LIGHT = colors.HexColor("#D4AF37")
WHITE = colors.white
MID_GRAY = colors.HexColor("#C8D0DC")
DARK_GRAY = colors.HexColor("#4A5568")
PALE_BLUE = colors.HexColor("#EBF1FA")
# Cover page – light, airy, sophisticated
CV_WHITE = colors.HexColor("#FFFFFF")
CV_CREAM = colors.HexColor("#F7F4EF") # warm ivory background
CV_LIGHT = colors.HexColor("#EDF2FA") # pale blue-white
CV_NAVY = colors.HexColor("#0D1B3E") # deep navy text
CV_ROYAL = colors.HexColor("#1A4A8A") # royal blue accent
CV_TEAL = colors.HexColor("#0A7EA4") # teal
CV_GOLD = colors.HexColor("#B8922A") # gold
CV_GOLD_L = colors.HexColor("#D4AF37") # bright gold
CV_STEEL = colors.HexColor("#5A7BAA") # muted steel blue
CV_BORDER = colors.HexColor("#CBD8EC") # soft border
# ═══════════════════════════════════════════════════════════════════════════════
# PAGE LAYOUT
# ═══════════════════════════════════════════════════════════════════════════════
PAGE_W, PAGE_H = A4 # 595.28 × 841.89 pt
ML = 2.0 * cm
MR = 2.0 * cm
MT = 2.2 * cm
MB = 2.0 * cm
BW = PAGE_W - ML - MR # body width ≈ 511 pt
OUTPUT = "/home/daytona/workspace/career-plan/Junaid_Wahid_Career_Development_Plan.pdf"
# ═══════════════════════════════════════════════════════════════════════════════
# STYLES
# ═══════════════════════════════════════════════════════════════════════════════
def styles():
def S(name, **kw):
return ParagraphStyle(name, **kw)
return {
# ── Cover ──────────────────────────────────────────────────
"cv_tag": S("cv_tag", fontName="Helvetica-Bold", fontSize=7.5,
textColor=CV_TEAL, alignment=TA_LEFT, letterSpacing=2,
leading=12, spaceAfter=4),
"cv_title": S("cv_title", fontName="Helvetica-Bold", fontSize=32,
textColor=CV_NAVY, alignment=TA_LEFT, leading=40,
spaceAfter=2),
"cv_sub": S("cv_sub", fontName="Helvetica", fontSize=12,
textColor=CV_STEEL, alignment=TA_LEFT, leading=18,
spaceAfter=6),
"cv_label": S("cv_label", fontName="Helvetica-Bold", fontSize=7.5,
textColor=CV_TEAL, letterSpacing=1, leading=11),
"cv_value": S("cv_value", fontName="Helvetica", fontSize=10,
textColor=CV_NAVY, leading=14),
# ── TOC ────────────────────────────────────────────────────
"toc_main": S("toc_main", fontName="Helvetica-Bold", fontSize=10.5,
textColor=NAVY, leading=17, spaceAfter=1),
"toc_sub": S("toc_sub", fontName="Helvetica", fontSize=9,
textColor=DARK_GRAY, leading=13, leftIndent=16,
spaceAfter=1),
"toc_pg": S("toc_pg", fontName="Helvetica-Bold", fontSize=10,
textColor=ROYAL, alignment=TA_RIGHT, leading=17),
# ── Body ────────────────────────────────────────────────────
"body": S("body", fontName="Helvetica", fontSize=9.5,
textColor=DARK_GRAY, leading=15, alignment=TA_JUSTIFY,
spaceAfter=5),
"bullet": S("bullet", fontName="Helvetica", fontSize=9.5,
textColor=DARK_GRAY, leading=14, leftIndent=14,
spaceAfter=2),
"caption": S("caption", fontName="Helvetica-Oblique", fontSize=8,
textColor=colors.HexColor("#8896A8"),
alignment=TA_CENTER, leading=11),
"quote": S("quote", fontName="Helvetica-Oblique", fontSize=10,
textColor=NAVY, leading=16, alignment=TA_JUSTIFY,
leftIndent=8, rightIndent=8),
"quote_attr": S("quote_attr", fontName="Helvetica-BoldOblique",
fontSize=8.5, textColor=GOLD,
alignment=TA_RIGHT, leading=12),
}
# ═══════════════════════════════════════════════════════════════════════════════
# CUSTOM FLOWABLES (all geometry validated — NO overlapping text)
# ═══════════════════════════════════════════════════════════════════════════════
class SectionBar(Flowable):
"""Navy header bar with gold left accent. Fixed height = 28 pt."""
H = 28
def __init__(self, num, title, w=None):
Flowable.__init__(self)
self.num = num
self.title = title
self._w = w
self.height = self.H
def wrap(self, aw, ah):
self.width = self._w or aw
return self.width, self.height
def draw(self):
c = self.canv
w, h = self.width, self.height
# Navy background
c.setFillColor(NAVY)
c.roundRect(0, 0, w, h, 4, fill=1, stroke=0)
# Gold left strip
c.setFillColor(GOLD)
c.rect(0, 0, 5, h, fill=1, stroke=0)
# Round-rect overlap to keep left corners rounded with strip hidden
c.setFillColor(NAVY)
c.rect(5, 0, 6, h, fill=1, stroke=0)
# Number tag (top-right, small)
c.setFillColor(GOLD_LIGHT)
c.setFont("Helvetica-Bold", 7)
c.drawRightString(w - 8, h - 10, self.num)
# Title centred vertically
c.setFillColor(WHITE)
c.setFont("Helvetica-Bold", 13)
c.drawString(14, (h - 13) / 2, self.title)
class SubBar(Flowable):
"""Pale-blue subsection bar with teal left strip. Fixed height = 20 pt."""
H = 20
def __init__(self, title, w=None):
Flowable.__init__(self)
self.title = title
self._w = w
self.height = self.H
def wrap(self, aw, ah):
self.width = self._w or aw
return self.width, self.height
def draw(self):
c = self.canv
w, h = self.width, self.height
c.setFillColor(PALE_BLUE)
c.roundRect(0, 0, w, h, 3, fill=1, stroke=0)
c.setFillColor(TEAL)
c.rect(0, 0, 4, h, fill=1, stroke=0)
c.setFillColor(ROYAL)
c.setFont("Helvetica-Bold", 10)
# Centre text vertically: baseline at (h - 10) / 2
c.drawString(12, (h - 10) / 2, self.title)
class GoldRule(Flowable):
"""Thin gold horizontal rule."""
def __init__(self, w=None, t=1.0):
Flowable.__init__(self)
self._w = w
self.t = t
self.height = self.t + 3
def wrap(self, aw, ah):
self.width = self._w or aw
return self.width, self.height
def draw(self):
self.canv.setStrokeColor(GOLD)
self.canv.setLineWidth(self.t)
self.canv.line(0, 1, self.width, 1)
class TwoToneRule(Flowable):
"""Navy + teal two-tone divider."""
def __init__(self, w=None):
Flowable.__init__(self)
self._w = w
self.height = 3
def wrap(self, aw, ah):
self.width = self._w or aw
return self.width, self.height
def draw(self):
c = self.canv
s = self.width * 0.65
c.setLineWidth(2)
c.setStrokeColor(NAVY)
c.line(0, 1.5, s, 1.5)
c.setStrokeColor(TEAL)
c.line(s, 1.5, self.width, 1.5)
class ProfileCardCover(Flowable):
"""
Light-theme profile card for cover page.
Uses only canvas primitives — no Paragraph inside draw().
Height is computed from row count.
"""
ROW_H = 22
HEADER = 26
PAD = 10
def __init__(self, rows, w=None):
Flowable.__init__(self)
self.rows = rows # [(label, value), ...]
self._w = w
self.height = self.HEADER + self.PAD + self.ROW_H * len(rows) + self.PAD + 4
def wrap(self, aw, ah):
self.width = self._w or aw
return self.width, self.height
def draw(self):
c = self.canv
w = self.width
h = self.height
rh = self.ROW_H
hdr = self.HEADER
pad = self.PAD
# Outer card: white fill, teal border
c.setFillColor(CV_WHITE)
c.setStrokeColor(CV_BORDER)
c.setLineWidth(1.2)
c.roundRect(0, 0, w, h, 6, fill=1, stroke=1)
# Header strip (navy)
c.setFillColor(CV_NAVY)
c.roundRect(0, h - hdr, w, hdr, 6, fill=1, stroke=0)
# Square off bottom of header strip
c.setFillColor(CV_NAVY)
c.rect(0, h - hdr, w, hdr / 2, fill=1, stroke=0)
# Header text
c.setFillColor(CV_GOLD_L)
c.setFont("Helvetica-Bold", 8.5)
c.drawCentredString(w / 2, h - hdr + (hdr - 8.5) / 2, "STUDENT PROFILE")
# Gold rule under header
c.setStrokeColor(CV_GOLD)
c.setLineWidth(1)
c.line(0, h - hdr, w, h - hdr)
# Rows
y_top = h - hdr - pad
for i, (label, value) in enumerate(self.rows):
ry = y_top - (i + 1) * rh
# Alternating row background
if i % 2 == 0:
c.setFillColor(CV_LIGHT)
c.rect(1, ry, w - 2, rh, fill=1, stroke=0)
# Teal dot
dot_y = ry + rh / 2
c.setFillColor(CV_TEAL)
c.circle(10, dot_y, 2.2, fill=1, stroke=0)
# Label (left half)
c.setFillColor(CV_TEAL)
c.setFont("Helvetica-Bold", 7.5)
c.drawString(18, dot_y - 3.5, label.upper())
# Value (right half, starts at 42%)
c.setFillColor(CV_NAVY)
c.setFont("Helvetica", 9.5)
# Truncate value to fit — measure width and clip
val = value
max_w = w - w * 0.42 - 12
while c.stringWidth(val, "Helvetica", 9.5) > max_w and len(val) > 4:
val = val[:-1]
if val != value:
val = val[:-1] + "…"
c.drawString(w * 0.42, dot_y - 3.5, val)
# Row separator
c.setStrokeColor(CV_BORDER)
c.setLineWidth(0.4)
c.line(1, ry, w - 1, ry)
# Bottom gold accent line
c.setStrokeColor(CV_GOLD)
c.setLineWidth(1.5)
c.line(8, 5, w - 8, 5)
class TimelineBlock(Flowable):
"""
Three-column horizontal timeline.
All text drawn with canvas — no risk of overflow.
Fixed height = 130 pt.
"""
H = 130
def __init__(self, phases, w=None):
Flowable.__init__(self)
self.phases = phases # [(title, years, [bullet, ...]), ...]
self._w = w
self.height = self.H
def wrap(self, aw, ah):
self.width = self._w or aw
return self.width, self.height
def draw(self):
c = self.canv
n = len(self.phases)
w = self.width
cw = w / n
line_y = self.H - 24
col_colors = [NAVY, ROYAL, TEAL]
# Backbone line
c.setStrokeColor(MID_GRAY)
c.setLineWidth(1.8)
c.line(cw * 0.5, line_y, w - cw * 0.5, line_y)
for i, (title, years, bullets) in enumerate(self.phases):
cx = cw * i + cw * 0.5
col = col_colors[i % len(col_colors)]
# Node circle
c.setFillColor(col)
c.circle(cx, line_y, 13, fill=1, stroke=0)
c.setFillColor(WHITE)
c.setFont("Helvetica-Bold", 9)
c.drawCentredString(cx, line_y - 4, str(i + 1))
# Label pill above node
pill_w = cw - 16
pill_h = 19
pill_x = cx - pill_w / 2
pill_y = line_y + 17
c.setFillColor(col)
c.roundRect(pill_x, pill_y, pill_w, pill_h, 4, fill=1, stroke=0)
c.setFillColor(WHITE)
c.setFont("Helvetica-Bold", 8)
c.drawCentredString(cx, pill_y + (pill_h - 8) / 2, title)
# Years below pill
c.setFillColor(GOLD)
c.setFont("Helvetica-Bold", 7)
c.drawCentredString(cx, pill_y + pill_h + 3, years)
# Bullet points below backbone
bx = cw * i + 6
by = line_y - 22
max_bw = cw - 14
for blt in bullets[:3]:
# Dot
c.setFillColor(TEAL)
c.circle(bx + 4, by + 3, 1.8, fill=1, stroke=0)
# Text — wrap manually
c.setFillColor(DARK_GRAY)
c.setFont("Helvetica", 7.5)
words = blt.split()
line_text = ""
tx = bx + 10
for word in words:
test = (line_text + " " + word).strip()
if c.stringWidth(test, "Helvetica", 7.5) <= max_bw - 10:
line_text = test
else:
if line_text:
c.drawString(tx, by, line_text)
by -= 9
line_text = word
if line_text:
c.drawString(tx, by, line_text)
by -= 11
if by < 4:
break
class RiskRow(Flowable):
"""Single risk table row — canvas only, no text overflow."""
H = 34
def __init__(self, risk, mitigation, bg, w=None):
Flowable.__init__(self)
self.risk = risk
self.mitigation = mitigation
self.bg = bg
self._w = w
self.height = self.H
def wrap(self, aw, ah):
self.width = self._w or aw
return self.width, self.height
def draw(self):
c = self.canv
w = self.width
h = self.height
col1 = w * 0.32
# Background
c.setFillColor(self.bg)
c.rect(0, 0, w, h, fill=1, stroke=0)
# Left accent
c.setFillColor(TEAL)
c.rect(0, 0, 3, h, fill=1, stroke=0)
# Column divider
c.setStrokeColor(MID_GRAY)
c.setLineWidth(0.4)
c.line(col1, 0, col1, h)
# Bottom border
c.line(0, 0, w, 0)
# Risk label (bold, wraps in col1)
c.setFillColor(NAVY)
c.setFont("Helvetica-Bold", 8.5)
self._draw_wrapped(c, self.risk, 8, col1 - 10, h, "Helvetica-Bold", 8.5, NAVY)
# Mitigation text
c.setFillColor(DARK_GRAY)
self._draw_wrapped(c, self.mitigation, col1 + 6, w - col1 - 10, h, "Helvetica", 8, DARK_GRAY)
def _draw_wrapped(self, c, text, x, max_w, cell_h, font, size, color):
c.setFillColor(color)
c.setFont(font, size)
words = text.split()
lines = []
cur = ""
for word in words:
test = (cur + " " + word).strip()
if c.stringWidth(test, font, size) <= max_w:
cur = test
else:
if cur:
lines.append(cur)
cur = word
if cur:
lines.append(cur)
total_h = len(lines) * (size + 2)
start_y = (cell_h - total_h) / 2 + (size + 2) * (len(lines) - 1)
for ln in lines:
c.drawString(x, start_y, ln)
start_y -= (size + 2)
# ═══════════════════════════════════════════════════════════════════════════════
# PAGE CANVASES (header / footer / cover background)
# ═══════════════════════════════════════════════════════════════════════════════
def cover_canvas(c, doc):
"""Light, elegant cover page — cream/white with navy+gold accents."""
c.saveState()
w, h = A4
# ── Background: clean ivory-white ─────────────────────────────────────
c.setFillColor(CV_CREAM)
c.rect(0, 0, w, h, fill=1, stroke=0)
# ── Top hero bar (navy, tall) ──────────────────────────────────────────
hero_h = h * 0.46
c.setFillColor(CV_NAVY)
c.rect(0, h - hero_h, w, hero_h, fill=1, stroke=0)
# Teal diagonal slice at the bottom edge of hero
import math
path = c.beginPath()
path.moveTo(0, h - hero_h)
path.lineTo(w, h - hero_h)
path.lineTo(w, h - hero_h - 28)
path.lineTo(0, h - hero_h - 8)
path.close()
c.setFillColor(CV_TEAL)
c.drawPath(path, fill=1, stroke=0)
# Thin gold line above the teal slice
c.setStrokeColor(CV_GOLD_L)
c.setLineWidth(1.5)
c.line(0, h - hero_h, w, h - hero_h)
# ── Decorative circle cluster — top-right of hero ──────────────────────
ocx, ocy = w * 0.80, h - hero_h * 0.40
for r, alpha in [(110, 0.05), (80, 0.07), (52, 0.09), (28, 0.12)]:
fc = colors.Color(1, 1, 1, alpha=alpha)
c.setFillColor(fc)
c.setStrokeColor(colors.Color(1, 1, 1, alpha=0.15))
c.setLineWidth(0.7)
c.circle(ocx, ocy, r, fill=1, stroke=1)
# Bright teal centre
c.setFillColor(CV_TEAL)
c.circle(ocx, ocy, 8, fill=1, stroke=0)
# ── Subtle grid lines on hero (horizontal) ────────────────────────────
c.setStrokeColor(colors.Color(1, 1, 1, alpha=0.05))
c.setLineWidth(0.4)
for yy in range(int(h - hero_h + 20), int(h), 22):
c.line(0, yy, w, yy)
# ── University banner at very top ─────────────────────────────────────
c.setFillColor(colors.Color(0, 0, 0, alpha=0.30))
c.rect(0, h - 48, w, 48, fill=1, stroke=0)
c.setFillColor(CV_GOLD_L)
c.setFont("Helvetica-Bold", 9.5)
c.drawCentredString(w / 2, h - 22, "SHANDONG MEDICAL AND PHARMACEUTICAL UNIVERSITY")
c.setFillColor(colors.HexColor("#90BAE8"))
c.setFont("Helvetica", 8)
c.drawCentredString(w / 2, h - 36, "Faculty of Clinical Medicine · International Education Department · China")
# Gold top edge
c.setFillColor(CV_GOLD)
c.rect(0, h - 4, w, 4, fill=1, stroke=0)
# ── Bottom section: ivory/white ────────────────────────────────────────
# Subtle vertical teal accent stripe on the left edge (bottom half)
c.setFillColor(CV_TEAL)
c.rect(0, 0, 4, h - hero_h - 28, fill=1, stroke=0)
# Light geometric rectangle behind profile card area
c.setFillColor(CV_WHITE)
c.setStrokeColor(CV_BORDER)
c.setLineWidth(0.8)
c.roundRect(ML - 4, MB - 4, w - ML - MR + 8, h * 0.385, 6, fill=1, stroke=1)
# ── Gold bottom bar ────────────────────────────────────────────────────
c.setFillColor(CV_GOLD)
c.rect(0, 0, w, 4, fill=1, stroke=0)
c.setFillColor(CV_TEAL)
c.rect(0, 4, w, 2, fill=1, stroke=0)
c.restoreState()
def inner_canvas(c, doc):
"""Header + footer for all inner pages."""
c.saveState()
w, h = A4
# Header bar
c.setFillColor(NAVY)
c.rect(0, h - 28, w, 28, fill=1, stroke=0)
c.setFillColor(GOLD)
c.rect(0, h - 3, w, 3, fill=1, stroke=0)
c.setFillColor(colors.HexColor("#A8C4E8"))
c.setFont("Helvetica", 7.5)
c.drawString(ML, h - 18, "Personal Career Development Plan · Junaid Wahid · 235019015")
c.setFillColor(GOLD_LIGHT)
c.setFont("Helvetica-Bold", 7.5)
c.drawRightString(w - MR, h - 18, "Clinical Medicine · Neurosurgery")
# Footer
c.setFillColor(PALE_BLUE)
c.rect(0, 0, w, 22, fill=1, stroke=0)
c.setStrokeColor(TEAL)
c.setLineWidth(0.6)
c.line(ML, 22, w - MR, 22)
c.setFillColor(DARK_GRAY)
c.setFont("Helvetica", 7.5)
c.drawString(ML, 7, "Shandong Medical and Pharmaceutical University · May 2026")
c.setFillColor(NAVY)
c.setFont("Helvetica-Bold", 8)
c.drawRightString(w - MR, 7, f"Page {doc.page}")
c.restoreState()
# ═══════════════════════════════════════════════════════════════════════════════
# BUILD
# ═══════════════════════════════════════════════════════════════════════════════
def build():
S = styles()
cover_frame = Frame(ML, MB, BW, PAGE_H - MT - MB, id="cover",
leftPadding=0, rightPadding=0,
topPadding=0, bottomPadding=0)
inner_frame = Frame(ML, MB + 26, BW, PAGE_H - MT - MB - 26 - 28,
id="inner",
leftPadding=0, rightPadding=0,
topPadding=0, bottomPadding=0)
doc = BaseDocTemplate(
OUTPUT, pagesize=A4,
leftMargin=ML, rightMargin=MR,
topMargin=MT, bottomMargin=MB,
title="Personal Career Development Plan",
author="Junaid Wahid",
subject="Clinical Medicine – Neurosurgery Career Plan",
)
doc.addPageTemplates([
PageTemplate(id="Cover", frames=[cover_frame], onPage=cover_canvas),
PageTemplate(id="Inner", frames=[inner_frame], onPage=inner_canvas),
])
story = []
# ─────────────────────────────────────────────────────────────────────────
# COVER PAGE
# ─────────────────────────────────────────────────────────────────────────
# Push title into hero zone (top navy bar occupies top 46% of page)
# Frame starts at bottom; hero top = PAGE_H − 48(banner) − hero_h(≈387pt)
# We push down from frame top, so spacer = total frame height − hero content
# Frame top edge (from bottom) = PAGE_H - MT = 841.89 - 62.36 = 779.5
# Hero bottom (from page bottom) = PAGE_H - 48 - hero_h ≈ 841.89 - 48 - 387 = 406
# So space to push title into hero = frame_h - (frame_top - hero_bottom)
# Frame height = PAGE_H - MT - MB ≈ 779.5 - 56.7 = 722.8
# title should start near hero_bottom from frame bottom → from frame top: ~373 pt down
frame_h = PAGE_H - MT - MB
hero_h = PAGE_H * 0.46
banner = 48
# title_top_from_page_bottom ≈ PAGE_H - banner - hero_h + 20 (inside hero near bottom)
title_y_from_bottom = PAGE_H - banner - hero_h + 60
push = frame_h - (title_y_from_bottom - MB)
story.append(Spacer(1, push))
# Tag line
story.append(Paragraph("CLINICAL MEDICINE · INTERNATIONAL PROGRAM", S["cv_tag"]))
story.append(Spacer(1, 4))
# Title (light color — drawn over navy hero)
title_style = ParagraphStyle("ct2", fontName="Helvetica-Bold", fontSize=32,
textColor=WHITE, alignment=TA_LEFT,
leading=40, spaceAfter=2)
story.append(Paragraph("Personal Career", title_style))
story.append(Paragraph("Development Plan", title_style))
story.append(Spacer(1, 4))
story.append(HRFlowable(width=BW * 0.44, thickness=1.5,
color=CV_GOLD_L, hAlign="LEFT", spaceAfter=6))
sub_style = ParagraphStyle("csub2", fontName="Helvetica", fontSize=11.5,
textColor=colors.HexColor("#90C4E8"),
alignment=TA_LEFT, leading=18)
story.append(Paragraph(
"A Structured Pathway Toward Becoming a Neurosurgeon", sub_style))
# Gap between hero and profile card
story.append(Spacer(1, 28))
# Profile card (light theme)
profile_rows = [
("Student Name", "Junaid Wahid"),
("Student ID", "235019015"),
("Major / Program", "Clinical Medicine (MBBS)"),
("Academic Year", "4th Year"),
("Target Specialty", "Neurosurgery"),
("University", "Shandong Medical and Pharmaceutical University"),
("Submission Date", "24 May 2026"),
]
story.append(ProfileCardCover(profile_rows, w=BW))
# Transition to inner template
story.append(NextPageTemplate("Inner"))
story.append(PageBreak())
# ─────────────────────────────────────────────────────────────────────────
# HELPERS
# ─────────────────────────────────────────────────────────────────────────
def sec(num, title):
story.append(Spacer(1, 6))
story.append(SectionBar(num, title, w=BW))
story.append(Spacer(1, 6))
def sub(title):
story.append(Spacer(1, 5))
story.append(SubBar(title, w=BW))
story.append(Spacer(1, 5))
def body(text):
story.append(Paragraph(text, S["body"]))
def blt(text):
story.append(Paragraph(
f'<bullet><font color="#0A7EA4">•</font></bullet>{text}',
S["bullet"]))
def sp(pts=5):
story.append(Spacer(1, pts))
def rule():
story.append(GoldRule(w=BW))
story.append(Spacer(1, 4))
# ─────────────────────────────────────────────────────────────────────────
# TABLE OF CONTENTS
# ─────────────────────────────────────────────────────────────────────────
sec("", "Table of Contents")
toc_entries = [
("01", "Career Vision", "2"),
("02", "Personal Profile Summary", "2"),
("03", "Self-Assessment Analysis", "3"),
("04", "Career Environment Scan", "4"),
("05", "Goal System Construction", "5"),
("06", "Implementation Pathway Design", "6"),
("07", "Risk Management Plan", "7"),
("08", "Conclusion / Final Statement", "8"),
]
toc_subs = {
"03": ["3.1 Professional Values", "3.2 Competency Matrix", "3.3 Career Personality"],
"04": ["4.1 Target Region Landscape", "4.2 Industry Trends"],
"05": ["5.1 Short-Term Goals", "5.2 Mid-Term Goals", "5.3 Long-Term Goals"],
"06": ["6.1 Academic Preparation", "6.2 Credentialing Phase", "6.3 Specialization Phase"],
"07": ["7.1 Risk Response", "7.2 Dynamic Review"],
}
for num, title, pg in toc_entries:
row = Table(
[[
Paragraph(f'<font color="#B8922A"><b>{num}</b></font>', S["toc_main"]),
Paragraph(f'<b>{title}</b>', S["toc_main"]),
Paragraph(
'<font color="#C8D0DC">' + '.' * 55 + '</font>',
ParagraphStyle("dots", fontName="Helvetica", fontSize=9,
leading=17, textColor=MID_GRAY)),
Paragraph(f'<font color="#1A4A8A"><b>{pg}</b></font>', S["toc_pg"]),
]],
colWidths=[1.0 * cm, 8.0 * cm, None, 0.9 * cm], hAlign="LEFT"
)
row.setStyle(TableStyle([
("VALIGN", (0, 0), (-1, -1), "MIDDLE"),
("LEFTPADDING", (0, 0), (-1, -1), 2),
("RIGHTPADDING", (0, 0), (-1, -1), 2),
("TOPPADDING", (0, 0), (-1, -1), 0),
("BOTTOMPADDING",(0, 0), (-1, -1), 0),
]))
story.append(row)
if num in toc_subs:
for s_item in toc_subs[num]:
story.append(Paragraph(f"› {s_item}", S["toc_sub"]))
story.append(Spacer(1, 1))
sp(5)
story.append(TwoToneRule(w=BW))
sp(3)
story.append(Paragraph(
"Prepared as a formal academic submission — Clinical Medicine Programme, "
"Shandong Medical and Pharmaceutical University, China.", S["caption"]))
sp(8)
# ─────────────────────────────────────────────────────────────────────────
# 01 CAREER VISION
# ─────────────────────────────────────────────────────────────────────────
sec("01", "Career Vision")
body(
"The central ambition driving this plan is to become a highly competent, ethically grounded, "
"and internationally minded neurosurgeon capable of diagnosing and treating the full spectrum "
"of neurological conditions with skill, precision, and compassion. Neurosurgery sits at the "
"intersection of advanced scientific knowledge, exceptional technical skill, and profound human "
"responsibility. The long-term vision is not merely to attain a surgical qualification, but to "
"build a career defined by genuine patient service, continuous scientific engagement, and a "
"commitment to improving neurosurgical care in Pakistan and beyond.")
body(
"This vision is shaped by a belief that the best physicians remain learners throughout their "
"professional lives, holding their patients' welfare above all institutional pressures and "
"pursuing excellence not for recognition but out of a sincere duty to serve. Every stage of "
"the journey described in this document is guided by that belief.")
rule()
# ─────────────────────────────────────────────────────────────────────────
# 02 PERSONAL PROFILE SUMMARY
# ─────────────────────────────────────────────────────────────────────────
sec("02", "Personal Profile Summary")
p_data = [
["Full Name", "Junaid Wahid"],
["Student ID", "235019015"],
["Major", "Clinical Medicine (MBBS International Program)"],
["Academic Year", "Fourth Year"],
["Target Specialty", "Neurosurgery"],
["University", "Shandong Medical and Pharmaceutical University, China"],
["Core Identity", "Aspiring neurosurgeon · evidence-based clinician · cross-cultural practitioner"],
]
tbl = Table(p_data, colWidths=[4.2 * cm, BW - 4.2 * cm], hAlign="LEFT")
tbl.setStyle(TableStyle([
("FONTNAME", (0, 0), (0, -1), "Helvetica-Bold"),
("FONTNAME", (1, 0), (1, -1), "Helvetica"),
("FONTSIZE", (0, 0), (-1, -1), 9),
("LEADING", (0, 0), (-1, -1), 14),
("TEXTCOLOR", (0, 0), (0, -1), TEAL),
("TEXTCOLOR", (1, 0), (1, -1), NAVY),
("ROWBACKGROUNDS",(0, 0), (-1, -1), [PALE_BLUE, WHITE]),
("BOX", (0, 0), (-1, -1), 1, TEAL),
("INNERGRID", (0, 0), (-1, -1), 0.4, MID_GRAY),
("LEFTPADDING", (0, 0), (-1, -1), 8),
("RIGHTPADDING", (0, 0), (-1, -1), 8),
("TOPPADDING", (0, 0), (-1, -1), 5),
("BOTTOMPADDING", (0, 0), (-1, -1), 5),
("VALIGN", (0, 0), (-1, -1), "MIDDLE"),
]))
story.append(tbl)
sp(5)
rule()
# ─────────────────────────────────────────────────────────────────────────
# 03 SELF-ASSESSMENT ANALYSIS
# ─────────────────────────────────────────────────────────────────────────
sec("03", "Self-Assessment Analysis")
sub("3.1 Clarification of Professional Values")
body(
"The decision to pursue medicine arose from a deeply personal recognition of the value of "
"human life and the profound difference a skilled, caring physician can make in moments of "
"vulnerability. From early clinical exposure it became clear that medicine demands not only "
"intellectual rigour but also an enduring commitment to compassion, responsibility, and service. "
"These values were reinforced through years of academic training and cross-cultural experience "
"in China, where exposure to a high-volume, technologically advanced healthcare environment "
"broadened both clinical perspective and professional aspiration.")
body(
"Neurosurgery was identified as the preferred specialty because it combines the highest levels "
"of diagnostic precision with the most direct and consequential forms of therapeutic intervention. "
"Conditions of the brain and spinal cord affect every dimension of a patient's existence — "
"from movement and cognition to identity itself. The specialty demands lifelong learning, "
"technical refinement, and research engagement, all of which align with a deeply held "
"commitment to professional excellence.")
sub("3.2 Competency Matrix Evaluation")
comp = [
["STRENGTH AREA", "LEVEL", "NOTES"],
["Diagnostic History Taking", "Strong", "Systematic, patient-centred approach"],
["Clinical Reasoning", "Strong", "Hypothesis-driven differential thinking"],
["Emergency Judgment", "Developing", "Improving with simulation experience"],
["Medical Communication", "Strong", "Effective in English and Mandarin"],
["Cross-Cultural Adaptability","Excellent", "4 years of study in China"],
["Surgical Procedural Skills", "Early-stage","Requires structured supervised exposure"],
["Advanced Decision-Making", "Developing", "Growing through case study and mentorship"],
["Research Literacy", "Moderate", "Evidence appraisal actively developing"],
]
ct = Table(comp, colWidths=[5.6 * cm, 2.8 * cm, BW - 8.4 * cm], hAlign="LEFT")
ct.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, 0), NAVY),
("TEXTCOLOR", (0, 0), (-1, 0), GOLD_LIGHT),
("FONTNAME", (0, 0), (-1, 0), "Helvetica-Bold"),
("FONTNAME", (0, 1), (-1, -1), "Helvetica"),
("FONTSIZE", (0, 0), (-1, -1), 8.5),
("LEADING", (0, 0), (-1, -1), 13),
("TEXTCOLOR", (0, 1), (-1, -1), DARK_GRAY),
("ROWBACKGROUNDS",(0, 1), (-1, -1), [WHITE, PALE_BLUE]),
("BOX", (0, 0), (-1, -1), 1, NAVY),
("INNERGRID", (0, 0), (-1, -1), 0.4, MID_GRAY),
("LEFTPADDING", (0, 0), (-1, -1), 7),
("RIGHTPADDING", (0, 0), (-1, -1), 7),
("TOPPADDING", (0, 0), (-1, -1), 4),
("BOTTOMPADDING", (0, 0), (-1, -1), 4),
("VALIGN", (0, 0), (-1, -1), "MIDDLE"),
]))
story.append(ct)
sub("3.3 Career Personality Positioning")
body(
"Using the Holland Occupational Codes (RIASEC) framework, the dominant profile is "
"<b>Investigative (I), Realistic (R), and Social (S)</b>. The Investigative dimension "
"reflects an inherent drive to analyse and understand complex systems — directly applicable "
"to the diagnostic reasoning demands of neurosurgery. The Realistic dimension captures a "
"preference for concrete, hands-on problem-solving and technical mastery, aligning closely "
"with the procedural nature of surgical practice. The Social dimension reflects a genuine "
"orientation toward patient care and the relational dimensions of medicine that remain "
"essential even in highly technical specialties.")
sp(5)
rule()
# ─────────────────────────────────────────────────────────────────────────
# 04 CAREER ENVIRONMENT SCAN
# ─────────────────────────────────────────────────────────────────────────
sec("04", "Career Environment Scan")
sub("4.1 Target Region Practice Landscape")
body(
"Upon completion of the MBBS programme the plan is to return to Pakistan, where both a "
"significant need for well-trained neurosurgical specialists and a structured specialist "
"training pathway exist. The first mandatory step is passing the <b>PMDC licensing "
"examination</b> for registration as a medical practitioner. The primary specialist route "
"is the <b>FCPS in Neurosurgery</b> through the College of Physicians and Surgeons Pakistan, "
"involving a multi-year accredited residency. Parallel international options — <b>USMLE</b> "
"(USA), <b>PLAB</b> (UK), and <b>AMC</b> (Australia) — will remain under active "
"consideration to ensure flexibility in the face of policy or capacity changes.")
sub("4.2 Industry Trend Analysis")
body("Modern neurosurgery is being reshaped by several converging forces that new surgeons must engage with from day one:")
blt("AI-assisted neuroimaging analysis, tumour segmentation, and preoperative surgical planning")
blt("High-resolution modalities: functional MRI, diffusion tensor imaging, and intraoperative neuronavigation")
blt("Minimally invasive and endoscopic neurosurgical techniques requiring refined training beyond open surgery")
blt("Wearable and implantable monitoring technologies for postoperative surveillance and remote management")
blt("A global shift toward evidence-based medicine requiring critical engagement with primary literature")
body(
"These trends reinforce the need for a modern neurosurgeon to be technically literate, "
"data-informed, and research-engaged. Continuous professional development is non-negotiable.")
sp(5)
rule()
# ─────────────────────────────────────────────────────────────────────────
# 05 GOAL SYSTEM CONSTRUCTION
# ─────────────────────────────────────────────────────────────────────────
sec("05", "Goal System Construction")
tl_phases = [
("SHORT-TERM", "Before Graduation",
["Strengthen core clinical knowledge", "Master case presentation", "Complete case reports"]),
("MID-TERM", "1–5 Yrs Post-Grad",
["Pass PMDC / FCPS Part I", "Enter specialist training", "Engage in research"]),
("LONG-TERM", "5–10 Yrs Post-Grad",
["Qualify as neurosurgeon", "Serve patients in Pakistan", "Build collaborations"]),
]
story.append(TimelineBlock(tl_phases, w=BW))
sp(8)
sub("5.1 Short-Term Goals: Before Graduation")
blt("Achieve thorough command of core clinical subjects with depth in neurology, anatomy, and pharmacology")
blt("Develop proficiency in structured case presentation, history taking, and clinical reasoning")
blt("Complete at least two substantive case reports to build research writing skills")
blt("Strengthen English academic reading and medical communication for international engagement")
blt("Begin preparatory review of FCPS Part I content and USMLE Step 1 foundations")
blt("Seek mentorship from attending physicians with surgical or neurology experience")
sub("5.2 Mid-Term Goals: Five Years After Graduation")
blt("Successfully complete the PMDC licensing examination and secure full registration")
blt("Enter and progress through a recognised FCPS neurosurgery training programme")
blt("Build surgical discipline through structured exposure to operative neurosurgery under supervision")
blt("Participate in clinical research and contribute to at least one peer-reviewed publication")
blt("Attend national and international conferences to build networks and academic awareness")
sub("5.3 Long-Term Goals: Ten Years After Graduation")
blt("Attain full qualification as a Fellow in Neurosurgery (FCPS or equivalent international fellowship)")
blt("Establish an independent clinical practice providing high-quality neurosurgical care in Pakistan")
blt("Contribute to neurosurgical standards through research, teaching, and institutional engagement")
blt("Build cross-border professional collaborations — particularly with institutions in China")
blt("Serve as a mentor and educator for the next generation of surgical trainees")
sp(5)
rule()
# ─────────────────────────────────────────────────────────────────────────
# 06 IMPLEMENTATION PATHWAY DESIGN
# ─────────────────────────────────────────────────────────────────────────
sec("06", "Implementation Pathway Design")
sub("6.1 Academic Preparation Phase: During Studies (2024–2026)")
body(
"A structured study programme will address one identified weakness each semester, ensuring "
"continuous measurable progress. Priority areas include surgical anatomy, ECG interpretation, "
"emergency medicine principles, and structured case analysis. Mentorship from attending "
"physicians and senior residents will supplement formal curriculum delivery.")
blt("Deep review of neuroanatomy, spinal column structure, and cranial nerve pathways")
blt("Emergency medicine: airway management, resuscitation protocols, and trauma response")
blt("Active engagement with research methodology to build postgraduate research capacity")
sub("6.2 Credentialing Phase: One to Two Years After Graduation (2026–2028)")
body(
"A structured daily study system will be established from the final months of the "
"undergraduate programme, ensuring no gap between graduation and active licensing preparation.")
blt("Systematic PMDC exam preparation using approved study guides, past papers, and case banks")
blt("Preparation of all documentation: transcripts, internship certifications, reference letters")
blt("Parallel study of FCPS Part I content to reduce time to specialist training entry")
blt("Maintenance of USMLE Step 1 preparation as a contingency international pathway")
sub("6.3 Specialization Phase: Three to Five Years After Graduation (2028–2031)")
body(
"This phase marks the transition from licensed practitioner to surgical trainee and demands "
"the greatest investment of focus and commitment.")
blt("Comprehensive theoretical foundation in neurosurgical pathology, neuroradiology, and operative principles")
blt("Structured operative exposure through supervised participation in progressively complex procedures")
blt("Workshops, cadaveric dissection courses, and simulation training programmes")
blt("Potential international elective placements at neurosurgical centres of excellence")
blt("Original research project appropriate for publication in a peer-reviewed surgical journal")
sp(5)
rule()
# ─────────────────────────────────────────────────────────────────────────
# 07 RISK MANAGEMENT PLAN
# ─────────────────────────────────────────────────────────────────────────
sec("07", "Risk Management Plan")
sub("7.1 Major Risk Response")
# Risk table header
hdr = Table(
[[Paragraph("<b>RISK FACTOR</b>", ParagraphStyle("rh", fontName="Helvetica-Bold",
fontSize=8.5, textColor=GOLD_LIGHT, leading=12)),
Paragraph("<b>MITIGATION STRATEGY</b>", ParagraphStyle("rh2", fontName="Helvetica-Bold",
fontSize=8.5, textColor=GOLD_LIGHT, leading=12))]],
colWidths=[BW * 0.32, BW * 0.68], hAlign="LEFT"
)
hdr.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, -1), NAVY),
("LEFTPADDING", (0, 0), (-1, -1), 8),
("RIGHTPADDING", (0, 0), (-1, -1), 8),
("TOPPADDING", (0, 0), (-1, -1), 5),
("BOTTOMPADDING", (0, 0), (-1, -1), 5),
("VALIGN", (0, 0), (-1, -1), "MIDDLE"),
]))
story.append(hdr)
risk_rows = [
("Licensing Exam Failure",
"Allocate 3–6 months extra preparation; maintain financial planning; consider transitional clinical/research roles.",
PALE_BLUE),
("Policy or Visa Changes",
"Maintain two parallel pathways (PMDC + USMLE or PLAB); keep documentation current for multiple jurisdictions.",
WHITE),
("Burnout & Mental Health",
"Implement structured rest cycles; maintain physical activity and social connection; seek formal support early.",
PALE_BLUE),
("Limited Training Positions",
"Build professional network early; apply to multiple institutions; consider fellowship opportunities abroad.",
WHITE),
("Financial Constraints",
"Research scholarships and bursaries proactively; plan finances before graduation; explore employer-sponsored training.",
PALE_BLUE),
("Technology Skill Gap",
"Pursue self-directed digital learning; seek neuronavigation and imaging software training during residency.",
WHITE),
]
for risk, mit, bg in risk_rows:
story.append(RiskRow(risk, mit, bg, w=BW))
# Bottom border of table
story.append(HRFlowable(width=BW, thickness=0.8, color=NAVY,
hAlign="LEFT", spaceAfter=6))
sub("7.2 Dynamic Evaluation Mechanism")
body(
"A career plan of this scope requires disciplined ongoing review. Rigid adherence to a fixed "
"plan in the face of changing circumstances would be counterproductive; the plan must respond "
"intelligently to new information and evolving conditions.")
eval_data = [
["FREQUENCY", "FOCUS AREA", "KEY ACTIONS"],
["Quarterly", "Goal progress", "Track milestones; identify gaps; adjust study schedule"],
["Annual", "Full plan review", "Revise with mentor; update pathways; reset timelines"],
["Post-Exam", "Results analysis", "Identify weak areas; plan targeted remediation"],
["Transitions", "Strategic realign", "Consult senior advisors; reassess international options"],
]
et = Table(eval_data, colWidths=[3.5 * cm, 3.8 * cm, BW - 7.3 * cm], hAlign="LEFT")
et.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, 0), ROYAL),
("TEXTCOLOR", (0, 0), (-1, 0), WHITE),
("FONTNAME", (0, 0), (-1, 0), "Helvetica-Bold"),
("FONTNAME", (0, 1), (-1, -1), "Helvetica"),
("FONTSIZE", (0, 0), (-1, -1), 8.5),
("LEADING", (0, 0), (-1, -1), 13),
("TEXTCOLOR", (0, 1), (-1, -1), DARK_GRAY),
("ROWBACKGROUNDS",(0, 1), (-1, -1), [WHITE, PALE_BLUE]),
("BOX", (0, 0), (-1, -1), 1, ROYAL),
("INNERGRID", (0, 0), (-1, -1), 0.4, MID_GRAY),
("LEFTPADDING", (0, 0), (-1, -1), 7),
("RIGHTPADDING", (0, 0), (-1, -1), 7),
("TOPPADDING", (0, 0), (-1, -1), 4),
("BOTTOMPADDING", (0, 0), (-1, -1), 4),
("VALIGN", (0, 0), (-1, -1), "MIDDLE"),
]))
story.append(et)
sp(5)
rule()
# ─────────────────────────────────────────────────────────────────────────
# 08 CONCLUSION
# ─────────────────────────────────────────────────────────────────────────
sec("08", "Conclusion / Final Statement")
body(
"This career development plan has been constructed with care, honesty, and a genuine sense "
"of long-term purpose. It is grounded in a clear professional vision, supported by an honest "
"assessment of current capabilities, informed by an understanding of the clinical environment, "
"and organised around a realistic and achievable sequence of goals.")
body(
"Becoming a neurosurgeon is one of the most demanding ambitions a medical student can hold. "
"It requires years of rigorous academic preparation, sustained surgical training, and the "
"personal discipline that does not waver under pressure or fatigue. It requires, above all, "
"an unwavering commitment to the patient, whose life may depend on the quality of judgment "
"exercised in the operating theatre. That responsibility is understood, and it is embraced.")
body(
"The academic formation received at Shandong Medical and Pharmaceutical University, combined "
"with the cross-cultural experience of studying in China, has laid a strong foundation for "
"the career described in this document. The years ahead will demand more — but the direction "
"is clear, the commitment is firm, and the motivation is genuine.")
sp(6)
# Quote box using Table (safe — no custom Flowable)
qt = Table(
[[Paragraph(
'"The practice of medicine is an art, not a trade; a calling, not a business; '
'a calling in which your heart will be exercised equally with your head."',
S["quote"])]],
colWidths=[BW], hAlign="LEFT"
)
qt.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, -1), PALE_BLUE),
("BOX", (0, 0), (-1, -1), 1.5, GOLD),
("LEFTPADDING", (0, 0), (-1, -1), 14),
("RIGHTPADDING", (0, 0), (-1, -1), 14),
("TOPPADDING", (0, 0), (-1, -1), 10),
("BOTTOMPADDING", (0, 0), (-1, -1), 10),
]))
story.append(qt)
sp(3)
story.append(Paragraph("— Sir William Osler", S["quote_attr"]))
sp(8)
story.append(GoldRule(w=BW))
sp(5)
# Signature row
sig = Table(
[[
Paragraph("<b>Student:</b> Junaid Wahid", S["body"]),
Paragraph("<b>ID:</b> 235019015", S["body"]),
Paragraph("<b>Date:</b> 24 May 2026", S["body"]),
]],
colWidths=[BW / 3] * 3, hAlign="LEFT"
)
sig.setStyle(TableStyle([
("VALIGN", (0, 0), (-1, -1), "TOP"),
("LEFTPADDING", (0, 0), (-1, -1), 0),
("RIGHTPADDING", (0, 0), (-1, -1), 6),
]))
story.append(sig)
sp(3)
story.append(Paragraph(
"Submitted in partial fulfilment of the career development requirements — "
"Clinical Medicine Programme, Shandong Medical and Pharmaceutical University, China.",
S["caption"]))
# ─────────────────────────────────────────────────────────────────────────
doc.build(story)
size = os.path.getsize(OUTPUT)
print(f"✓ PDF saved → {OUTPUT}")
print(f" Size: {size:,} bytes")
if __name__ == "__main__":
build()
cat > /home/daytona/workspace/career-plan/build_pdf.py << 'PYEOF' #!/usr/bin/env…
cd /home/daytona/workspace/career-plan && python3 build_pdf.py 2>&1
python3 -c " from pypdf import PdfReader r = PdfReader('/home/daytona/workspace/…
Junaid Wahid Career Development Plan
PDF Document · PDF
_draw_wrapped method that measures string width before drawing each linedraw() methods — zero risk of ReportLab frame overflowPageBreak calls between sections removed — content flows continuously from one section directly into the nextThank you
What is your max limit of creating files
/home/daytona/workspace/ has disk space limits (typically several GB), so very large files or thousands of files could eventually hit that ceiling.Is there any free daily max limit
Thank you, how about you access ecg? I use you after i saw video of someone using as ecg interpreter
Generate practice ECG cases for self-study
cat > /home/daytona/workspace/career-plan/build_ecg.py << 'PYEOF' #!/usr/bin/env…
cd /home/daytona/workspace/career-plan && python3 build_ecg.py 2>&1
cd /home/daytona/workspace/career-plan && sed -i 's/ c\.setStrokeColor(colors…
cd /home/daytona/workspace/career-plan && python3 build_ecg.py 2>&1
python3 - << 'EOF' with open("/home/daytona/workspace/career-plan/build_ecg.py",…
cd /home/daytona/workspace/career-plan && python3 build_ecg.py 2>&1
python3 - << 'EOF' with open("/home/daytona/workspace/career-plan/build_ecg.py",…
cd /home/daytona/workspace/career-plan && python3 build_ecg.py 2>&1
python3 -c " from pypdf import PdfReader r = PdfReader('/home/daytona/workspace/…
ECG Practice Cases
PDF Document · PDF
| # | Condition | Level |
|---|---|---|
| 1 | Normal Sinus Rhythm | Beginner |
| 2 | Atrial Fibrillation | Beginner |
| 3 | Inferior STEMI | Beginner |
| 4 | SVT (AVNRT) | Beginner |
| 5 | Complete Heart Block | Beginner |
| 6 | Ventricular Tachycardia | Intermediate |
| 7 | Left Bundle Branch Block | Intermediate |
| 8 | Wolff-Parkinson-White | Intermediate |
| 9 | Mobitz II AV Block | Intermediate |
| 10 | Hyperkalaemia | Intermediate |
| 11 | Hypokalaemia | Intermediate |
| 12 | PVCs | Intermediate |
| 13 | Posterior STEMI | Advanced |
| 14 | Torsades de Pointes | Advanced |
| 15 | Pacemaker Rhythm | Advanced |
| 16 | Pulmonary Embolism | Advanced |
| 17 | RBBB | Advanced |
| 18 | First Degree AV Block | Advanced |
| 19 | Ventricular Fibrillation | Advanced |
| 20 | Drug-Induced Long QT | Advanced |
The pictures in ecg are not right and is not good specially look into qrs complex it is way more outer than the ecg frame, take some realistic ecg pictures and redo it
python3 - << 'TESTEOF' # Test: draw a single realistic ECG strip to verify geome…
Do it again
The pictures in ecg are not right and is not good specially look into qrs complex it is way more outer than the ecg frame, take some realistic ecg pictures and redo it