Insulin injection
"insulin"[MeSH Terms] AND "injections, subcutaneous"[MeSH Terms]
insulin injection sites subcutaneous abdomen thigh
insulin injection technique pen needle length site rotation recommendations
| Type | Examples | Timing and notes |
|---|---|---|
| Short-acting (regular) | Regular human insulin | Inject 30-45 min before a meal. It forms hexamers, which slows absorption. |
| Rapid-acting analogues | Lispro, aspart, glulisine | Inject 15 min or less before a meal. They dissociate quickly into monomers. They cause less hypoglycemia than regular insulin. |
| Intermediate | NPH | Cloudy suspension with zinc and protamine. Given at bedtime or twice daily. |
| Long-acting analogues | Glargine, detemir, degludec | Basal coverage. Glargine is acidic (pH 4), so it cannot be mixed with short-acting insulins. |
Make a patient education handout on insulin injection technique
https://diabetesjournals.org/clinical/article/37/3/227/32887…
insulin pen injection sites body diagram
mkdir -p /tmp/workspace/insulin-handout && cat > /tmp/workspace/insulin-handout/make.py <<'EOF' from reportlab.lib.pagesizes import letter from reportlab.lib.styles import ParagraphStyle from reportlab.lib import colors from reportlab.lib.units import inch from reportlab.platypus import (SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, Flowable, PageBreak, KeepTogether) NAVY = colors.HexColor("#1F3A5F"); TEAL = colors.HexColor("#2A7F8E") LIGHT = colors.HexColor("#E8F3F5"); WARN = colors.HexColor("#FDF1E3"); WARNB = colors.HexColor("#D9822B") RED = colors.HexColor("#FBE9E7"); REDB = colors.HexColor("#C0392B") body = ParagraphStyle("body", fontName="Helvetica", fontSize=10.5, leading=14.5) small = ParagraphStyle("small", parent=body, fontSize=9, leading=12, textColor=colors.HexColor("#444444")) h1 = ParagraphStyle("h1", fontName="Helvetica-Bold", fontSize=22, leading=26, textColor=NAVY) sub = ParagraphStyle("sub", parent=body, fontSize=11.5, textColor=TEAL) h2 = ParagraphStyle("h2", fontName="Helvetica-Bold", fontSize=13.5, leading=17, textColor=NAVY, spaceBefore=10, spaceAfter=4) cell = ParagraphStyle("cell", parent=body, fontSize=10, leading=13.5) cellb = ParagraphStyle("cellb", parent=cell, fontName="Helvetica-Bold") step = ParagraphStyle("step", parent=body, fontSize=10.5, leading=14) def P(t, s=body): return Paragraph(t, s) class BodyDiagram(Flowable): def __init__(self, w=6.8*inch, h=3.1*inch): super().__init__(); self.width=w; self.height=h def figure(self, c, cx, back): skin = colors.HexColor("#F3E3D3"); line = colors.HexColor("#8A7B6C") zone = colors.HexColor("#3FA7B8") c.setLineWidth(1); c.setStrokeColor(line); c.setFillColor(skin) y0 = 0.1*inch # head c.circle(cx, y0+2.75*inch, 0.22*inch, fill=1, stroke=1) # torso c.roundRect(cx-0.5*inch, y0+1.4*inch, 1.0*inch, 1.2*inch, 0.18*inch, fill=1, stroke=1) # arms c.roundRect(cx-0.72*inch, y0+1.35*inch, 0.2*inch, 1.2*inch, 0.09*inch, fill=1, stroke=1) c.roundRect(cx+0.52*inch, y0+1.35*inch, 0.2*inch, 1.2*inch, 0.09*inch, fill=1, stroke=1) # legs c.roundRect(cx-0.48*inch, y0+0.0*inch, 0.44*inch, 1.5*inch, 0.15*inch, fill=1, stroke=1) c.roundRect(cx+0.04*inch, y0+0.0*inch, 0.44*inch, 1.5*inch, 0.15*inch, fill=1, stroke=1) c.setFillColor(zone); c.setStrokeColor(colors.HexColor("#1E6F7D")) if not back: # abdomen (two sides of navel) c.roundRect(cx-0.42*inch, y0+1.5*inch, 0.30*inch, 0.62*inch, 0.08*inch, fill=1, stroke=1) c.roundRect(cx+0.12*inch, y0+1.5*inch, 0.30*inch, 0.62*inch, 0.08*inch, fill=1, stroke=1) c.setFillColor(colors.white); c.circle(cx, y0+1.8*inch, 0.05*inch, fill=1, stroke=1) c.setFillColor(zone) # thighs c.roundRect(cx-0.44*inch, y0+0.75*inch, 0.36*inch, 0.65*inch, 0.1*inch, fill=1, stroke=1) c.roundRect(cx+0.08*inch, y0+0.75*inch, 0.36*inch, 0.65*inch, 0.1*inch, fill=1, stroke=1) # outer arms else: # buttocks c.roundRect(cx-0.44*inch, y0+1.4*inch, 0.40*inch, 0.45*inch, 0.12*inch, fill=1, stroke=1) c.roundRect(cx+0.04*inch, y0+1.4*inch, 0.40*inch, 0.45*inch, 0.12*inch, fill=1, stroke=1) # back of upper arms c.roundRect(cx-0.72*inch, y0+1.9*inch, 0.2*inch, 0.55*inch, 0.09*inch, fill=1, stroke=1) c.roundRect(cx+0.52*inch, y0+1.9*inch, 0.2*inch, 0.55*inch, 0.09*inch, fill=1, stroke=1) c.setFillColor(colors.HexColor("#333333")); c.setFont("Helvetica-Bold", 9) c.drawCentredString(cx, y0-0.08*inch, "BACK VIEW" if back else "FRONT VIEW") def draw(self): c = self.canv self.figure(c, 1.0*inch, False) self.figure(c, 2.9*inch, True) # legend x = 4.0*inch c.setFont("Helvetica-Bold", 10.5); c.setFillColor(NAVY) c.drawString(x, 2.75*inch, "Where you can inject") items = [("Belly (abdomen)", "Fastest, most even absorption. Stay 2 inches" , "(5 cm) away from the belly button."), ("Thighs", "Front and outer part, in the middle.", "Slower absorption."), ("Buttocks", "Upper outer area. Good for", "long-acting insulin."), ("Back of upper arms", "Fatty area only. Hard to reach", "alone, so a helper may be needed.")] yy = 2.4*inch for t, l1, l2 in items: c.setFillColor(colors.HexColor("#3FA7B8")); c.rect(x, yy+0.02*inch, 0.14*inch, 0.14*inch, fill=1, stroke=0) c.setFillColor(colors.black); c.setFont("Helvetica-Bold", 9.5); c.drawString(x+0.22*inch, yy+0.03*inch, t) c.setFont("Helvetica", 8.8); c.drawString(x+0.22*inch, yy-0.12*inch, l1); c.drawString(x+0.22*inch, yy-0.25*inch, l2) yy -= 0.5*inch def box(paras, bg, border): t = Table([[paras]], colWidths=[7.0*inch]) t.setStyle(TableStyle([("BACKGROUND",(0,0),(-1,-1),bg),("BOX",(0,0),(-1,-1),1.2,border), ("LEFTPADDING",(0,0),(-1,-1),10),("RIGHTPADDING",(0,0),(-1,-1),10), ("TOPPADDING",(0,0),(-1,-1),7),("BOTTOMPADDING",(0,0),(-1,-1),7)])) return t def footer(canvas, doc): canvas.saveState(); canvas.setFont("Helvetica", 8); canvas.setFillColor(colors.HexColor("#666666")) canvas.drawString(0.75*inch, 0.5*inch, "This handout is general education and does not replace advice from your care team. Follow your own insulin plan.") canvas.drawRightString(7.75*inch, 0.5*inch, f"Page {doc.page}") canvas.restoreState() doc = SimpleDocTemplate("/tmp/workspace/insulin-handout/Insulin_Injection_Technique_Patient_Handout.pdf", pagesize=letter, leftMargin=0.75*inch, rightMargin=0.75*inch, topMargin=0.6*inch, bottomMargin=0.8*inch, title="How to Inject Insulin: Patient Handout", author="Orris") S = [] S += [P("How to Inject Insulin Safely", h1), P("A step-by-step guide for insulin pens", sub), Spacer(1,6)] fill = Table([[P("<b>Name:</b> ______________________", cell), P("<b>Date:</b> ______________", cell)], [P("<b>My insulin(s):</b> ___________________________________________", cell), ""]], colWidths=[3.8*inch, 3.2*inch]) fill.setStyle(TableStyle([("SPAN",(0,1),(1,1)),("TOPPADDING",(0,0),(-1,-1),3)])) S += [fill, Spacer(1,4)] S.append(P("Before you start", h2)) S.append(P("• Wash your hands with soap and water.<br/>" "• Check the label: <b>right insulin</b>, not expired.<br/>" "• Look at the insulin. Clear insulin should be clear. Do not use it if it looks cloudy, has clumps, or has particles.<br/>" "• <b>Cloudy insulin (NPH or premixed)</b> is the exception. Roll the pen gently between your palms 10 times and tip it up and down 10 times until it looks evenly milky. Do not shake hard.")) S.append(P("Step by step", h2)) steps = [ ("1", "<b>Attach a new needle.</b> Remove the paper tab, screw the needle on straight, and take off both caps. Keep the outer cap for later."), ("2", "<b>Do the safety test (prime).</b> Dial 2 units, point the needle up, and press the button. Look for a drop of insulin at the tip. If there is none, repeat. If there is still none, change the needle."), ("3", "<b>Dial your dose.</b> Turn the dial to the number of units your care team prescribed. Check it twice."), ("4", "<b>Pick your spot.</b> Choose a clean area of skin that is free of lumps, bruises, scars, or swelling (see the next page). Clean the skin only if it is dirty."), ("5", "<b>Insert the needle straight in (90 degrees).</b> Short needles (4 to 6 mm) usually do not need a skin pinch. Your care team may tell you to gently pinch the skin if you are very thin or using a longer needle."), ("6", "<b>Press the button all the way down</b> and <b>count slowly to 10</b> before pulling the needle out. This makes sure you get the whole dose."), ("7", "<b>Remove the needle and throw it away.</b> Put the outer cap back on, unscrew the needle, and drop it in a sharps container. Never reuse a needle and never share a pen."), ] rows = [[P(f"<font color='white'><b>{n}</b></font>", ParagraphStyle('n', parent=body, alignment=1, fontSize=13)), P(t, step)] for n,t in steps] st = Table(rows, colWidths=[0.4*inch, 6.6*inch]) ts = [("VALIGN",(0,0),(-1,-1),"MIDDLE"),("TOPPADDING",(0,0),(-1,-1),5),("BOTTOMPADDING",(0,0),(-1,-1),5), ("LINEBELOW",(1,0),(1,-2),0.4,colors.HexColor("#CCCCCC"))] for i in range(len(steps)): ts.append(("BACKGROUND",(0,i),(0,i),TEAL)) st.setStyle(TableStyle(ts)); S.append(st) S.append(Spacer(1,8)) S.append(box([P("<b>Tips</b><br/>• Do not rub the spot after injecting. If you see a small drop of blood or insulin, press lightly with a tissue.<br/>" "• Take rapid-acting insulin at the time your care team told you (usually within 15 minutes of eating). Regular insulin is usually taken 30 to 45 minutes before a meal. Follow your own plan.", cell)], LIGHT, TEAL)) S.append(PageBreak()) S.append(P("Where and how to rotate your injection sites", h2)) S.append(BodyDiagram()) S.append(Spacer(1,12)) S.append(P("<b>Rotate every time</b>", ParagraphStyle('r', parent=body, fontName="Helvetica-Bold", textColor=NAVY, fontSize=11.5))) S.append(P("• Using the same spot again and again can cause <b>lumps (lipohypertrophy)</b>. Insulin does not absorb well from lumpy skin, so your blood sugar may become hard to predict.<br/>" "• Pick one body area for the same time of day (for example, belly for breakfast), then <b>move each shot about 1 inch (a finger width) from the last one</b>. Moving between different areas changes how fast the insulin works.<br/>" "• Never inject into a lump, scar, bruise, mole, or swollen skin. Look at and feel your sites every few weeks. Tell your care team if you find a lump.<br/>" "• Changing from a lumpy site to a healthy one can lower your insulin needs. Check your blood sugar more often and ask your care team before changing your dose.")) S.append(Spacer(1,4)) S.append(P("Needle tips", h2)) nt = Table([[P("<b>Needle length</b>", cell), P("Short needles (4, 5, or 6 mm) are recommended for most adults and children, including people with larger bodies. Needles 8 mm or longer are usually not needed and raise the chance of injecting into muscle.", cell)], [P("<b>One needle, one use</b>", cell), P("A new needle for each injection stays sharper, hurts less, and lowers the risk of lumps and bent or blocked tips.", cell)], [P("<b>Pens are personal</b>", cell), P("Never share a pen with anyone, even with a new needle. Blood can get inside the pen.", cell)]], colWidths=[1.5*inch, 5.5*inch]) nt.setStyle(TableStyle([("GRID",(0,0),(-1,-1),0.5,colors.HexColor("#BBBBBB")),("BACKGROUND",(0,0),(0,-1),LIGHT), ("VALIGN",(0,0),(-1,-1),"MIDDLE"),("TOPPADDING",(0,0),(-1,-1),4),("BOTTOMPADDING",(0,0),(-1,-1),4)])) S.append(nt) S.append(P("Storing your insulin", h2)) S.append(P("• <b>Unopened insulin:</b> keep in the refrigerator (36 to 46 F, or 2 to 8 C). Never freeze it. Throw away insulin that has frozen.<br/>" "• <b>Pen in use:</b> keep at room temperature, away from heat, sun, and cars. Most pens last about 28 days once opened, but it varies. Check the package for your brand, and write the date you opened it on the pen.<br/>" "• Take cold insulin out for a little while before use. Cold insulin can sting.")) S.append(PageBreak()) S.append(P("If something goes wrong", h2)) S.append(box([P("<font color='#C0392B'><b>Low blood sugar (below 70 mg/dL or 3.9 mmol/L)</b></font><br/>" "<b>Signs:</b> shaky, sweaty, hungry, dizzy, fast heartbeat, headache, confusion, or irritability.<br/>" "<b>Follow the 15-15 rule:</b><br/>" "1. Take 15 grams of fast sugar: 3 to 4 glucose tablets, or 4 oz (half a cup) of juice or regular soda.<br/>" "2. Wait 15 minutes and check again.<br/>" "3. If still below 70, repeat. Once you are above 70, eat a snack or meal if the next meal is more than an hour away.<br/>" "<b>Call 911</b> if the person cannot swallow, passes out, or has a seizure. Do not put food or drink in the mouth of someone who is not awake. Tell your family where your glucagon is and how to use it, if you have it.", cell)], RED, REDB)) S.append(Spacer(1,8)) tbl = [[P("<b>Problem</b>", cellb), P("<b>What to do</b>", cellb)], [P("Insulin leaks from the skin after injection", cell), P("Hold the needle in for a full count of 10 and press the button fully. Do not take a second dose. Check your blood sugar and mention it to your care team.", cell)], [P("Forgot a dose or not sure if you took it", cell), P("Do not double up. Check your blood sugar and call your care team or pharmacist for advice for your insulin type.", cell)], [P("Pen is hard to press or no drop at the tip", cell), P("Change the needle and prime again. If it still does not work, use a new pen and tell your pharmacy.", cell)], [P("Pain, redness, or bruising at the site", cell), P("Small bruises can happen. Use a new needle each time and a different spot. Call your care team if the area becomes hot, swollen, or keeps getting worse.", cell)], [P("Sick day, vomiting, or not eating", cell), P("Do not stop long-acting insulin on your own. Check your blood sugar more often and call your care team for sick day instructions.", cell)]] t = Table(tbl, colWidths=[2.3*inch, 4.7*inch]) t.setStyle(TableStyle([("GRID",(0,0),(-1,-1),0.5,colors.HexColor("#BBBBBB")),("BACKGROUND",(0,0),(-1,0),LIGHT), ("VALIGN",(0,0),(-1,-1),"TOP"),("TOPPADDING",(0,0),(-1,-1),4),("BOTTOMPADDING",(0,0),(-1,-1),4)])) S.append(t) S.append(P("My insulin plan (to be filled in by my care team)", h2)) plan = [[P("<b>Insulin</b>", cellb), P("<b>Dose (units)</b>", cellb), P("<b>When</b>", cellb), P("<b>Notes</b>", cellb)]] + [["","","",""] for _ in range(4)] pt = Table(plan, colWidths=[2.0*inch, 1.2*inch, 1.8*inch, 2.0*inch], rowHeights=[0.28*inch]+[0.34*inch]*4) pt.setStyle(TableStyle([("GRID",(0,0),(-1,-1),0.5,colors.HexColor("#999999")),("BACKGROUND",(0,0),(-1,0),LIGHT)])) S.append(pt) S.append(Spacer(1,8)) S.append(box([P("<b>Call your care team if</b> your blood sugar is often too high or too low, you have frequent lows, you find lumps at your sites, " "you are not sure about your dose, or you feel unwell with high sugars, nausea, vomiting, or stomach pain.<br/>" "<b>My care team phone:</b> ________________________ <b>After hours:</b> ________________________", cell)], WARN, WARNB)) S.append(Spacer(1,8)) S.append(P("Sources: Goodman & Gilman's The Pharmacological Basis of Therapeutics (insulin therapy and absorption); ADA Standards of Medical Care in Diabetes (injection technique, short needles, site rotation); CDC injection safety guidance (pens are single-patient use).", small)) doc.build(S, onFirstPage=footer, onLaterPages=footer) EOF cd /tmp/workspace/insulin-handout && python make.py && python -c " import pdfplumber p=pdfplumber.open('Insulin_Injection_Technique_Patient_Handout.pdf'); print(len(p.pages)) for i,pg in enumerate(p.pages): pg.to_image(resolution=70).save(f'p{i+1}.png') "; ls
cd /tmp/workspace/insulin-handout && rm -f p1.png p2.png p3.png && ls -la
Insulin Injection Technique Patient Handout
PDF Document · PDF
Make a large-print version of this handout0 years
cd /tmp/workspace/insulin-handout && cat > make_large.py <<'EOF' from reportlab.lib.pagesizes import letter from reportlab.lib.styles import ParagraphStyle from reportlab.lib import colors from reportlab.lib.units import inch from reportlab.platypus import (SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, Flowable, PageBreak) NAVY = colors.HexColor("#14284A"); TEAL = colors.HexColor("#1B6572") LIGHT = colors.HexColor("#E3F0F3"); WARN = colors.HexColor("#FDF1E3"); WARNB = colors.HexColor("#B8661A") RED = colors.HexColor("#FBE9E7"); REDB = colors.HexColor("#A93226") BF=16; LD=23 body = ParagraphStyle("body", fontName="Helvetica", fontSize=BF, leading=LD, textColor=colors.black) small = ParagraphStyle("small", parent=body, fontSize=13, leading=17) h1 = ParagraphStyle("h1", fontName="Helvetica-Bold", fontSize=30, leading=35, textColor=NAVY) sub = ParagraphStyle("sub", parent=body, fontSize=18, leading=22, textColor=TEAL) h2 = ParagraphStyle("h2", fontName="Helvetica-Bold", fontSize=22, leading=27, textColor=NAVY, spaceBefore=8, spaceAfter=8) cell = ParagraphStyle("cell", parent=body, fontSize=15, leading=20) cellb = ParagraphStyle("cellb", parent=cell, fontName="Helvetica-Bold") def P(t, s=body): return Paragraph(t, s) class Figures(Flowable): S = 1.35 def __init__(self): super().__init__(); self.width=3.9*inch*self.S*0.0+5.3*inch; self.height=3.1*inch*self.S def figure(self, c, cx, back): skin = colors.HexColor("#F3E3D3"); line = colors.HexColor("#6B5D50"); zone = colors.HexColor("#1B8A9C") c.setLineWidth(1.1); c.setStrokeColor(line); c.setFillColor(skin); y0=0.25*inch c.circle(cx, y0+2.75*inch, 0.22*inch, fill=1, stroke=1) c.roundRect(cx-0.5*inch, y0+1.4*inch, 1.0*inch, 1.2*inch, 0.18*inch, fill=1, stroke=1) c.roundRect(cx-0.72*inch, y0+1.35*inch, 0.2*inch, 1.2*inch, 0.09*inch, fill=1, stroke=1) c.roundRect(cx+0.52*inch, y0+1.35*inch, 0.2*inch, 1.2*inch, 0.09*inch, fill=1, stroke=1) c.roundRect(cx-0.48*inch, y0, 0.44*inch, 1.5*inch, 0.15*inch, fill=1, stroke=1) c.roundRect(cx+0.04*inch, y0, 0.44*inch, 1.5*inch, 0.15*inch, fill=1, stroke=1) c.setFillColor(zone); c.setStrokeColor(colors.HexColor("#0E4F5B")) if not back: c.roundRect(cx-0.42*inch, y0+1.5*inch, 0.30*inch, 0.62*inch, 0.08*inch, fill=1, stroke=1) c.roundRect(cx+0.12*inch, y0+1.5*inch, 0.30*inch, 0.62*inch, 0.08*inch, fill=1, stroke=1) c.setFillColor(colors.white); c.circle(cx, y0+1.8*inch, 0.05*inch, fill=1, stroke=1); c.setFillColor(zone) c.roundRect(cx-0.44*inch, y0+0.75*inch, 0.36*inch, 0.65*inch, 0.1*inch, fill=1, stroke=1) c.roundRect(cx+0.08*inch, y0+0.75*inch, 0.36*inch, 0.65*inch, 0.1*inch, fill=1, stroke=1) else: c.roundRect(cx-0.44*inch, y0+1.4*inch, 0.40*inch, 0.45*inch, 0.12*inch, fill=1, stroke=1) c.roundRect(cx+0.04*inch, y0+1.4*inch, 0.40*inch, 0.45*inch, 0.12*inch, fill=1, stroke=1) c.roundRect(cx-0.72*inch, y0+1.9*inch, 0.2*inch, 0.55*inch, 0.09*inch, fill=1, stroke=1) c.roundRect(cx+0.52*inch, y0+1.9*inch, 0.2*inch, 0.55*inch, 0.09*inch, fill=1, stroke=1) c.setFillColor(colors.black); c.setFont("Helvetica-Bold", 10) c.drawCentredString(cx, y0-0.17*inch, "BACK VIEW" if back else "FRONT VIEW") def draw(self): c=self.canv; c.scale(self.S,self.S) self.figure(c, 1.0*inch, False); self.figure(c, 2.9*inch, True) def box(paras, bg, border): t = Table([[paras]], colWidths=[7.0*inch]) t.setStyle(TableStyle([("BACKGROUND",(0,0),(-1,-1),bg),("BOX",(0,0),(-1,-1),2,border), ("LEFTPADDING",(0,0),(-1,-1),12),("RIGHTPADDING",(0,0),(-1,-1),12), ("TOPPADDING",(0,0),(-1,-1),10),("BOTTOMPADDING",(0,0),(-1,-1),10)])) return t def footer(canvas, doc): canvas.saveState(); canvas.setFont("Helvetica", 11); canvas.setFillColor(colors.HexColor("#333333")) canvas.drawString(0.75*inch, 0.45*inch, "General education only. Follow your own insulin plan from your care team.") canvas.drawRightString(7.75*inch, 0.45*inch, f"Page {doc.page}") canvas.restoreState() out="/tmp/workspace/insulin-handout/Insulin_Injection_Technique_Handout_LARGE_PRINT.pdf" doc = SimpleDocTemplate(out, pagesize=letter, leftMargin=0.75*inch, rightMargin=0.75*inch, topMargin=0.6*inch, bottomMargin=0.8*inch, title="How to Inject Insulin: Large Print Patient Handout", author="Orris") S=[] S += [P("How to Inject Insulin Safely", h1), P("Large print guide for insulin pens", sub), Spacer(1,10)] S += [P("<b>Name:</b> ______________________________"), Spacer(1,6), P("<b>Date:</b> ____________________"), Spacer(1,6), P("<b>My insulin:</b> ______________________________"), Spacer(1,6)] S.append(P("Before you start", h2)) S.append(P("• Wash your hands with soap and water.<br/><br/>" "• Check the label. Is it the <b>right insulin</b>? Is it <b>not expired</b>?<br/><br/>" "• Look at the insulin. Clear insulin should be clear. Do not use it if it looks cloudy, has clumps, or has particles.")) S.append(Spacer(1,8)) S.append(box([P("<b>Cloudy insulin (NPH or premixed)</b> is the exception. Roll the pen gently between your palms 10 times. Tip it up and down 10 times. It should look evenly milky. Do not shake hard.")], LIGHT, TEAL)) S.append(PageBreak()) S.append(P("Step by step", h2)) steps = [ ("1","<b>Attach a new needle.</b> Remove the paper tab. Screw the needle on straight. Take off both caps. Keep the outer cap."), ("2","<b>Safety test (prime).</b> Dial 2 units. Point the needle up. Press the button. You should see a drop of insulin at the tip. If not, repeat. Still no drop? Change the needle."), ("3","<b>Dial your dose.</b> Turn the dial to the units your care team prescribed. Check it twice."), ("4","<b>Pick your spot.</b> Choose clean skin with no lumps, bruises, scars, or swelling."), ] steps2 = [ ("5","<b>Insert the needle straight in (90 degrees).</b> Short needles (4 to 6 mm) usually do not need a skin pinch. Your care team may tell you to pinch the skin if you are very thin or use a longer needle."), ("6","<b>Press the button all the way down. Count slowly to 10</b> before you pull the needle out. This gives the whole dose."), ("7","<b>Remove the needle and throw it away.</b> Put the outer cap on, unscrew the needle, and drop it in a sharps container. Never reuse a needle. Never share a pen."), ] def steptable(lst): rows=[[P(f"<font color='white'><b>{n}</b></font>", ParagraphStyle('n', parent=body, alignment=1, fontSize=24, leading=28)), P(t)] for n,t in lst] t=Table(rows, colWidths=[0.65*inch, 6.35*inch]) ts=[("VALIGN",(0,0),(-1,-1),"MIDDLE"),("TOPPADDING",(0,0),(-1,-1),9),("BOTTOMPADDING",(0,0),(-1,-1),9), ("LINEBELOW",(1,0),(1,-2),0.8,colors.HexColor("#999999"))] for i in range(len(lst)): ts.append(("BACKGROUND",(0,i),(0,i),TEAL)) t.setStyle(TableStyle(ts)); return t S.append(steptable(steps)) S.append(PageBreak()) S.append(P("Step by step (continued)", h2)) S.append(steptable(steps2)) S.append(Spacer(1,14)) S.append(box([P("<b>Tips</b><br/>• Do not rub the spot after injecting.<br/>" "• Rapid-acting insulin is usually taken within 15 minutes of eating. Regular insulin is usually taken 30 to 45 minutes before a meal. <b>Follow your own plan.</b>")], LIGHT, TEAL)) S.append(PageBreak()) S.append(P("Where to inject", h2)) fig=Figures() t=Table([[fig]], colWidths=[7.0*inch]); t.setStyle(TableStyle([("ALIGN",(0,0),(-1,-1),"CENTER")])); S.append(t) S.append(Spacer(1,8)) sw = lambda: Table([[""]], colWidths=[0.25*inch], rowHeights=[0.25*inch], style=[("BACKGROUND",(0,0),(-1,-1),colors.HexColor("#1B8A9C"))]) legend=[("Belly (abdomen)","Fastest, most even absorption. Stay 2 inches (5 cm) away from the belly button."), ("Thighs","Front and outer middle part. Slower absorption."), ("Buttocks","Upper outer area. Good for long-acting insulin."), ("Back of upper arms","Fatty area only. Hard to reach alone. A helper may be needed.")] lt=Table([[sw(), P(f"<b>{a}</b><br/>{b}", cell)] for a,b in legend], colWidths=[0.45*inch, 6.55*inch]) lt.setStyle(TableStyle([("VALIGN",(0,0),(-1,-1),"TOP"),("TOPPADDING",(0,0),(-1,-1),6),("BOTTOMPADDING",(0,0),(-1,-1),6)])) S.append(lt) S.append(PageBreak()) S.append(P("Rotate your injection sites", h2)) S.append(P("• Using the same spot again and again causes <b>lumps</b>. Insulin does not absorb well from lumpy skin. Your blood sugar may become hard to predict.<br/><br/>" "• Use one body area for the same time of day. For example, belly for breakfast.<br/><br/>" "• <b>Move each shot about 1 inch (a finger width) from the last one.</b><br/><br/>" "• Never inject into a lump, scar, bruise, mole, or swollen skin.<br/><br/>" "• Look at and feel your sites every few weeks. Tell your care team if you find a lump.")) S.append(Spacer(1,10)) S.append(box([P("<b>Important:</b> If you change from a lumpy site to a healthy one, your insulin needs may drop. Check your blood sugar more often and ask your care team before changing your dose.")], WARN, WARNB)) S.append(PageBreak()) S.append(P("Needles and storage", h2)) S.append(P("<b>Needles</b><br/>" "• Short needles (4, 5, or 6 mm) are best for most adults and children.<br/>" "• Needles 8 mm or longer are usually not needed.<br/>" "• Use a <b>new needle every time</b>.<br/>" "• <b>Never share a pen</b>, even with a new needle. Blood can get inside the pen.")) S.append(Spacer(1,10)) S.append(P("<b>Storage</b><br/>" "• <b>Unopened insulin:</b> in the refrigerator (36 to 46 F, or 2 to 8 C). Never freeze it.<br/>" "• <b>Pen in use:</b> at room temperature, away from heat and sun. Most last about 28 days once opened. Check your brand. Write the date you opened it on the pen.<br/>" "• Cold insulin can sting. Let it warm up a little before use.")) S.append(PageBreak()) S.append(P("Low blood sugar", h2)) S.append(box([P("<font color='#A93226'><b>Below 70 mg/dL (3.9 mmol/L)</b></font><br/><br/>" "<b>Signs:</b> shaky, sweaty, hungry, dizzy, fast heartbeat, headache, confused, or cranky.<br/><br/>" "<b>Follow the 15-15 rule:</b><br/>" "1. Take 15 grams of fast sugar: 3 to 4 glucose tablets, or half a cup (4 oz) of juice or regular soda.<br/>" "2. Wait 15 minutes. Check again.<br/>" "3. Still below 70? Repeat.<br/>" "4. Once above 70, eat a snack or meal if your next meal is over an hour away.")], RED, REDB)) S.append(Spacer(1,10)) S.append(box([P("<b>Call 911</b> if the person cannot swallow, passes out, or has a seizure. Do not put food or drink in the mouth of someone who is not awake. If you have glucagon, tell your family where it is and how to use it.")], WARN, WARNB)) S.append(PageBreak()) S.append(P("If something goes wrong", h2)) tbl=[[P("<b>Problem</b>",cellb),P("<b>What to do</b>",cellb)], [P("Insulin leaks from the skin",cell),P("Hold the needle in for a full count of 10. Press the button fully. Do not take a second dose. Tell your care team.",cell)], [P("Forgot a dose, or not sure you took it",cell),P("Do not double up. Check your blood sugar. Call your care team or pharmacist.",cell)], [P("No drop at the tip, or button is hard to press",cell),P("Change the needle and prime again. Still not working? Use a new pen and tell your pharmacy.",cell)], [P("Pain, redness, or bruising",cell),P("Small bruises happen. Use a new needle and a new spot. Call if the area is hot, swollen, or getting worse.",cell)], [P("Sick day, vomiting, or not eating",cell),P("Do not stop long-acting insulin on your own. Check your blood sugar more often. Call your care team.",cell)]] t=Table(tbl, colWidths=[2.5*inch,4.5*inch]) t.setStyle(TableStyle([("GRID",(0,0),(-1,-1),1,colors.HexColor("#777777")),("BACKGROUND",(0,0),(-1,0),LIGHT), ("VALIGN",(0,0),(-1,-1),"TOP"),("TOPPADDING",(0,0),(-1,-1),7),("BOTTOMPADDING",(0,0),(-1,-1),7)])) S.append(t) S.append(PageBreak()) S.append(P("My insulin plan", h2)) S.append(P("To be filled in by my care team.", sub)) S.append(Spacer(1,8)) plan=[[P("<b>Insulin</b>",cellb),P("<b>Units</b>",cellb),P("<b>When</b>",cellb)]]+[["","",""] for _ in range(5)] pt=Table(plan, colWidths=[3.0*inch,1.5*inch,2.5*inch], rowHeights=[0.4*inch]+[0.6*inch]*5) pt.setStyle(TableStyle([("GRID",(0,0),(-1,-1),1,colors.HexColor("#555555")),("BACKGROUND",(0,0),(-1,0),LIGHT),("VALIGN",(0,0),(-1,0),"MIDDLE")])) S.append(pt); S.append(Spacer(1,14)) S.append(box([P("<b>Call your care team if</b> your blood sugar is often too high or too low, you have frequent lows, you find lumps at your sites, you are not sure about your dose, or you feel unwell with high sugars, nausea, vomiting, or stomach pain.<br/><br/>" "<b>Care team phone:</b> ___________________<br/><br/><b>After hours:</b> ___________________")], WARN, WARNB)) S.append(Spacer(1,10)) S.append(P("Sources: Goodman & Gilman's The Pharmacological Basis of Therapeutics; ADA Standards of Medical Care in Diabetes; CDC injection safety guidance.", small)) doc.build(S, onFirstPage=footer, onLaterPages=footer) EOF python make_large.py && python -c " import pdfplumber p=pdfplumber.open('Insulin_Injection_Technique_Handout_LARGE_PRINT.pdf'); print(len(p.pages)) for i,pg in enumerate(p.pages): pg.to_image(resolution=45).save(f'L{i+1}.png') "; ls
cd /tmp/workspace/insulin-handout && python -c " from PIL import Image ims=[Image.open(f'L{i}.png') for i in range(1,10)] w,h=ims[0].size m=Image.new('RGB',(w*5,h*2),'white') for i,im in enumerate(ims): m.paste(im,((i%5)*w,(i//5)*h)) m.save('montage.png'); print(m.size) "
cd /tmp/workspace/insulin-handout && rm -f L*.png montage.png && ls -la
Insulin Injection Technique Handout LARGE PRINT
PDF Document · PDF