I’m providing you a image of partograph. Create a image in which the partograph is filled for a patient with normal delivery and explain everything step by step with timing of reading
partograph labour monitoring
WHO labour care guide partograph monitoring fetal heart rate contractions cervical dilatation timing
A realistic completed obstetric partograph form for an illustrative uncomplicated term spontaneous vaginal delivery. It should clearly show a normal fetal heart rate trace in the safe range, clear amniotic fluid, cervical dilatation progressing from 4 cm to 10 cm to the left of the alert line, descent progressing, normal increasing contractions, and stable maternal observations. Include a small clearly visible label: 'ILLUSTRATIVE TRAINING EXAMPLE - NOT A PATIENT RECORD'.
https://iris.who.int/server/api/core/bitstreams/94326918-1f9…
~/

| Clock time | Cervix | Head descent | FHR | Liquor/moulding | Contractions in 10 min | Maternal pulse/BP/temp |
|---|---|---|---|---|---|---|
| 08:00 | 4 cm | 3/5 palpable | 140 bpm | Clear, moulding 0 | 2, 25-30 sec | 80/min, 110/70, 36.8°C |
| 09:00 | No vaginal exam | - | 138 bpm | - | 3, 30-35 sec | 82/min |
| 10:00 | No vaginal exam | - | 142 bpm | - | 3, 35-40 sec | 80/min |
| 11:00 | 6 cm | 2/5 palpable | 145 bpm | Clear, moulding 0 | 3, 40-45 sec | 84/min |
| 12:00 | No vaginal exam | - | 140 bpm | - | 4, 45-50 sec | 86/min, 112/72, 36.9°C |
| 13:00 | 10 cm | 0/5 palpable | 144 bpm | Clear, moulding 0 | 4, 50-60 sec | 88/min |
| 13:20 | Birth | - | Record immediately before birth | - | - | Continue postpartum observation |
| Observation | Usual interval in uncomplicated labour |
|---|---|
| Fetal heart rate | Every 30 minutes |
| Uterine contractions | Every 30 minutes |
| Maternal pulse | Every 30 minutes |
| Temperature | Every 2 hours |
| Blood pressure | Every 4 hours |
| Vaginal examination: cervix, descent, liquor, moulding | Every 4 hours, or sooner if clinically indicated |
| Urine | At each void |
Fill the partograph on image i have provided you
WHO traditional partograph recording fetal heart rate 30 minutes contractions 30 minutes cervical dilatation 4 hours
~/
~/attachments/1bc5d4bd-1ccc-4e7e-9c1a-9bef35a01ec0/
mkdir -p "/tmp/workspace/partograph-example/output" 66 python -c "from PIL import Image; im=Image.open('/tmp/workspace/attachments/1bc5d4bd-1ccc-4e7e-9c1a-9bef35a01ec0/IMG_4140.jpg'); print(im.size)"
mkdir -p "/tmp/workspace/partograph-example/output" && python -c "from PIL import Image; im=Image.open('/tmp/workspace/attachments/1bc5d4bd-1ccc-4e7e-9c1a-9bef35a01ec0/IMG_4140.jpg'); print(im.size, im.mode)"
python - <<'PY' from PIL import Image, ImageDraw, ImageFont import os, math src='/tmp/workspace/attachments/1bc5d4bd-1ccc-4e7e-9c1a-9bef35a01ec0/IMG_4140.jpg' out='/tmp/workspace/partograph-example/output/filled_partograph_normal_delivery_training_example.png' im=Image.open(src).convert('RGBA') # light white wash, preserve printed chart ov=Image.new('RGBA',im.size,(255,255,255,0)); d=ImageDraw.Draw(ov) font='/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf' bold='/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf' def F(n,b=False): return ImageFont.truetype(bold if b else font,n) red=(204,35,35,255); blue=(28,92,180,255); green=(20,130,75,255); purple=(115,45,150,255); dark=(25,25,25,255) # Header handwritten-like entries d.text((223,76),'ILLUSTRATIVE TRAINING CASE',font=F(14,True),fill=red) d.text((540,76),'G2',font=F(16,True),fill=blue); d.text((790,76),'P1',font=F(16,True),fill=blue) d.text((215,108),'17/09/2026',font=F(14),fill=blue); d.text((484,108),'05:00',font=F(14),fill=blue) d.text((778,109),'SROM 08:30',font=F(14),fill=blue); d.text((1072,109),'clear',font=F(13),fill=blue) # banner d.rounded_rectangle((650,18,1140,49),radius=8,fill=(255,245,190,235),outline=red,width=2) d.text((663,25),'TRAINING EXAMPLE - NOT A PATIENT RECORD',font=F(14,True),fill=red) # Coordinates x0=220; hourw=38.15; halfw=19.075 def xhour(h): return x0+h*hourw def yfhr(v): return 302-(v-100)*1.53 def ycerv(v): return 748-v*38.05 def ypulse(v): return 1382-(v-60)*1.95 # FHR trace every 30 minutes, normal 136-148 vals=[140,142,138,144,141,139,143,145,140,142,138,144,141,146,142,140,144,141,145,143,140,146,142,144,141,143,145] pts=[] for i,v in enumerate(vals): p=(x0+i*halfw,yfhr(v)); pts.append(p); d.ellipse((p[0]-3,p[1]-3,p[0]+3,p[1]+3),fill=green) d.line(pts,fill=green,width=2) d.text((224,154),'140',font=F(10,True),fill=green) # liquor/moulding every 4h for h,txt in [(0,'I/0'),(4,'I/0'),(8,'C/0'),(12,'C/0')]: d.text((xhour(h)+3,326),txt,font=F(12,True),fill=blue) # Cervical X points. Latent 2 cm to 3 cm then active 4 cm at 8 h; progresses left of alert line. cerv=[(0,2),(4,3),(8,4),(9.5,6),(11,8),(12.5,10)] pts=[(xhour(t),ycerv(v)) for t,v in cerv] d.line(pts,fill=red,width=3) for x,y in pts: d.line((x-6,y-6,x+6,y+6),fill=red,width=3); d.line((x-6,y+6,x+6,y-6),fill=red,width=3) # head descent O from 3 to 0 head=[(8,3),(9.5,2),(11,1),(12.5,0)] op=[] for t,v in head: x,y=xhour(t),ycerv(v); op.append((x,y)); d.ellipse((x-6,y-6,x+6,y+6),outline=blue,width=3) d.line(op,fill=blue,width=2) # legend d.rectangle((870,683,1124,735),fill=(255,255,255,225),outline=(80,80,80,255),width=1) d.text((879,690),'X Cervix (cm)',font=F(13,True),fill=red) d.text((879,710),'O Head descent',font=F(13,True),fill=blue) d.text((879,728),'Normal progress',font=F(12),fill=green) # time row, actual clock clock starts 05:00 for h in range(0,14): if h%2==0: d.text((xhour(h)+3,770),f'{(5+h)%24:02d}:00',font=F(10),fill=purple) # contractions at each 30 min: (number, duration category) classes gray shades contr=[] for i in range(27): if i<8: contr.append((2,1)) elif i<16: contr.append((3,2)) elif i<22: contr.append((4,2)) else: contr.append((4,3)) # area x 220 to 1143; rows y 828 to929 each 20.2; bottom rows filled for i,(num,cat) in enumerate(contr): x=x0+i*halfw+1 for r in range(num): y=929-(r+1)*20.2+2 fill=[(0,0,0,0),(210,210,210,150),(150,150,150,160),(70,70,70,165)][cat] d.rectangle((x,y,x+halfw-3,y+17),fill=fill) if cat==2: d.line((x,y+17,x+halfw-3,y),fill=(100,100,100,220),width=1) # oxytocin none d.text((225,954),'Nil - no augmentation',font=F(13,True),fill=green) # drugs fluids d.text((229,1045),'Oral fluids encouraged',font=F(13),fill=blue) d.text((229,1066),'No IV fluids / drugs',font=F(13),fill=blue) # maternal pulse q30, bp q4 pulse=[80,82,80,84,82,84,86,84,86,88,86,88,90,88,90,92,90,92,94,92,94,96,94,96,98,96,98] pp=[] for i,v in enumerate(pulse): p=(x0+i*halfw,ypulse(v)); pp.append(p); d.ellipse((p[0]-3,p[1]-3,p[0]+3,p[1]+3),fill=purple) d.line(pp,fill=purple,width=2) for h,sys,dia in [(0,110,70),(4,112,72),(8,112,72),(12,114,74)]: x=xhour(h); d.line((x,ypulse(sys),x,ypulse(dia)),fill=blue,width=3); d.line((x-4,ypulse(sys),x+4,ypulse(sys)),fill=blue,width=2); d.line((x-4,ypulse(dia),x+4,ypulse(dia)),fill=blue,width=2) d.text((225,1154),'Pulse',font=F(10,True),fill=purple); d.text((225,1180),'BP',font=F(10,True),fill=blue) # temp, urine every 4h for h,temp in [(0,'36.8'),(4,'36.9'),(8,'36.8'),(12,'36.9')]: d.text((xhour(h)+3,1401),temp,font=F(11,True),fill=red) for h,vol in [(4,'300'),(8,'250'),(12,'300')]: d.text((xhour(h)+3,1484),vol,font=F(11,True),fill=blue) d.text((xhour(h)+3,1506),'Nil',font=F(10),fill=blue) # delivery note d.rounded_rectangle((730,1530,1135,1582),radius=8,fill=(225,250,235,235),outline=green,width=2) d.text((743,1538),'12:50 - spontaneous vaginal birth',font=F(14,True),fill=green) d.text((743,1558),'Mother and baby stable (illustrative)',font=F(12),fill=green) # compositing im=Image.alpha_composite(im,ov).convert('RGB') im.save(out,quality=95) print(out, im.size) PY
**/DejaVuSans.ttf in /usr/share/fonts
fc-match -f '%{file}\n' sans | sed -n '1p'
python - <<'PY' p='/tmp/workspace/partograph-example/src_fill.py' from pathlib import Path # previous full script unavailable, need recreate concise PY
python - <<'PY' from PIL import Image, ImageDraw, ImageFont src='/tmp/workspace/attachments/1bc5d4bd-1ccc-4e7e-9c1a-9bef35a01ec0/IMG_4140.jpg' out='/tmp/workspace/partograph-example/output/filled_partograph_normal_delivery_training_example.png' im=Image.open(src).convert('RGBA'); ov=Image.new('RGBA',im.size,(255,255,255,0)); d=ImageDraw.Draw(ov) font='/usr/share/fonts/google-noto-vf/NotoSans[wght].ttf' def F(n): return ImageFont.truetype(font,n) red=(205,32,32,255); blue=(25,85,180,255); green=(18,130,75,255); purple=(120,40,150,255); gray=(80,80,80,160) # identifiers/demonstration label d.rounded_rectangle((647,16,1140,48),8,fill=(255,244,185,240),outline=red,width=2) d.text((658,23),'TRAINING EXAMPLE - NOT A PATIENT RECORD',font=F(13),fill=red) d.text((220,76),'ILLUSTRATIVE CASE',font=F(14),fill=red); d.text((541,76),'G2',font=F(16),fill=blue); d.text((792,76),'P1',font=F(16),fill=blue) d.text((215,108),'17/09/2026',font=F(14),fill=blue); d.text((483,108),'05:00',font=F(14),fill=blue); d.text((776,108),'SROM 08:30',font=F(14),fill=blue); d.text((1070,108),'clear',font=F(12),fill=blue) x0=220; hw=38.15; half=19.075 xh=lambda t:x0+t*hw yf=lambda v:302-(v-100)*1.53 yc=lambda v:748-v*38.05 yp=lambda v:1382-(v-60)*1.95 # fetal heart rate 30 min v=[140,142,138,144,141,139,143,145,140,142,138,144,141,146,142,140,144,141,145,143,140,146,142,144,141,143,145] p=[] for i,z in enumerate(v): x,y=x0+i*half,yf(z);p.append((x,y));d.ellipse((x-3,y-3,x+3,y+3),fill=green) d.line(p,fill=green,width=2) # liquor / moulding for h,txt in [(0,'I/0'),(4,'I/0'),(8,'C/0'),(12,'C/0')]:d.text((xh(h)+3,327),txt,font=F(12),fill=blue) # cervix and descent c=[(0,2),(4,3),(8,4),(9.5,6),(11,8),(12.5,10)]; p=[(xh(t),yc(z)) for t,z in c];d.line(p,fill=red,width=3) for x,y in p:d.line((x-6,y-6,x+6,y+6),fill=red,width=3);d.line((x-6,y+6,x+6,y-6),fill=red,width=3) h=[(8,3),(9.5,2),(11,1),(12.5,0)];q=[] for t,z in h: x,y=xh(t),yc(z);q.append((x,y));d.ellipse((x-6,y-6,x+6,y+6),outline=blue,width=3) d.line(q,fill=blue,width=2) # legend d.rectangle((855,683,1128,738),fill=(255,255,255,230),outline=(80,80,80,255));d.text((866,689),'X Cervix (cm)',font=F(13),fill=red);d.text((866,709),'O Head descent',font=F(13),fill=blue);d.text((866,728),'Normal progress',font=F(12),fill=green) # clock times row for z in range(0,14,2):d.text((xh(z)+1,770),f'{5+z:02d}:00',font=F(10),fill=purple) # contractions 30 min. rows 829..929 for i in range(27): num,cat=(2,1) if i<8 else ((3,2) if i<16 else ((4,2) if i<22 else (4,3))) for r in range(num): x=x0+i*half+1;y=929-(r+1)*20.2+2;fill=[None,(215,215,215,175),(150,150,150,180),(55,55,55,180)][cat];d.rectangle((x,y,x+half-3,y+17),fill=fill) if cat==2:d.line((x,y+17,x+half-3,y),fill=(100,100,100,220)) # medication and maternal data d.text((225,953),'Nil - no augmentation',font=F(13),fill=green);d.text((230,1045),'Oral fluids encouraged',font=F(13),fill=blue);d.text((230,1067),'No IV fluids / drugs',font=F(13),fill=blue) pulse=[80,82,80,84,82,84,86,84,86,88,86,88,90,88,90,92,90,92,94,92,94,96,94,96,98,96,98]; pp=[] for i,z in enumerate(pulse): x,y=x0+i*half,yp(z);pp.append((x,y));d.ellipse((x-3,y-3,x+3,y+3),fill=purple) d.line(pp,fill=purple,width=2) for t,sy,di in [(0,110,70),(4,112,72),(8,112,72),(12,114,74)]: x=xh(t);d.line((x,yp(sy),x,yp(di)),fill=blue,width=3);d.line((x-4,yp(sy),x+4,yp(sy)),fill=blue,width=2);d.line((x-4,yp(di),x+4,yp(di)),fill=blue,width=2) for t,z in [(0,'36.8'),(4,'36.9'),(8,'36.8'),(12,'36.9')]:d.text((xh(t)+2,1401),z,font=F(11),fill=red) for t,z in [(4,'300'),(8,'250'),(12,'300')]:d.text((xh(t)+2,1484),z,font=F(11),fill=blue);d.text((xh(t)+2,1506),'Nil',font=F(10),fill=blue) d.rounded_rectangle((715,1530,1135,1582),8,fill=(225,250,235,240),outline=green,width=2);d.text((728,1538),'17:50 - spontaneous vaginal birth',font=F(14),fill=green);d.text((728,1558),'Mother and baby stable (illustrative)',font=F(12),fill=green) Image.alpha_composite(im,ov).convert('RGB').save(out,quality=95) print(out) PY python -c "from PIL import Image; im=Image.open('/tmp/workspace/partograph-example/output/filled_partograph_normal_delivery_training_example.png'); print(im.size)"
~/partograph-example/output/
filled partograph normal delivery training example
Image · PNG
Create a labeled PDF version for teaching
~/
WHO Labour Care Guide traditional partograph alert line 1 cm per hour not intervention
mkdir -p "/tmp/workspace/partograph-example/teaching-pdf" && python - <<'PY' from reportlab.lib.pagesizes import A4, landscape from reportlab.pdfgen import canvas from reportlab.lib import colors from reportlab.lib.utils import ImageReader from reportlab.pdfbase.pdfmetrics import stringWidth from PIL import Image, ImageDraw, ImageFont from pathlib import Path base=Path('/tmp/workspace/partograph-example') img_path=base/'output/filled_partograph_normal_delivery_training_example.png' outdir=base/'teaching-pdf'; outdir.mkdir(exist_ok=True) annot=outdir/'annotated_partograph.png' pdf=outdir/'Partograph_Normal_Labour_Teaching_Guide.pdf' # Create an annotated image using numbered target markers with a light title banner. im=Image.open(img_path).convert('RGBA') d=ImageDraw.Draw(im) font_path='/usr/share/fonts/google-noto-vf/NotoSans[wght].ttf' def F(s): return ImageFont.truetype(font_path,s) markers=[(245,215,'1'),(242,337,'2'),(522,596,'3'),(523,636,'4'),(500,870,'5'),(450,954,'6'),(450,1220,'7'),(445,1400,'8'),(445,1490,'9')] for x,y,n in markers: d.ellipse((x-12,y-12,x+12,y+12),fill=(255,238,102,250),outline=(35,80,150,255),width=2) bb=d.textbbox((0,0),n,font=F(15)); tw=bb[2]-bb[0]; th=bb[3]-bb[1] d.text((x-tw/2,y-th/2-2),n,font=F(15),fill=(15,45,95,255)) im.convert('RGB').save(annot,quality=94) W,H=landscape(A4); c=canvas.Canvas(str(pdf),pagesize=(W,H)); c.setTitle('Partograph: Normal Labour Teaching Guide') NAVY=colors.HexColor('#17365D'); BLUE=colors.HexColor('#1F4E79'); TEAL=colors.HexColor('#0F6B66'); RED=colors.HexColor('#B22222'); PALE=colors.HexColor('#EAF2F8'); GREY=colors.HexColor('#4A5568') def title(t,sub=None): c.setFillColor(NAVY); c.rect(0,H-52,W,52,fill=1,stroke=0) c.setFillColor(colors.white); c.setFont('Helvetica-Bold',19); c.drawString(28,H-32,t) if sub: c.setFont('Helvetica',8.5); c.drawRightString(W-28,H-32,sub) def footer(pg): c.setStrokeColor(colors.HexColor('#C7D3E0')); c.line(28,25,W-28,25) c.setFillColor(GREY); c.setFont('Helvetica',7.5) c.drawString(28,13,'Illustrative training material only. Use local policy and qualified clinical supervision for patient care.') c.drawRightString(W-28,13,f'Page {pg} of 3') def box(x,y,w,h,heading,body,color=BLUE): c.setFillColor(colors.white); c.setStrokeColor(colors.HexColor('#B9C9D8')); c.roundRect(x,y,w,h,7,fill=1,stroke=1) c.setFillColor(color); c.roundRect(x,y+h-25,w,25,7,fill=1,stroke=0); c.rect(x,y+h-25,w,7,fill=1,stroke=0) c.setFillColor(colors.white); c.setFont('Helvetica-Bold',9); c.drawString(x+9,y+h-16,heading) c.setFillColor(colors.black); c.setFont('Helvetica',8.2) yy=y+h-38 for para in body.split('\n'): words=para.split(); line='' for word in words: cand=(line+' '+word).strip() if stringWidth(cand,'Helvetica',8.2)>w-18: c.drawString(x+9,yy,line); yy-=10; line=word else: line=cand if line:c.drawString(x+9,yy,line);yy-=10 yy-=2 # P1 title('Completed Partograph: normal labour teaching example','Traditional WHO-style chart') c.setFillColor(colors.HexColor('#FFF4CC')); c.roundRect(28,H-82, W-56,20,5,fill=1,stroke=0) c.setFillColor(RED); c.setFont('Helvetica-Bold',8.5); c.drawCentredString(W/2,H-75,'This sample illustrates documentation only. It does not establish an intervention threshold for an individual patient.') # image imr=ImageReader(str(annot)); ix,iy,iw,ih=30,44,410,547 c.setStrokeColor(colors.HexColor('#9FB5C8')); c.rect(ix,iy,iw,ih,stroke=1,fill=0); c.drawImage(imr,ix,iy,width=iw,height=ih,preserveAspectRatio=True,anchor='c') # right boxes x=458; colw=350 c.setFillColor(NAVY); c.setFont('Helvetica-Bold',13); c.drawString(x,H-104,'What each numbered label teaches') items=[ ('1. Fetal heart rate','Green dots show intermittent FHR readings in the usual normal range in this example. Document rate, rhythm and any decelerations according to local protocol.'), ('2. Liquor and moulding','I = intact membranes. C = clear liquor. Moulding is shown as 0. Record findings with vaginal assessment.'), ('3. Cervical dilatation','Red X marks dilatation. The illustrative curve reaches 10 cm with steady progress. Join successive X marks.'), ('4. Descent of head','Blue O marks head descent, moving from 3/5 to 0/5 palpable abdominally.'), ('5. Contractions','Each column summarizes a 10-minute observation. The number of shaded boxes shows frequency; shading represents duration, according to the chart key.'), ('6. Oxytocin / medicines','This uncomplicated example has no augmentation. If given, record the exact prescribed preparation and rate under local policy.'), ('7. Maternal pulse and BP','Purple line = pulse. Blue vertical bars = blood pressure. Watch trends, not only isolated values.'), ('8. Temperature','Values are documented at scheduled intervals. Fever or clinical concern requires assessment.'), ('9. Urine','Record volume and test results when the woman voids.')] y=H-126 for hd,bd in items: box(x,y-47,colw,46,hd,bd,TEAL if hd[0] in '13579' else BLUE);y-=52 footer(1);c.showPage() # P2 title('How to read and fill this example','Timing and sequence for low-risk labour documentation') # table c.setFont('Helvetica-Bold',13); c.setFillColor(NAVY); c.drawString(30,H-84,'Illustrative timeline used in the completed chart') rows=[['Time','Cervix / head','FHR','Contractions in 10 min','Key entry'],['05:00','2 cm, latent phase','140','2, 25-30 sec','Admission, membranes intact'],['09:00','3 cm','140','3, 30-40 sec','Continue observation'],['13:00','4 cm, 3/5','141','3, 35-40 sec','Active phase on this chart'],['14:30','6 cm, 2/5','144','3, 40-45 sec','Clear liquor, no moulding'],['16:00','8 cm, 1/5','142','4, 45-50 sec','Maternal observations stable'],['17:30','10 cm, 0/5','145','4, 50-60 sec','Full dilatation'],['17:50','Birth','Record just before birth','-','Illustrative spontaneous vaginal birth']] x0=30; widths=[67,116,52,125,350]; y=H-106; rh=28 for r,row in enumerate(rows): x=x0 for j,val in enumerate(row): c.setFillColor(NAVY if r==0 else (PALE if r%2 else colors.white));c.setStrokeColor(colors.HexColor('#C4D2DF'));c.rect(x,y-rh,widths[j],rh,fill=1,stroke=1) c.setFillColor(colors.white if r==0 else colors.black);c.setFont('Helvetica-Bold' if r==0 else 'Helvetica',8) c.drawString(x+5,y-rh+10,str(val)); x+=widths[j] y-=rh c.setFillColor(NAVY);c.setFont('Helvetica-Bold',13);c.drawString(30,255,'Typical observation rhythm used for teaching') boxes=[('Every 30 minutes','Fetal heart rate, uterine contractions and maternal pulse, or more frequently if indicated by clinical condition/local protocol.'),('Every 2 hours','Temperature in an uncomplicated course, and sooner if fever or infection is suspected.'),('Every 4 hours','Routine vaginal assessment in low-risk active labour: cervical dilatation, head descent, liquor and moulding. Obtain consent, ensure privacy and use aseptic technique.'),('At each void','Urine volume, protein and acetone/ketones where used. Encourage hydration and bladder emptying.'),('Any time indicated','Reassess immediately for abnormal FHR, meconium, vaginal bleeding, maternal deterioration, urge to push, poor progress or clinical concern.')] y=225 for h,b in boxes: box(30,y,760,36,h,b,TEAL);y-=41 c.setFillColor(colors.HexColor('#FFF4CC'));c.roundRect(30,40,760,36,6,fill=1,stroke=0);c.setFillColor(RED);c.setFont('Helvetica-Bold',8.5);c.drawString(42,62,'Safety point: do not wait for a scheduled time if there is concern. Escalate using your local obstetric protocol.') c.setFillColor(colors.HexColor('#704214'));c.setFont('Helvetica',8.3);c.drawString(42,49,'The 1 cm/hour alert line on a classic partograph should not be used alone to trigger intervention or referral.') footer(2);c.showPage() # P3 title('Interpretation, symbols and teaching discussion','Use the chart with the woman’s complete clinical assessment') box(30,458,365,106,'Symbols used in this example','X = cervical dilatation.\nO = descent of the head.\nI = membranes intact; C = clear liquor.\n0 = no moulding.\nShaded contraction boxes show duration categories used by the local chart.',BLUE) box(410,458,380,106,'Why this is a reassuring illustrative pattern','FHR remains in a reassuring range; liquor remains clear; contractions become more frequent and longer; cervix and descent progress; maternal pulse, BP and temperature remain stable.',TEAL) box(30,316,365,122,'When to stop treating it as “routine”','Assess urgently for persistent abnormal FHR, meconium or bleeding, maternal fever or instability, excessive pain/distress, hyperstimulation, suspected obstruction, or any other clinical concern. Follow local escalation pathways.',RED) box(410,316,380,122,'Classic partograph versus current WHO approach','WHO’s Labour Care Guide replaced the traditional WHO partograph. Labour progress varies widely. A cervical dilatation rate slower than 1 cm/hour alone is not a routine indication for intervention.',BLUE) c.setFillColor(NAVY);c.setFont('Helvetica-Bold',13);c.drawString(30,282,'Teaching prompts') prompts=['1. Locate the X and O series. What do their direction and spacing say about progress?','2. Identify where liquor, moulding and contractions are documented.','3. Which observations in this example would need urgent reassessment if they changed?','4. Why should the alert line never be interpreted without maternal and fetal clinical context?'] y=258 for p in prompts: c.setFillColor(PALE);c.roundRect(30,y-24,760,29,5,fill=1,stroke=0);c.setFillColor(colors.black);c.setFont('Helvetica',9);c.drawString(42,y-14,p);y-=37 c.setFillColor(GREY);c.setFont('Helvetica-Bold',9);c.drawString(30,93,'Selected teaching references') c.setFont('Helvetica',8);c.drawString(30,78,'World Health Organization. WHO Labour Care Guide: User’s Manual (2020).') c.drawString(30,65,'World Health Organization. Monitoring childbirth in a new era for maternal health (2020).') c.setFont('Helvetica-Oblique',7.5);c.drawString(30,48,'The completed image is a fictional scenario created for education. It is not a valid clinical record or a substitute for institutional protocols.') footer(3);c.save() print(pdf) PY python - <<'PY' from pypdf import PdfReader p='/tmp/workspace/partograph-example/teaching-pdf/Partograph_Normal_Labour_Teaching_Guide.pdf' r=PdfReader(p) print('pages',len(r.pages),'first-page-text',r.pages[0].extract_text()[:120]) PY
Partograph Normal Labour Teaching Guide
PDF Document · PDF