attachment
attachment

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

Reading File
analyse_media
Finding Sources
Searching PubMed

partograph labour monitoring

Searching the Web

WHO labour care guide partograph monitoring fetal heart rate contractions cervical dilatation timing

Generating Image

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'.

Reading Web Page

https://iris.who.int/server/api/core/bitstreams/94326918-1f9…

Finding Sources
Browsing Directory

~/

Illustrative completed partograph for an uncomplicated spontaneous vaginal delivery
This is a training example only, not a real patient record. Use your hospital’s approved chart, local protocols, and a skilled birth attendant’s assessment for actual labour care.

Example patient and timeline

Example: G2P1, term singleton cephalic pregnancy, spontaneous labour, clear liquor, no oxytocin, uncomplicated vaginal birth.
  • Admission: 08:00
  • Active labour begins on this classic form: 4 cm at 08:00
  • Full dilatation: 13:00
  • Vaginal birth: approximately 13:20
  • Baby: vigorous at birth, routine newborn assessment

Values to put on the chart

Clock timeCervixHead descentFHRLiquor/mouldingContractions in 10 minMaternal pulse/BP/temp
08:004 cm3/5 palpable140 bpmClear, moulding 02, 25-30 sec80/min, 110/70, 36.8°C
09:00No vaginal exam-138 bpm-3, 30-35 sec82/min
10:00No vaginal exam-142 bpm-3, 35-40 sec80/min
11:006 cm2/5 palpable145 bpmClear, moulding 03, 40-45 sec84/min
12:00No vaginal exam-140 bpm-4, 45-50 sec86/min, 112/72, 36.9°C
13:0010 cm0/5 palpable144 bpmClear, moulding 04, 50-60 sec88/min
13:20Birth-Record immediately before birth--Continue postpartum observation

How to fill each section of your partograph

1. Header

Write, for example:
  • Name: Training example only
  • Gravida/Para: G2 P1
  • Date/time of admission: 08:00
  • Ruptured membranes: spontaneous at 10:30, clear liquor
Do not enter a real person’s identifying details in a teaching image.

2. Fetal heart rate, top graph

  • Plot the fetal heart rate as a dot at each assessment.
  • In this example, record values between 138 and 145 bpm.
  • On a classic partograph, this would be checked and plotted every 30 minutes, ideally documenting the method and any decelerations if your local chart provides space.
  • A persistent FHR below 110 or at or above 160 bpm, or repetitive decelerations, needs prompt clinical assessment.

3. Liquor and moulding row

Record at vaginal examination, usually every 4 hours in uncomplicated active labour, unless there is a reason to assess earlier.
Common notation:
  • I = membranes intact
  • C = clear liquor
  • M = meconium-stained liquor
  • B = blood-stained liquor
  • 0, +, ++, +++ = increasing skull-bone moulding
For this example:
  • 08:00: membranes intact, or write I
  • 11:00: C, 0
  • 13:00: C, 0

4. Cervical dilatation, the main graph

Use an X for cervical dilatation.
For the normal example:
  1. At 08:00, place X at 4 cm.
  2. At 11:00, place X at 6 cm.
  3. At 13:00, place X at 10 cm.
  4. Join the X marks with straight lines.
This curve stays to the left of the alert line, showing satisfactory progress on this traditional chart.

5. Descent of the head

Use an O for descent of the fetal head, then join O marks.
For this example:
  • 08:00: O at 3/5 palpable abdominally
  • 11:00: O at 2/5
  • 13:00: O at 0/5, meaning the head is no longer palpable above the pelvic brim and birth is imminent.
Keep the X for cervix and O for descent distinct.

6. Contractions graph

Assess contractions over a full 10-minute window, typically every 30 minutes.
Each vertical column represents the number of contractions in 10 minutes. Shade each box according to duration, using the key used in your institution. A common convention is:
  • Light shading: less than 20 seconds
  • Diagonal shading: 20-40 seconds
  • Solid shading: more than 40 seconds
For this example:
  • 08:00: 2 contractions, 25-30 sec each
  • 09:00 to 11:00: 3 contractions, 30-45 sec each
  • 12:00: 4 contractions, 45-50 sec each
  • 13:00: 4 contractions, 50-60 sec each

7. Oxytocin row

