Abnormal bp range acc to harrishon
"hypertension"[MeSH Terms] AND classification
Harrison's Principles of Internal Medicine blood pressure classification normal elevated hypertension range
| Category | Systolic BP | Diastolic BP |
|---|---|---|
| Normal | <120 | and <80 mmHg |
| Elevated BP | 120-129 | and <80 mmHg |
| Stage 1 hypertension | 130-139 | or 80-89 mmHg |
| Stage 2 hypertension | ≥140 | or ≥90 mmHg |
| Hypertensive crisis | >180 | and/or >120 mmHg |
low bp
"hypotension"[MeSH Terms]
hypotension definition systolic blood pressure less than 90 mm Hg clinical guideline
from harrison
"orthostatic hypotension"[MeSH Terms]
Harrison's Principles Internal Medicine 22e hypotension orthostatic definition 20 10 mm Hg
A fall in systolic BP ≥20 mmHg or diastolic BP ≥10 mmHg after 3 minutes of standing or head-up tilt-table testing.
is there any normal range for bp in harrison or any standard books
"blood pressure"[MeSH Terms] AND classification
2024 ESC hypertension guidelines blood pressure classification optimal normal high normal 120 129 130 139
| Category | Systolic | Diastolic |
|---|---|---|
| Optimal | <120 | <80 mmHg |
| Normal | 120-129 | and/or 80-84 mmHg |
| High-normal | 130-139 | and/or 85-89 mmHg |
| Hypertension | ≥140 | and/or ≥90 mmHg |
Create a quick-reference BP classification PDF
~/
mkdir -p "/tmp/workspace/bp-quick-reference/src" "/tmp/workspace/bp-quick-reference/output" && python - <<'PY' from reportlab.lib.pagesizes import A4 from reportlab.lib import colors from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib.enums import TA_CENTER, TA_LEFT from reportlab.lib.units import mm from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, KeepTogether from reportlab.pdfbase.pdfmetrics import stringWidth from reportlab.pdfbase.ttfonts import TTFont from reportlab.pdfbase import pdfmetrics from reportlab.lib.colors import HexColor from reportlab.pdfbase.pdfmetrics import registerFontFamily from reportlab.pdfbase.ttfonts import TTFont from reportlab.lib.pagesizes import A4 from reportlab.pdfbase.pdfmetrics import stringWidth from reportlab.pdfgen import canvas from pathlib import Path out = Path('/tmp/workspace/bp-quick-reference/output/BP_Classification_Quick_Reference.pdf') PAGE_W, PAGE_H = A4 NAVY = HexColor('#143B5E') BLUE = HexColor('#2075B8') PALE_BLUE = HexColor('#EAF3FA') PALE_GREEN = HexColor('#EAF6EF') PALE_AMBER = HexColor('#FFF5DD') PALE_RED = HexColor('#FCE8E6') TEXT = HexColor('#1F2933') MUTED = HexColor('#52606D') GRID = HexColor('#C9D6E2') styles = getSampleStyleSheet() styles.add(ParagraphStyle(name='TitleQR', parent=styles['Title'], fontName='Helvetica-Bold', fontSize=20, leading=24, textColor=NAVY, alignment=TA_CENTER, spaceAfter=4)) styles.add(ParagraphStyle(name='SubQR', parent=styles['Normal'], fontName='Helvetica', fontSize=8.8, leading=11, textColor=MUTED, alignment=TA_CENTER, spaceAfter=10)) styles.add(ParagraphStyle(name='HeadingQR', parent=styles['Heading2'], fontName='Helvetica-Bold', fontSize=11.2, leading=14, textColor=NAVY, spaceBefore=7, spaceAfter=4)) styles.add(ParagraphStyle(name='BodyQR', parent=styles['BodyText'], fontName='Helvetica', fontSize=8.5, leading=11, textColor=TEXT)) styles.add(ParagraphStyle(name='SmallQR', parent=styles['BodyText'], fontName='Helvetica', fontSize=7.3, leading=9.1, textColor=MUTED)) styles.add(ParagraphStyle(name='CellQR', parent=styles['BodyText'], fontName='Helvetica', fontSize=8.1, leading=10, textColor=TEXT)) styles.add(ParagraphStyle(name='CellBoldQR', parent=styles['BodyText'], fontName='Helvetica-Bold', fontSize=8.1, leading=10, textColor=TEXT)) styles.add(ParagraphStyle(name='CellWhiteQR', parent=styles['BodyText'], fontName='Helvetica-Bold', fontSize=8.1, leading=10, textColor=colors.white)) class NumberedCanvas(canvas.Canvas): def __init__(self,*args,**kwargs): canvas.Canvas.__init__(self,*args,**kwargs) self._saved_page_states=[] def showPage(self): self._saved_page_states.append(dict(self.__dict__)) self._startPage() def save(self): num_pages=len(self._saved_page_states) for state in self._saved_page_states: self.__dict__.update(state) self.setStrokeColor(GRID); self.setLineWidth(0.5) self.line(15*mm, 14*mm, PAGE_W-15*mm, 14*mm) self.setFillColor(MUTED); self.setFont('Helvetica', 7) self.drawString(15*mm, 9.5*mm, 'Quick-reference educational aid - confirm diagnosis with repeated, correctly measured readings.') self.drawRightString(PAGE_W-15*mm, 9.5*mm, f'Page {self._pageNumber} of {num_pages}') canvas.Canvas.showPage(self) canvas.Canvas.save(self) doc=SimpleDocTemplate(str(out), pagesize=A4, rightMargin=15*mm,leftMargin=15*mm,topMargin=14*mm,bottomMargin=19*mm, title='Blood Pressure Classification: Quick Reference', author='Orris') P=lambda t,s='BodyQR': Paragraph(t, styles[s]) story=[] story.append(P('Blood Pressure Classification', 'TitleQR')) story.append(P('Adult office blood pressure quick reference | Values in mmHg | Use the higher category when SBP and DBP differ', 'SubQR')) story.append(P('1. Harrison\'s Principles of Internal Medicine, 22e', 'HeadingQR')) story.append(P('<b>Optimal blood pressure:</b> <b><120/<80 mmHg.</b> Harrison\'s uses this as an optimal level and emphasizes that cardiovascular risk increases continuously as BP rises. It does not set a universal resting “low BP” range.', 'BodyQR')) story.append(Spacer(1,5)) story.append(P('2. Traditional office BP classification - ESC/ESH-style', 'HeadingQR')) rows=[ [P('Category','CellWhiteQR'),P('Systolic BP','CellWhiteQR'),P('Diastolic BP','CellWhiteQR')], [P('<b>Optimal</b>','CellBoldQR'),P('<120','CellQR'),P('<80','CellQR')], [P('<b>Normal</b>','CellBoldQR'),P('120-129','CellQR'),P('80-84','CellQR')], [P('<b>High-normal</b>','CellBoldQR'),P('130-139','CellQR'),P('85-89','CellQR')], [P('<b>Grade 1 hypertension</b>','CellBoldQR'),P('140-159','CellQR'),P('90-99','CellQR')], [P('<b>Grade 2 hypertension</b>','CellBoldQR'),P('160-179','CellQR'),P('100-109','CellQR')], [P('<b>Grade 3 hypertension</b>','CellBoldQR'),P('≥180','CellQR'),P('≥110','CellQR')], [P('<b>Isolated systolic hypertension</b>','CellBoldQR'),P('≥140','CellQR'),P('<90','CellQR')], ] t=Table(rows, colWidths=[85*mm,42*mm,42*mm], repeatRows=1, hAlign='LEFT') t.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,0),NAVY),('TEXTCOLOR',(0,0),(-1,0),colors.white),('ALIGN',(1,0),(-1,-1),'CENTER'),('VALIGN',(0,0),(-1,-1),'MIDDLE'), ('GRID',(0,0),(-1,-1),0.45,GRID),('BOX',(0,0),(-1,-1),0.7,NAVY),('ROWBACKGROUNDS',(0,1),(-1,-1),[colors.white,PALE_BLUE]), ('LEFTPADDING',(0,0),(-1,-1),7),('RIGHTPADDING',(0,0),(-1,-1),7),('TOPPADDING',(0,0),(-1,-1),5),('BOTTOMPADDING',(0,0),(-1,-1),5) ])) story.append(t) story.append(P('<b>Rule:</b> “and/or” applies. For example, 128/92 mmHg is classified as Grade 1 hypertension because the diastolic value is in that range.', 'SmallQR')) story.append(P('3. ACC/AHA adult office BP classification', 'HeadingQR')) rows2=[ [P('Category','CellWhiteQR'),P('Office BP','CellWhiteQR')], [P('<b>Normal</b>','CellBoldQR'),P('<120 <b>and</b> <80','CellQR')], [P('<b>Elevated</b>','CellBoldQR'),P('120-129 <b>and</b> <80','CellQR')], [P('<b>Stage 1 hypertension</b>','CellBoldQR'),P('130-139 <b>or</b> 80-89','CellQR')], [P('<b>Stage 2 hypertension</b>','CellBoldQR'),P('≥140 <b>or</b> ≥90','CellQR')], ] t2=Table(rows2, colWidths=[85*mm,84*mm], repeatRows=1, hAlign='LEFT') t2.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,0),BLUE),('TEXTCOLOR',(0,0),(-1,0),colors.white),('ALIGN',(1,0),(1,-1),'CENTER'),('VALIGN',(0,0),(-1,-1),'MIDDLE'), ('GRID',(0,0),(-1,-1),0.45,GRID),('BOX',(0,0),(-1,-1),0.7,BLUE),('ROWBACKGROUNDS',(0,1),(-1,-1),[colors.white,PALE_BLUE]), ('LEFTPADDING',(0,0),(-1,-1),7),('RIGHTPADDING',(0,0),(-1,-1),7),('TOPPADDING',(0,0),(-1,-1),5),('BOTTOMPADDING',(0,0),(-1,-1),5) ])) story.append(t2) story.append(P('4. Low BP and postural BP fall', 'HeadingQR')) lowrows=[ [P('<b>Practical “low BP” threshold</b>','CellBoldQR'),P('<b><90/60 mmHg</b> is commonly used clinically, but Harrison\'s does not define general resting hypotension by this single cutoff.','CellQR')], [P('<b>Orthostatic hypotension<br/>(Harrison\'s definition)</b>','CellBoldQR'),P('Fall in <b>SBP ≥20 mmHg</b> or <b>DBP ≥10 mmHg</b> after <b>3 minutes</b> of standing or head-up tilt.','CellQR')], ] t3=Table(lowrows,colWidths=[65*mm,104*mm],hAlign='LEFT') t3.setStyle(TableStyle([ ('GRID',(0,0),(-1,-1),0.45,GRID),('BOX',(0,0),(-1,-1),0.7,NAVY),('VALIGN',(0,0),(-1,-1),'MIDDLE'),('BACKGROUND',(0,0),(0,-1),PALE_AMBER),('BACKGROUND',(1,0),(1,-1),colors.white), ('LEFTPADDING',(0,0),(-1,-1),7),('RIGHTPADDING',(0,0),(-1,-1),7),('TOPPADDING',(0,0),(-1,-1),6),('BOTTOMPADDING',(0,0),(-1,-1),6) ])) story.append(t3) story.append(P('Safety note', 'HeadingQR')) alert=Table([[P('<b>Emergency assessment:</b> BP >180/120 mmHg with chest pain, shortness of breath, neurologic deficit, visual change, confusion, or other acute symptoms needs urgent emergency evaluation. Low BP with fainting, cold/clammy skin, confusion, chest pain, severe breathlessness, or bleeding also needs urgent assessment.','BodyQR')]],colWidths=[169*mm]) alert.setStyle(TableStyle([('BACKGROUND',(0,0),(-1,-1),PALE_RED),('BOX',(0,0),(-1,-1),0.7,HexColor('#C0392B')),('LEFTPADDING',(0,0),(-1,-1),8),('RIGHTPADDING',(0,0),(-1,-1),8),('TOPPADDING',(0,0),(-1,-1),7),('BOTTOMPADDING',(0,0),(-1,-1),7)])) story.append(alert) story.append(Spacer(1,6)) story.append(P('<b>Sources:</b> Harrison\'s Principles of Internal Medicine, 22e, p. 52 (optimal BP <120/<80 mmHg); Harrison\'s, 22e, “Neurally Mediated Syncope” (orthostatic hypotension definition). Traditional office classification: ESC/ESH. ACC/AHA classification: 2017 ACC/AHA BP guideline.','SmallQR')) doc.build(story, canvasmaker=NumberedCanvas) print(out) PY python - <<'PY' from pypdf import PdfReader p='/tmp/workspace/bp-quick-reference/output/BP_Classification_Quick_Reference.pdf' r=PdfReader(p) print('pages',len(r.pages)) print(r.pages[0].extract_text()[:1000]) PY
python - <<'PY' import fitz from pathlib import Path pdf=Path('/tmp/workspace/bp-quick-reference/output/BP_Classification_Quick_Reference.pdf') out=Path('/tmp/workspace/bp-quick-reference/output/preview_page1.png') doc=fitz.open(pdf) p=doc[0] pix=p.get_pixmap(matrix=fitz.Matrix(1.3,1.3), alpha=False) pix.save(out) print(f'pages={len(doc)} size={pdf.stat().st_size} preview={out} preview_size={out.stat().st_size}') PY
python - <<'PY' from pathlib import Path from pypdf import PdfReader p=Path('/tmp/workspace/bp-quick-reference/output/BP_Classification_Quick_Reference.pdf') r=PdfReader(str(p)) text=r.pages[0].extract_text() required=['Optimal blood pressure: <120/<80 mmHg','Orthostatic hypotension','Stage 2 hypertension','Safety note','Page 1 of 1'] missing=[x for x in required if x not in text] print('exists=',p.exists(),'bytes=',p.stat().st_size,'pages=',len(r.pages),'missing=',missing) assert p.exists() and p.stat().st_size > 5000 and len(r.pages)==1 and not missing PY
BP Classification Quick Reference
PDF Document · PDF