Write “Nil” or leave according to local chart policy in this example, because labour is progressing normally and no augmentation is being used.
If oxytocin is used, it must be prescribed and documented according to local protocol, including concentration, infusion rate or drops/minute, and reassessment. Do not start oxytocin just because a plotted line is slower than 1 cm/hour.

8. Drugs and IV fluids

For an uncomplicated case:
  • Oral fluids encouraged
  • No IV fluid needed routinely, if the woman can drink and there is no indication
  • Record any actual medication or IV fluid, with time and dose

9. Maternal pulse, blood pressure, and temperature

On this chart:
  • Plot pulse using dots at the appropriate time, commonly every 30 minutes
  • Record blood pressure about every 4 hours if low risk, or more often if indicated
  • Record temperature about every 2 hours
Example:
  • Pulse: 80, 82, 80, 84, 86, 88/min
  • BP: 110/70 at 08:00 and 112/72 at 12:00
  • Temperature: 36.8°C at 08:00 and 36.9°C at 12:00

10. Urine

At each void, record:
  • Time
  • Volume
  • Protein
  • Acetone/ketones
Example at 10:00:
  • Volume 300 mL
  • Protein negative
  • Acetone negative

Timing summary for this classic chart

ObservationUsual interval in uncomplicated labour
Fetal heart rateEvery 30 minutes
Uterine contractionsEvery 30 minutes
Maternal pulseEvery 30 minutes
TemperatureEvery 2 hours
Blood pressureEvery 4 hours
Vaginal examination: cervix, descent, liquor, mouldingEvery 4 hours, or sooner if clinically indicated
UrineAt each void

Important interpretation point

Your form is a traditional WHO-style partograph with alert and action lines. It is useful for structured documentation, but the older “1 cm/hour” alert-line concept should not be used by itself to diagnose abnormal labour or trigger intervention. WHO now uses the Labour Care Guide and emphasizes individualized assessment of maternal and fetal wellbeing, contractions, descent, and the woman’s clinical condition. The WHO Labour Care Guide manual supports 4-hourly routine vaginal examination in low-risk active labour and intermittent rather than routine continuous fetal monitoring. WHO also states that the traditional 1 cm/hour threshold is not an appropriate standalone trigger for intervention in spontaneous labour, as explained in its Labour Care Guide update.

Fill the partograph on image i have provided you

Reading File
analyse_media
Searching the Web

WHO traditional partograph recording fetal heart rate 30 minutes contractions 30 minutes cervical dilatation 4 hours

Browsing Directory

~/

Browsing Directory

~/attachments/1bc5d4bd-1ccc-4e7e-9c1a-9bef35a01ec0/

Reading File
Running Command

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)"

Running Command

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)"

Running Command

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

Finding Files

**/DejaVuSans.ttf in /usr/share/fonts

Running Command

fc-match -f '%{file}\n' sans | sed -n '1p'

Running Command

python - <<'PY' p='/tmp/workspace/partograph-example/src_fill.py' from pathlib import Path # previous full script unavailable, need recreate concise PY

Running Command

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)"

Reading File
Browsing Directory

~/partograph-example/output/

I filled your provided partograph as an illustrative normal spontaneous vaginal delivery case, with normal fetal heart rate, progressive cervical dilatation and descent, increasing effective contractions, stable maternal observations, clear liquor, and no oxytocin.

filled partograph normal delivery training example

Image · PNG

The plotted example shows:
  • 05:00 admission, G2P1
  • Cervical dilatation from 2 cm to 10 cm
  • Active labour from 4 cm, with progress remaining left of the traditional alert line
  • FHR maintained around 138-146 bpm
  • Liquor initially intact, then clear
  • Descent from 3/5 to 0/5
  • Birth documented at 17:50
  • No augmentation or IV medications in this uncomplicated illustrative case
It is labelled “Training example - not a patient record.”

Create a labeled PDF version for teaching

Reading File
Reading File
Browsing Directory

~/

Searching the Web

WHO Labour Care Guide traditional partograph alert line 1 cm per hour not intervention

Running Command

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

Created a 3-page labeled teaching PDF containing:
  1. The completed partograph with numbered labels
  2. A step-by-step timing and documentation guide
  3. Interpretation points, symbols, teaching prompts, and safety notes

Partograph Normal Labour Teaching Guide

PDF Document · PDF

It is clearly marked as an illustrative training example, not a patient record.
This is a shared conversation. Sign in to Orris to start your own chat.