Enzymes chapter disease all Enzymes pattern there normal plasma levels mbbs 1st yr abvmu
Show disease-wise enzyme patterns in one comparison table
enzyme biomarkers AND diagnosis
clinical enzymology disease pattern AST ALT ALP GGT CK-MB LDH amylase lipase laboratory reference
| Disease / condition | Main enzyme pattern | Important interpretation / viva point |
|---|---|---|
| Acute viral hepatitis | ALT ↑↑, AST ↑↑; ALT usually > AST | Hepatocellular injury. ALT is more liver-specific than AST. |
| Chronic hepatitis / NAFLD | ALT ↑ or ↑↑; AST ↑; usually ALT > AST | AST:ALT ratio is commonly <1, though it may rise with advanced fibrosis/cirrhosis. |
| Alcoholic hepatitis | AST > ALT, often AST:ALT >2; GGT ↑ | AST predominance is characteristic. Both enzymes may be only moderately elevated. |
| Cirrhosis | AST and ALT may be mildly ↑ or even normal in late disease; AST may exceed ALT | Low enzymes do not exclude severe chronic liver disease because viable hepatocyte mass is reduced. |
| Hepatocellular carcinoma / liver metastasis | ALP ↑, GGT ↑, LDH ↑; AST/ALT variable | Cholestatic or infiltrative pattern may occur. |
| Obstructive jaundice / extrahepatic cholestasis | ALP ↑↑, GGT ↑↑, 5′-nucleotidase ↑; AST/ALT mild ↑ | Disproportionately high ALP indicates cholestasis. GGT or 5′NT confirms that raised ALP is of hepatobiliary origin. |
| Intrahepatic cholestasis | ALP ↑↑, GGT ↑, 5′NT ↑; aminotransferases variable | Similar enzyme pattern to extrahepatic obstruction. |
| Bone disease: rickets, osteomalacia, Paget disease, healing fracture | ALP ↑; GGT and 5′NT normal | Raised ALP with normal GGT suggests a bone source rather than biliary obstruction. |
| Physiological growth in children / pregnancy | ALP ↑ | Bone ALP is high in growing children; placental ALP rises in late pregnancy. |
| Acute myocardial infarction | Troponin I/T ↑ is preferred now; CK-MB ↑, total CK ↑; AST ↑; LDH-1 may ↑ later | CK-MB is useful for detecting reinfarction. Classical MBBS pattern: LDH-1 > LDH-2 is called an LDH flip. |
| Reinfarction after MI | CK-MB rises again after returning toward baseline | Troponin can remain elevated for days, so CK-MB was traditionally useful for a second infarct. |
| Skeletal-muscle injury, rhabdomyolysis, muscular dystrophy | Total CK ↑↑, CK-MM ↑; AST ↑, LDH ↑; aldolase may ↑ | CK is the most useful traditional enzyme marker. CK-MB can also rise slightly in severe skeletal-muscle damage. |
| Dermatomyositis / polymyositis | CK ↑↑, aldolase ↑, AST ↑, LDH ↑ | Reflects muscle-cell injury. |
| Acute pancreatitis | Lipase ↑↑, amylase ↑↑ | Lipase is more pancreas-specific and stays elevated longer than amylase. A value >3 times the upper reference limit supports acute pancreatitis. |
| Pancreatic carcinoma / chronic pancreatitis | Amylase and lipase may be ↑, normal, or low | Enzymes are less consistent than in acute pancreatitis. |
| Parotitis (mumps) | Salivary amylase ↑ | Total amylase rises, but pancreatic lipase is usually normal. |
| Renal failure | Amylase ↑, lipase may ↑ | Reduced renal clearance can elevate these enzymes without acute pancreatitis. |
| Prostatic carcinoma, especially metastasis | Prostatic acid phosphatase (ACP) ↑ | A traditional marker. PSA is used more commonly in current clinical practice. |
| Hemolytic anemia / megaloblastic anemia | LDH ↑↑, especially LDH-1; AST may ↑ | LDH rises due to destruction of blood cells. Interpret with bilirubin, reticulocyte count, and haptoglobin. |
| Pulmonary embolism / pulmonary infarction | LDH may ↑; AST may be mildly ↑ | Historical “LDH pattern” is nonspecific and not used alone for diagnosis. |
| Acute kidney infarction | LDH ↑↑ | May occur with raised LDH and relatively modest AST/ALT elevation. |
| Organophosphate poisoning | Pseudocholinesterase ↓ | Plasma butyrylcholinesterase is decreased. RBC acetylcholinesterase may also be measured. |
| Severe liver failure / chronic liver disease | Pseudocholinesterase ↓ | The liver synthesizes pseudocholinesterase, so low values suggest reduced synthetic function. |
| Pattern | Think of |
|---|---|
| ALT > AST | Viral hepatitis, NAFLD, most hepatocellular injury |
| AST > ALT, especially ratio >2 | Alcohol-associated liver disease |
| ALP + GGT + 5′NT high | Obstructive jaundice / cholestasis |
| ALP high but GGT normal | Bone disease |
| CK-MB high | Myocardial injury, classically MI |
| CK-MM very high | Skeletal-muscle injury / muscular dystrophy |
| Lipase and amylase high | Acute pancreatitis |
| ACP high | Prostatic carcinoma, classical marker |
| LDH-1 > LDH-2 | Classical LDH flip in MI or hemolysis |
| Pseudocholinesterase low | Organophosphate poisoning or severe liver dysfunction |
Make a pdf of same
~/
cardiac troponin preferred biomarker myocardial infarction CK-MB guideline
mkdir -p "/tmp/workspace/enzyme-disease-patterns-pdf/output" 66 python - <<'PY' from reportlab.lib import colors from reportlab.lib.enums import TA_CENTER from reportlab.lib.pagesizes import A4, landscape from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib.units import cm from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph, Spacer, PageBreak, KeepTogether from reportlab.pdfbase.pdfmetrics import stringWidth from reportlab.lib.colors import HexColor from reportlab.pdfbase.ttfonts import TTFont from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.pdfmetrics import registerFontFamily from pathlib import Path out = Path('/tmp/workspace/enzyme-disease-patterns-pdf/output/Enzyme_Disease_Patterns_MBBS_ABVMU.pdf') # Unicode-capable font font = 'Helvetica' try: pdfmetrics.registerFont(TTFont('DejaVuSans', '/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf')) pdfmetrics.registerFont(TTFont('DejaVuSans-Bold', '/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf')) registerFontFamily('DejaVuSans', normal='DejaVuSans', bold='DejaVuSans-Bold') font = 'DejaVuSans' except Exception: pass bold = font + '-Bold' if font == 'DejaVuSans' else 'Helvetica-Bold' W,H = landscape(A4) doc = SimpleDocTemplate(str(out), pagesize=landscape(A4), rightMargin=0.7*cm, leftMargin=0.7*cm, topMargin=0.7*cm, bottomMargin=0.7*cm) styles = getSampleStyleSheet() title = ParagraphStyle('title', parent=styles['Title'], fontName=bold, fontSize=18, leading=22, alignment=TA_CENTER, textColor=HexColor('#153B5B'), spaceAfter=5) sub = ParagraphStyle('sub', parent=styles['Normal'], fontName=font, fontSize=8.5, leading=11, alignment=TA_CENTER, textColor=HexColor('#3F4F5C'), spaceAfter=8) head = ParagraphStyle('head', parent=styles['Normal'], fontName=bold, fontSize=7.5, leading=9, textColor=colors.white, alignment=TA_CENTER) cell = ParagraphStyle('cell', parent=styles['Normal'], fontName=font, fontSize=6.9, leading=8.3, textColor=HexColor('#111827')) cell_bold = ParagraphStyle('cellb', parent=cell, fontName=bold) small = ParagraphStyle('small', parent=styles['Normal'], fontName=font, fontSize=7.3, leading=9) smallb = ParagraphStyle('smallb', parent=small, fontName=bold) footer = ParagraphStyle('footer', parent=styles['Normal'], fontName=font, fontSize=6.5, leading=8, textColor=HexColor('#4B5563')) def P(x, style=cell): return Paragraph(x, style) rows = [ ('Acute viral hepatitis', '<b>ALT ↑↑, AST ↑↑</b>; ALT usually > AST', 'Hepatocellular injury. ALT is more liver-specific than AST.'), ('Chronic hepatitis / NAFLD', 'ALT ↑ or ↑↑; AST ↑; usually <b>ALT > AST</b>', 'AST:ALT ratio commonly <1; may rise with advanced fibrosis/cirrhosis.'), ('Alcoholic hepatitis', '<b>AST > ALT</b>, often AST:ALT >2; <b>GGT ↑</b>', 'Characteristic AST predominance. Both enzymes may be only moderately elevated.'), ('Cirrhosis', 'AST/ALT mild ↑ or even normal late; AST may > ALT', 'Low values do not exclude severe disease because viable hepatocyte mass is reduced.'), ('Hepatocellular carcinoma / liver metastasis', 'ALP ↑, GGT ↑, LDH ↑; AST/ALT variable', 'Often cholestatic or infiltrative pattern.'), ('Obstructive jaundice / extrahepatic cholestasis', '<b>ALP ↑↑, GGT ↑↑, 5′-nucleotidase ↑</b>; AST/ALT mild ↑', 'Disproportionately high ALP. Raised GGT or 5′NT supports hepatobiliary source.'), ('Intrahepatic cholestasis', 'ALP ↑↑, GGT ↑, 5′NT ↑; AST/ALT variable', 'Similar enzyme profile to extrahepatic obstruction.'), ('Bone disease: rickets, osteomalacia, Paget disease, healing fracture', '<b>ALP ↑</b>; GGT and 5′NT normal', 'Raised ALP with normal GGT points to bone rather than liver.'), ('Growth in children / pregnancy', 'ALP ↑', 'Physiological: bone ALP in children; placental ALP in late pregnancy.'), ('Acute myocardial infarction', '<b>Troponin I/T ↑</b> preferred; CK-MB ↑, total CK ↑; AST ↑; LDH-1 ↑ later', 'Classical: LDH-1 > LDH-2 is “LDH flip”. Troponin is now preferred.'), ('Reinfarction after MI', 'CK-MB rises again after return toward baseline', 'Traditional role: helps detect a second infarction when troponin remains elevated.'), ('Skeletal muscle injury / rhabdomyolysis / muscular dystrophy', '<b>Total CK ↑↑, CK-MM ↑</b>; AST ↑, LDH ↑; aldolase may ↑', 'CK is the most useful traditional enzyme marker.'), ('Dermatomyositis / polymyositis', 'CK ↑↑, aldolase ↑, AST ↑, LDH ↑', 'Reflects active muscle-cell injury.'), ('Acute pancreatitis', '<b>Lipase ↑↑, amylase ↑↑</b>', 'Lipase is more pancreas-specific and remains high longer. >3× ULN supports diagnosis.'), ('Pancreatic carcinoma / chronic pancreatitis', 'Amylase/lipase may be ↑, normal, or low', 'Less consistent than acute pancreatitis.'), ('Parotitis (mumps)', 'Salivary amylase ↑', 'Total amylase rises; pancreatic lipase usually normal.'), ('Renal failure', 'Amylase ↑; lipase may ↑', 'Reduced clearance may elevate these enzymes without acute pancreatitis.'), ('Prostatic carcinoma, especially metastasis', '<b>Prostatic acid phosphatase (ACP) ↑</b>', 'Traditional marker. PSA is used more commonly today.'), ('Hemolytic / megaloblastic anemia', '<b>LDH ↑↑</b>, especially LDH-1; AST may ↑', 'LDH rises from destruction of blood cells.'), ('Pulmonary embolism / infarction', 'LDH may ↑; AST mild ↑', 'Nonspecific, not diagnostic alone.'), ('Acute kidney infarction', 'LDH ↑↑', 'Can occur with high LDH and modest AST/ALT elevation.'), ('Organophosphate poisoning', '<b>Pseudocholinesterase ↓</b>', 'Plasma butyrylcholinesterase is reduced; RBC acetylcholinesterase may also be measured.'), ('Severe liver failure / chronic liver disease', '<b>Pseudocholinesterase ↓</b>', 'Reduced hepatic synthesis suggests impaired synthetic function.'), ] story = [Paragraph('Disease-wise Enzyme Patterns', title), Paragraph('MBBS 1st Year Biochemistry (ABVMU) - Rapid Revision Table', sub)] intro = P('<b>Key:</b> ↑ raised; ↑↑ markedly raised; ↓ decreased; N normal. These are typical patterns for examination revision, not stand-alone clinical diagnoses. Reference intervals vary by laboratory.', small) story += [intro, Spacer(1, 5)] data = [[P('Disease / condition', head), P('Main enzyme pattern', head), P('Important interpretation / viva point', head)]] for a,b,c in rows: data.append([P(a, cell_bold), P(b), P(c)]) t = Table(data, colWidths=[6.5*cm, 8.2*cm, 11.5*cm], repeatRows=1, hAlign='CENTER') t.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,0),HexColor('#1F5A7A')), ('GRID',(0,0),(-1,-1),0.35,HexColor('#B8C7D1')), ('VALIGN',(0,0),(-1,-1),'TOP'), ('LEFTPADDING',(0,0),(-1,-1),4), ('RIGHTPADDING',(0,0),(-1,-1),4), ('TOPPADDING',(0,0),(-1,-1),3), ('BOTTOMPADDING',(0,0),(-1,-1),3), ('ROWBACKGROUNDS',(0,1),(-1,-1),[colors.white, HexColor('#F3F8FB')]), ])) story += [t, Spacer(1, 8)] story += [Paragraph('One-line Pattern Revision', ParagraphStyle('section', parent=styles['Heading2'], fontName=bold, fontSize=11, leading=14, textColor=HexColor('#153B5B'), spaceAfter=5))] quick = [ ('ALT > AST', 'Viral hepatitis, NAFLD, most hepatocellular injury'), ('AST > ALT, especially ratio >2', 'Alcohol-associated liver disease'), ('ALP + GGT + 5′NT high', 'Obstructive jaundice / cholestasis'), ('ALP high but GGT normal', 'Bone disease'), ('CK-MB high', 'Myocardial injury, classically MI'), ('CK-MM very high', 'Skeletal muscle injury / muscular dystrophy'), ('Lipase and amylase high', 'Acute pancreatitis'), ('ACP high', 'Prostatic carcinoma, classical marker'), ('LDH-1 > LDH-2', 'Classical LDH flip in MI or hemolysis'), ('Pseudocholinesterase low', 'Organophosphate poisoning or severe liver dysfunction'), ] qd = [[P('Pattern', head), P('Think of', head)]] + [[P(a, cell_bold),P(b)] for a,b in quick] qt = Table(qd, colWidths=[8.5*cm,17.7*cm], repeatRows=1) qt.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,0),HexColor('#357394')),('GRID',(0,0),(-1,-1),0.35,HexColor('#B8C7D1')),('VALIGN',(0,0),(-1,-1),'TOP'), ('ROWBACKGROUNDS',(0,1),(-1,-1),[colors.white,HexColor('#F3F8FB')]), ('LEFTPADDING',(0,0),(-1,-1),4),('RIGHTPADDING',(0,0),(-1,-1),4),('TOPPADDING',(0,0),(-1,-1),3),('BOTTOMPADDING',(0,0),(-1,-1),3) ])) story += [qt, Spacer(1, 7)] story += [Paragraph('<b>Exam note:</b> In current practice, cardiac troponin is preferred for diagnosing myocardial infarction. CK-MB, LDH isoenzymes, ACP and aldolase remain high-yield for MBBS clinical enzymology questions.', small)] story += [Spacer(1,4), Paragraph('Academic sources: Harper’s Illustrated Biochemistry, 32nd ed, “Liver Function Tests”; Harrison’s Principles of Internal Medicine, 22nd ed, “Evaluation of Liver Function” and “Tests of Exocrine Pancreatic Function”; Lippincott Illustrated Reviews: Biochemistry, 8th ed, “Isoenzymes”.', footer)] def page_num(canvas, doc): canvas.saveState(); canvas.setFont(font, 6.5); canvas.setFillColor(HexColor('#5A6872')) canvas.drawRightString(W-0.7*cm, 0.35*cm, f'ABVMU MBBS Biochemistry | Page {doc.page}') canvas.restoreState() doc.build(story, onFirstPage=page_num, onLaterPages=page_num) print(out) PY python - <<'PY' from pypdf import PdfReader p='/tmp/workspace/enzyme-disease-patterns-pdf/output/Enzyme_Disease_Patterns_MBBS_ABVMU.pdf' r=PdfReader(p) print('pages:',len(r.pages),'bytes:',__import__('os').path.getsize(p)) print((r.pages[0].extract_text() or '')[:250]) PY
~/enzyme-disease-patterns-pdf/
python -c "import base64; from pathlib import Path; src=base64.b64decode('ZnJvbSByZXBvcnRsYWIubGliIGltcG9ydCBjb2xvcnMKZnJvbSByZXBvcnRsYWIubGliLnBhZ2VzaXplcyBpbXBvcnQgQTQsIGxhbmRzY2FwZQpmcm9tIHJlcG9ydGxhYi5saWIuc3R5bGVzIGltcG9ydCBnZXRTYW1wbGVTdHlsZVNoZWV0LCBQYXJhZ3JhcGhTdHlsZQpmcm9tIHJlcG9ydGxhYi5saWIudW5pdHMgaW1wb3J0IGNtCmZyb20gcmVwb3J0bGFiLnBhdHlwdXMgaW1wb3J0IFNpbXBsZURvY1RlbXBsYXRlLCBUYWJsZSwgVGFibGVTdHlsZSwgUGFyYWdyYXBoLCBTcGFjZXIKZnJvbSByZXBvcnRsYWIucGRmYmFzZS50dGZvbnRzIGltcG9ydCBUVEZvbnQKZnJvbSByZXBvcnRsYWIucGRmYmFzZSBpbXBvcnQgcGRmbWV0cmljcwpmcm9tIHJlcG9ydGxhYi5saWIuY29sb3JzIGltcG9ydCBIZXhDb2xvcgpmcm9tIHBhdGhsaWIgaW1wb3J0IFBhdGgKCm91dD1QYXRoKCcvdG1wL3dvcmtzcGFjZS9lbnp5bWUtZGlzZWFzZS1wYXR0ZXJucy1wZGYvb3V0cHV0L0VuenltZV9EaXNlYXNlX1BhdHRlcm5zX01CQlNfQUJWTVUucGRmJykKcGRmbWV0cmljcy5yZWdpc3RlckZvbnQoVFRGb250KCdEZWphVnUnLCcvdXNyL3NoYXJlL2ZvbnRzL3RydWV0eXBlL2RlamF2dS9EZWphVnVTYW5zLnR0ZicpKQpwZGZtZXRyaWNzLnJlZ2lzdGVyRm9udChUVEZvbnQoJ0RlamFWdS1Cb2xkJywnL3Vzci9zaGFyZS9mb250cy90cnVldHlwZS9kZWphdnUvRGVqYVZ1U2Fucy1Cb2xkLnR0ZicpKQpmb250PSdEZWphVnUnO2JvbGQ9J0RlamFWdS1Cb2xkJwpzdHlsZXM9Z2V0U2FtcGxlU3R5bGVTaGVldCgpCnRpdGxlPVBhcmFncmFwaFN0eWxlKCd0aXRsZScscGFyZW50PXN0eWxlc1snVGl0bGUnXSxmb250TmFtZT1ib2xkLGZvbnRTaXplPTE4LGxlYWRpbmc9MjIsYWxpZ25tZW50PTEsZGV4dENvbG9yPUhleENvbG9yKCcjMTUzQjVCJykpCnN1Yj1QYXJhZ3JhcGhTdHlsZSgnc3ViJyxwYXJlbnQ9c3R5bGVzWydOb3JtYWwnXSxmb250TmFtZT1mb250LGZvbnRTaXplPTksbGVhZGluZz0xMSxhbGlnbm1lbnQ9MSx0ZXh0Q29sb3I9SGV4Q29sb3IoJyMzRjRGNUMnKSkKaGVhZD1QYXJhZ3JhcGhTdHlsZSgnaGVhZCcscGFyZW50PXN0eWxlc1snTm9ybWFsJ10sZm9udE5hbWU9Ym9sZCxmb250U2l6ZT03LjUsbGVhZGluZz05LHRleHRDb2xvcj1jb2xvcnMud2hpdGUsYWxpZ25tZW50PTEpCmNlbGw9UGFyYWdyYXBoU3R5bGUoJ2NlbGwnLHBhcmVudD1zdHlsZXNbJ05vcm1hbCddLGZvbnROYW1lPWZvbnQsZm9udFNpemU9Ni44LGxlYWRpbmc9OC4xKQpjZWxsYj1QYXJhZ3JhcGhTdHlsZSgnY2VsbGInLHBhcmVudD1jZWxsLGZvbnROYW1lPWJvbGQpCnNtYWxsPVBhcmFncmFwaFN0eWxlKCdzbWFsbCcscGFyZW50PXN0eWxlc1snTm9ybWFsJ10sZm9udE5hbWU9Zm9udCxmb250U2l6ZT03LjMsbGVhZGluZz05KQoKZGVmIFAoeCxzPWNlbGwpOiByZXR1cm4gUGFyYWdyYXBoKHgscykKcm93cz1bCignQWN1dGUgdmlyYWwgaGVwYXRpdGlzJywnPGI+QUxUIOKGkeKGkSwgQVNUIOKGkeKGkzwvYj47IEFMVCB1c3VhbGx5ICZndDsgQVNUJywnSGVwYXRvY2VsbHVsYXIgaW5qdXJ5LiBBTFQgaXMgbW9yZSBsaXZlci1zcGVjaWZpYy4nKSwoJ0Nocm9uaWMgaGVwYXRpdGlzIC8gTkFGTEQnLCdBTFQg4oaRIHdvciDinpE7IEFTVCDihpE7IHVzdWFsbHkgPGI+QUxUJmd0OyBBU1Q8L2I+JywnQVNUOkFMVCByYXRpbyBjb21tb25seSAmbHQ7MS4nKSwoJ0FsY29ob2xpYyBoZXBhdGl0aXMnLCc8Yj5BU1QgJmd0OyBBTFQ8L2I+LCBvZnRlbiBBU1Q6QUxUICZndDsyOyA8Yj5HR1Qg4oaRPC9iPicsJ0NoYXJhY3RlcmlzdGljIEFTVCBwcmVkb21pbmFuY2UuJyksKCdDaXJyaG9zaXMnLCdBU1QvQUxUIG1pbGQg4oaRIHxvciBub3JtYWwgbGF0ZTsgQVNUIG1heSAmZ3Q7IEFMVCcsJ0xvdyB2YWx1ZXMgZG8gbm90IGV4Y2x1ZGUgc2V2ZXJlIGRpc2Vhc2UuJyksKCdIZXBhdG9jZWxsdWxhciBjYXJjaW5vbWEgLyBsaXZlciBtZXRhc3Rhc2lzJywnQUxQIOKGkSwgR0dUIOKGkSwgTERIIOKGkTsgQVNUL0FMVCB2YXJpYWJsZScsJ09mdGVuIGNob2xlc3RhdGljIG9yIGluZmlsdHJhdGl2ZSBwYXR0ZXJuLicpLCgnT2JzdHJ1Y3RpdmUgamF1bmRpY2UgLyBleHRyYWhlcGF0aWMgY2hvbGVzdGFzaXMnLCc8Yj5BTFAg4oaR4oaRLCBHR1Qg4oaR4oaRLCA14oCyLW51Y2xlb3RpZGFzZSDihpE8L2I+OyBBU1QvQUxUIG1pbGQg4oaRJywnRGlzcHJvcG9ydGlvbmF0ZWx5IGhpZ2ggQUxQLiBHUkcgb3IgNWLigJlOVCBzdXBwb3J0cyBoZXBhdG9iaWxpYXJ5IHNvdXJjZS4nKSwoJ0ludHJhaGVwYXRpYyBjaG9sZXN0YXNpcycsJ0FMUCDihpHihpEsIEdHVCB4oocRLCA14oCyTlQg4oaROyBBU1QvQUxUIHZhcmlhYmxlJywnU2ltaWxhciBlbnp5bWUgcHJvZmlsZSB0byBleHRyYWhlcGF0aWMgb2JzdHJ1Y3Rpb24uJyksKCdCb25lIGRpc2Vhc2U6IHJpY2tldHMsIG9zdGVvbWFsYWNpYSwgUGFnZXQgZGlzZWFzZSwgaGVhbGluZyBmcmFjdHVyZScsJzxiPkFMUCDihpE8L2I+OyBHR1QgYW5kIDXigJkOVCBub3JtYWwnLCdSYWlzZWQgQUxQIHdpdGggbm9ybWFsIEdHVCBwb2ludHMgdG8gYm9uZS4nKSwoJ0dyb3d0aCBpbiBjaGlsZHJlbiAvIHByZWduYW5jeScsJ0FMUCDihpEnLCdQaHlzaW9sb2dpY2FsOiBib25lIEFMUCBpbiBjaGlsZHJlbiBhbmQgcGxhY2VudGFsIEFMUC4nKSwoJ0FjdXRlIG15b2NhcmRpYWwgaW5mYXJjdGlvbicsJzxiPlRyb3BvbmluIEkvVCDihpE8L2I+IHByZWZlcnJlZDsgQ0stTUIg4oaRLCB0b3RhbCBDSyDinpE7IEFTVCDihpE7IExESC0xIOKGkSBsYXRlcicsJ0NsYXNzaWNhbDogTERILTEgJmd0OyBMREgtMiBpcyAiTERIIGZsaXAiLicpLCgnUmVpbmZhcmN0aW9uIGFmdGVyIE1JJywnQ0stTUIgcmlzZXMgYWdhaW4gYWZ0ZXIgcmV0dXJuIHRvd2FyZCBiYXNlbGluZScsJ1RyYWRpdGlvbmFsIHJvbGU6IGhlbHBzIGRldGVjdCBhIHNlY29uZCBpbmZhcmN0aW9uLicpLCgnU2tlbGV0YWwgbXVzY2xlIGluanVyeSAvIHJoYWJkb215b2x5c2lzIC8gbXVzY3VsYXIgZHlzdHJvcGh5JywnPGI+VG90YWwgQ0sg4oaR4oaRLCBDSy1NTSDihpE8L2I+OyBBU1Qg4oaRLCBMREgg4oaROyBhbGRvbGFzZSBtYXkg4oaRJywnQ0sgaXMgdGhlIG1vc3QgdXNlZnVsIHRyYWRpdGlvbmFsIGVuenltZSBtYXJrZXIuJyksKCdEZXJtYXRvbXlvc2l0aXMgLyBwb2x5bXlvc2l0aXMnLCdDSyDinpHihpEsIGFsZG9sYXNlIOKGkSwgQVNUIOKGkSwgTERIIOKGkScsJ1JlZmxlY3RzIGFjdGl2ZSBtdXNjbGUtY2VsbCBpbmp1cnkuJyksKCdBY3V0ZSBwYW5jcmVhdGl0aXMnLCc8Yj5MaXBhc2Ug4oaR4oaRLCBhbXlsYXNlIOKGkeKGkTwvYj4nLCdMaXBhc2UgaXMgbW9yZSBwYW5jcmVhcy1zcGVjaWZpYyBhbmQgc3RheXMgaGlnaCBsb25nZXIuICZndDszw5cgVUxOLicpLCgnUGFuY3JlYXRpYyBjYXJjaW5vbWEgLyBjaHJvbmljIHBhbmNyZWF0aXRpcycsJ0FteWxhc2UvbGlwYXNlIG1heSBiZSDihpEsIG5vcm1hbCwgb3IgbG93JywnTGVzcyBjb25zaXN0ZW50IHRoYW4gYWN1dGUgcGFuY3JlYXRpdGlzLicpLCgnUGFyb3RpdGlzIChtdW1wcyknLCdTYWxpdmFyeSBhbXlsYXNlIOKGkScsJ1RvdGFsIGFteWxhc2UgcmlzZXM7IHBhbmNyZWF0aWMgbGlwYXNlIHVzdWFsbHkgbm9ybWFsLicpLCgnUmVuYWwgZmFpbHVyZScsJ0FteWxhc2Ug4oaROyBsaXBhc2UgbWF5IOKGkScsJ1JlZHVjZWQgY2xlYXJhbmNlIGNhbiBlbGV2YXRlIHRoZXNlIGVuenltZXMgd2l0aG91dCBwYW5jcmVhdGl0aXMuJyksKCdQcm9zdGF0aWMgY2FyY2lub21hLCBlc3BlY2lhbGx5IG1ldGFzdGFzaXMnLCc8Yj5Qcm9zdGF0aWMgYWNpZCBwaG9zcGhhdGFzZSAoQUNQKSDihpE8L2I+JywnVHJhZGl0aW9uYWwgbWFya2VyLiBQU0EgaXMgdXNlZCBtb3JlIGNvbW1vbmx5IHRvZGF5LicpLCgnSGVtb2x5dGljIC8gbWVnYWxvYmxhc3RpYyBhbmVtaWEnLCc8Yj5MREgg4oaR4oaRLCBlc3BlY2lhbGx5IExESC0xPC9iPjsgQVNUIG1heSDihpEnLCdMREggcmlzZXMgZnJvbSBkZXN0cnVjdGlvbiBvZiBibG9vZCBjZWxscy4nKSwoJ1B1bG1vbmFyeSBlbWJvbGlzbSAvIGluZmFyY3Rpb24nLCdMREggbWF5IOKGkTsgQVNUIG1pbGQg4oaRJywnTm9uc3BlY2lmaWMsIG5vdCBkaWFnbm9zdGljIGFsb25lLicpLCgnQWN1dGUga2lkbmV5IGluZmFyY3Rpb24nLCdMREgg4oaR4oaRJywnQ2FuIG9jY3VyIHdpdGggaGlnaCBMREggYW5kIG1vZGVzdCBBU1QvQUxULicpLCgnT3JnYW5vcGhvc3BoYXRlIHBvaXNvbmluZycsJzxiPlBzZXVkb2Nob2xpbmVzdGVyYXNlIOKGkzwvYj4nLCdQbGFzbWEgYnV0eXJ5bGNob2xpbmVzdGVyYXNlIGlzIHJlZHVjZWQuJyksKCdTZXZlcmUgbGl2ZXIgZmFpbHVyZSAvIGNocm9uaWMgbGl2ZXIgZGlzZWFzZScsJzxiPlBzZXVkb2Nob2xpbmVzdGVyYXNlIOKGkzwvYj4nLCdSZWR1Y2VkIGhlcGF0aWMgc3ludGhlc2lzIHN1Z2dlc3RzIGltcGFpcmVkIHN5bnRoZXRpYyBmdW5jdGlvbi4nKV0KCnF1aWNrPVsKICgnQUxUICZndDsgQVNUJywnVmlyYWwgaGVwYXRpdGlzLCBOQUZMRCwgbW9zdCBoZXBhdG9jZWxsdWxhciBpbmp1cnknKSwoJ0FTVCAmZ3Q7IEFMVCwgZXNwZWNpYWxseSByYXRpbyAmZ3Q7MicsJ0FsY29ob2wtYXNzb2NpYXRlZCBsaXZlciBkaXNlYXNlJyksKCdBTFAgKyBHR1QgKyA14oCyTlQgaGlnaCcsJ09ic3RydWN0aXZlIGphdW5kaWNlIC8gY2hvbGVzdGFzaXMnKSwoJ0FMUCBoeWdoIGJ1dCBHR1Qgbm9ybWFsJywnQm9uZSBkaXNlYXNlJyksKCdDSy1NQiBoaWdoJywnTXlvY2FyZGlhbCBpbmp1cnksIGNsYXNzaWNhbGx5IE1JJyksKCdDSy1NTSB2ZXJ5IGhpZ2gnLCdTa2VsZXRhbCBtdXNjbGUgaW5qdXJ5IC8gbXVzY3VsYXIgZHlzdHJvcGh5JyksKCdMaXBhc2UgYW5kIGFteWxhc2UgaGlnaCcsJ0FjdXRlIHBhbmNyZWF0aXRpcycpLCgnQUNQIGhpZ2gnLCdQcm9zdGF0aWMgY2FyY2lub21hLCBjbGFzc2ljYWwgbWFya2VyJyksKCdMREgtMSAmZ3Q7IExESC0yJywnQ2xhc3NpY2FsIExESCBmbGlwIGluIE1JIG9yIGhlbW9seXNpcycpLCgnUHNldWRvY2hvbGluZXN0ZXJhc2UgbG93JywnT3JnYW5vcGhvc3BoYXRlIHBvaXNvbmluZyBvciBzZXZlcmUgbGl2ZXIgZHlzZnVuY3Rpb24nKV0KCnN0b3J5PVtQYXJhZ3JhcGgoJ0Rpc2Vhc2Utd2lzZSBFbnp5bWUgUGF0dGVybnMnLHRpdGxlKSxQYXJhZ3JhcGgoJ01CQlMgMXN0IFllYXIgQmlvY2hlbWlzdHJ5IChBQlZNVSkgLSBSYXBpZCBSZXZpc2lvbiBUYWJsZScsc3ViKSxQYXJhZ3JhcGgoJzxiPktleTo8L2I+IOKGkSByYWlzZWQ7IOKGkeKGkSBtYXJrZWRseSByYWlzZWQ7IOKGkyBkZWNyZWFzZWQuIFRoZXNlIGFyZSB0eXBpY2FsIHBhdHRlcm5zIGZvciBleGFtIHJldmlzaW9uLCBub3Qgc3RhbmQtYWxvbmUgY2xpbmljYWwgZGlhZ25vc2VzLiBSZWZlcmVuY2UgaW50ZXJ2YWxzIHZhcnkgYnkgbGFib3JhdG9yeS4nLHNtYWxsKSxTcGFjZXIoMSw1KV0KZGF0YT1bW1AoJ0Rpc2Vhc2UgLyBjb25kaXRpb24nLGhlYWQpLFAoJ01haW4gZW56eW1lIHBhdHRlcm4nLGhlYWQpLFAoJ0ltcG9ydGFudCBpbnRlcnByZXRhdGlvbiAvIHZpdmEgcG9pbnQnLGhlYWQpXV0rW1tQKGEsY2VsbGIpLFAoYiksUChjKV0gZm9yIGEsYixjIGluIHJvd3NdCnQ9VGFibGUoZGF0YSxjb2xXaWR0aHM9WzYuNSpjbSw4LjIqY20sMTEuNSpjbV0scmVwZWF0Um93cz0xKQp0LnNldFN0eWxlKFRhYmxlU3R5bGUoWygnQkFDS0dST1VORCcsKDAsMCksKC0xLDApLEhleENvbG9yKCcjMUY1QTdBJykpLCgnR1JJRCcsKDAsMCksKC0xLC0xKSwwLjM1LEhleENvbG9yKCcjQjhDN0QxJykpLCgnVkFMSUdOJywoMCwwKSwoLTEsLTEpLCdUT1AnKSwoJ1JPV0JBQ0tHUk9VTkRTJywoMCwxKSwoLTEsLTEpLFtjb2xvcnMud2hpdGUsSGV4Q29sb3IoJyNGM0Y4RkInKV0pLCgnTEVGVFBBRERJTkcnLCgwLDApLCgtMSwtMSksNCksKCdSSUdIVFBBRERJTkcnLCgwLDApLCgtMSwtMSksNCksKCdUT1BQQURESU5HJywoMCwwKSwoLTEsLTEpLDMpLCgnQk9UVE9NUEFERElORycsKDAsMCksKC0xLC0xKSwzKV0pKQpzdG9yeSArPSBbdCxTcGFjZXIoMSw4KSxQYXJhZ3JhcGgoJ09uZS1saW5lIFBhdHRlcm4gUmV2aXNpb24nLFBhcmFncmFwaFN0eWxlKCdzZWN0aW9uJyxwYXJlbnQ9c3R5bGVzWydIZWFkaW5nMiddLGZvbnROYW1lPWJvbGQsZm9udFNpemU9MTEsbGVhZGluZz0xNCx0ZXh0Q29sb3I9SGV4Q29sb3IoJyMxNTNCNUInKSkpXQpxZD1bW1AoJ1BhdHRlcm4nLGhlYWQpLFAoJ1RoaW5rIG9mJyxoZWFkKV1dK1tbUChhLGNlbGxiKSxQKGIpXSBmb3IgYSxiIGluIHF1aWNrXQpxdD1UYWJsZShxZCxjb2xXaWR0aHM9WzguNSpjbSwxNy43KmNtXSxyZXBlYXRSb3dzPTEpCnF0LnNldFN0eWxlKFRhYmxlU3R5bGUoWygnQkFDS0dST1VORCcsKDAsMCksKC0xLDApLEhleENvbG9yKCcjMzU3Mzk0JykpLCgnR1JJRCcsKDAsMCksKC0xLC0xKSwwLjM1LEhleENvbG9yKCcjQjhDN0QxJykpLCgnVkFMSUdOJywoMCwwKSwoLTEsLTEpLCdUT1AnKSwoJ1JPV0JBQ0tHUk9VTkRTJywoMCwxKSwoLTEsLTEpLFtjb2xvcnMud2hpdGUsSGV4Q29sb3IoJyNGM0Y4RkInKV0pLCgnTEVGVFBBRERJTkcnLCgwLDApLCgtMSwtMSksNCksKCdSSUdIVFBBRERJTkcnLCgwLDApLCgtMSwtMSksNCksKCdUT1BQQURESU5HJywoMCwwKSwoLTEsLTEpLDMpLCgnQk9UVE9NUEFERElORycsKDAsMCksKC0xLC0xKSwzKV0pKQpzdG9yeSArPVtxdCxTcGFjZXIoMSw2KSxQYXJhZ3JhcGgoJzxiPkV4YW0gbm90ZTo8L2I+IEluIGN1cnJlbnQgcHJhY3RpY2UsIGNhcmRpYWMgdHJvcG9uaW4gaXMgcHJlZmVycmVkIGZvciBkaWFnbm9zaW5nIG15b2NhcmRpYWwgaW5mYXJjdGlvbi4gQ0stTUIsIExESCBpc296eW1lcywgQUNQIGFuZCBhbGRvbGFzZSByZW1haW4gaGlnaC15aWVsZCBmb3IgTUJCUyBjbGluaWNhbCBlbnp5bW9sb2d5IHF1ZXN0aW9ucy4nLHNtYWxsKSxTcGFjZXIoMSw0KSxQYXJhZ3JhcGgoJ0FjYWRlbWljIHNvdXJjZXM6IEhhcnBlcuKAmXMgSWxsdXN0cmF0ZWQgQmlvY2hlbWlzdHJ5LCAzMm5kIGVkLCBMaXZlciBGdW5jdGlvbiBUZXN0czsgSGFycmlzb27igJlzIFByaW5jaXBsZXMgb2YgSW50ZXJuYWwgTWVkaWNpbmUsIDIybmQgZWQsIEV2YWx1YXRpb24gb2YgTGl2ZXIgRnVuY3Rpb24gYW5kIFRlc3RzIG9mIEV4b2NyaW5lIFBhbmNyZWF0aWMgRnVuY3Rpb247IExpcHBpbmNvdHQgSWxsdXN0cmF0ZWQgUmV2aWV3czogQmlvY2hlbWlzdHJ5LCA4dGggZWQsIElzb2VuenltZXMuJyxzbWFsbCldCgpkZWYgZm9vdGVyKGNhbnZhcyxkb2MpOgogIGNhbnZhcy5zYXZlU3RhdGUoKTsgY2FudmFzLnNldEZvbnQoZm9udCw2LjUpOyBjYW52YXMuc2V0RmlsbENvbG9yKEhleENvbG9yKCcjNUE2ODcyJykpCiAgY2FudmFzLmRyYXdSaWdodFN0cmluZyhsYW5kc2NhcGUoQTQpWzBdLTAuNypjbSwgMC4zNSpjbSwgZidBQlZNVSBNQkJTIEJpb2NoZW1pc3RyeSB8IFBhZ2Uge2RvYy5wYWdlfScpCiAgY2FudmFzLnJlc3RvcmVTdGF0ZSgpCgpkb2M9U2ltcGxlRG9jVGVtcGxhdGUoc3RyKG91dCkscGFnZXNpemU9bGFuZHNjYXBlKEE0KSxsZWZ0TWFyZ2luPTAuNypjbSxyaWdodE1hcmdpbj0wLjdjbSx0b3BNYXJnaW49MC43KmNtLGJvdHRvbU1hcmdpbj0wLjdjbSkKZG9jLmJ1aWxkKHN0b3J5LG9uRmlyc3RQYWdlPWZvb3RlcixvbkxhdGVyUGFnZXM9Zm9vdGVyKQpwcmludChvdXQpCg=='); Path('/tmp/workspace/enzyme-disease-patterns-pdf/src').mkdir(exist_ok=True); Path('/tmp/workspace/enzyme-disease-patterns-pdf/src/make_pdf.py').write_bytes(src)" && python "/tmp/workspace/enzyme-disease-patterns-pdf/src/make_pdf.py" && python -c "from pypdf import PdfReader; import os; p='/tmp/workspace/enzyme-disease-patterns-pdf/output/Enzyme_Disease_Patterns_MBBS_ABVMU.pdf'; r=PdfReader(p); print('pages=',len(r.pages),'bytes=',os.path.getsize(p)); print((r.pages[0].extract_text() or '')[:120])"
~/enzyme-disease-patterns-pdf/src/make_pdf_v2.py
from reportlab.lib import colors
from reportlab.lib.pagesizes import A4, landscape
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph, Spacer
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.pdfbase import pdfmetrics
from reportlab.lib.colors import HexColor
OUT = '/tmp/workspace/enzyme-disease-patterns-pdf/output/Enzyme_Disease_Patterns_MBBS_ABVMU.pdf'
pdfmetrics.registerFont(TTFont('DejaVu', '/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf'))
pdfmetrics.registerFont(TTFont('DejaVu-Bold', '/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf'))
font, bold = 'DejaVu', 'DejaVu-Bold'
styles = getSampleStyleSheet()
title = ParagraphStyle('title', parent=styles['Title'], fontName=bold, fontSize=18, leading=22, alignment=1, textColor=HexColor('#153B5B'))
sub = ParagraphStyle('sub', parent=styles['Normal'], fontName=font, fontSize=9, leading=11, alignment=1, textColor=HexColor('#3F4F5C'))
head = ParagraphStyle('head', parent=styles['Normal'], fontName=bold, fontSize=7.4, leading=9, textColor=colors.white, alignment=1)
cell = ParagraphStyle('cell', parent=styles['Normal'], fontName=font, fontSize=6.7, leading=8.1)
cellb = ParagraphStyle('cellb', parent=cell, fontName=bold)
small = ParagraphStyle('small', parent=styles['Normal'], fontName=font, fontSize=7.3, leading=9)
def p(text, style=cell):
return Paragraph(text, style)
rows = [
('Acute viral hepatitis', '<b>ALT high, AST high</b>; ALT usually > AST', 'Hepatocellular injury. ALT is more liver-specific than AST.'),
('Chronic hepatitis / NAFLD', 'ALT raised; AST raised; usually <b>ALT > AST</b>', 'AST:ALT ratio commonly <1; may rise with advanced fibrosis/cirrhosis.'),
('Alcoholic hepatitis', '<b>AST > ALT</b>, often AST:ALT >2; <b>GGT raised</b>', 'Characteristic AST predominance. Both enzymes may be moderately elevated.'),
('Cirrhosis', 'AST/ALT mildly raised or normal late; AST may > ALT', 'Low values do not exclude severe disease.'),
('Hepatocellular carcinoma / liver metastasis', 'ALP raised, GGT raised, LDH raised; AST/ALT variable', 'Often cholestatic or infiltrative pattern.'),
('Obstructive jaundice / extrahepatic cholestasis', '<b>ALP markedly raised, GGT markedly raised, 5-prime nucleotidase raised</b>; AST/ALT mildly raised', 'Disproportionately high ALP. GGT or 5-prime NT supports hepatobiliary source.'),
('Intrahepatic cholestasis', 'ALP raised, GGT raised, 5-prime NT raised; AST/ALT variable', 'Similar profile to extrahepatic obstruction.'),
('Bone disease: rickets, osteomalacia, Paget disease, healing fracture', '<b>ALP raised</b>; GGT and 5-prime NT normal', 'Raised ALP with normal GGT points to bone rather than liver.'),
('Growth in children / pregnancy', 'ALP raised', 'Physiological: bone ALP in children; placental ALP in late pregnancy.'),
('Acute myocardial infarction', '<b>Troponin I/T raised</b> preferred; CK-MB raised, total CK raised; AST raised; LDH-1 later', 'Classical: LDH-1 > LDH-2 is LDH flip. Troponin is now preferred.'),
('Reinfarction after MI', 'CK-MB rises again after return toward baseline', 'Traditional role: helps detect a second infarction.'),
('Skeletal muscle injury / rhabdomyolysis / muscular dystrophy', '<b>Total CK markedly raised, CK-MM raised</b>; AST and LDH raised; aldolase may rise', 'CK is the most useful traditional enzyme marker.'),
('Dermatomyositis / polymyositis', 'CK markedly raised, aldolase raised, AST raised, LDH raised', 'Reflects active muscle-cell injury.'),
('Acute pancreatitis', '<b>Lipase markedly raised, amylase markedly raised</b>', 'Lipase is more pancreas-specific and stays high longer. More than 3x ULN supports diagnosis.'),
('Pancreatic carcinoma / chronic pancreatitis', 'Amylase/lipase may be raised, normal, or low', 'Less consistent than acute pancreatitis.'),
('Parotitis (mumps)', 'Salivary amylase raised', 'Total amylase rises; pancreatic lipase is usually normal.'),
('Renal failure', 'Amylase raised; lipase may rise', 'Reduced clearance can elevate these enzymes without pancreatitis.'),
('Prostatic carcinoma, especially metastasis', '<b>Prostatic acid phosphatase (ACP) raised</b>', 'Traditional marker. PSA is used more commonly today.'),
('Hemolytic / megaloblastic anemia', '<b>LDH markedly raised</b>, especially LDH-1; AST may rise', 'LDH rises from destruction of blood cells.'),
('Pulmonary embolism / infarction', 'LDH may rise; AST mildly raised', 'Nonspecific, not diagnostic alone.'),
('Acute kidney infarction', 'LDH markedly raised', 'Can occur with high LDH and modest AST/ALT elevation.'),
('Organophosphate poisoning', '<b>Pseudocholinesterase decreased</b>', 'Plasma butyrylcholinesterase is reduced.'),
('Severe liver failure / chronic liver disease', '<b>Pseudocholinesterase decreased</b>', 'Reduced hepatic synthesis suggests impaired synthetic function.')]
quick = [
('ALT > AST', 'Viral hepatitis, NAFLD, most hepatocellular injury'),
('AST > ALT, especially ratio >2', 'Alcohol-associated liver disease'),
('ALP + GGT + 5-prime NT high', 'Obstructive jaundice / cholestasis'),
('ALP high but GGT normal', 'Bone disease'),
('CK-MB high', 'Myocardial injury, classically MI'),
('CK-MM very high', 'Skeletal muscle injury / muscular dystrophy'),
('Lipase and amylase high', 'Acute pancreatitis'),
('ACP high', 'Prostatic carcinoma, classical marker'),
('LDH-1 > LDH-2', 'Classical LDH flip in MI or hemolysis'),
('Pseudocholinesterase low', 'Organophosphate poisoning or severe liver dysfunction')]
story = [Paragraph('Disease-wise Enzyme Patterns', title), Paragraph('MBBS 1st Year Biochemistry (ABVMU) - Rapid Revision Table', sub), Spacer(1, 5), p('<b>Key:</b> raised = increased; markedly raised = large increase; decreased = reduced. Typical examination patterns only. Reference intervals vary by laboratory.', small), Spacer(1, 6)]
data = [[p('Disease / condition', head), p('Main enzyme pattern', head), p('Important interpretation / viva point', head)]]
data += [[p(a, cellb), p(b), p(c)] for a,b,c in rows]
t = Table(data, colWidths=[6.5*cm, 8.2*cm, 11.5*cm], repeatRows=1)
t.setStyle(TableStyle([('BACKGROUND',(0,0),(-1,0),HexColor('#1F5A7A')),('GRID',(0,0),(-1,-1),0.35,HexColor('#B8C7D1')),('VALIGN',(0,0),(-1,-1),'TOP'),('ROWBACKGROUNDS',(0,1),(-1,-1),[colors.white,HexColor('#F3F8FB')]),('LEFTPADDING',(0,0),(-1,-1),4),('RIGHTPADDING',(0,0),(-1,-1),4),('TOPPADDING',(0,0),(-1,-1),3),('BOTTOMPADDING',(0,0),(-1,-1),3)]))
story += [t, Spacer(1, 8), Paragraph('One-line Pattern Revision', ParagraphStyle('sec', parent=styles['Heading2'],fontName=bold,fontSize=11,leading=14,textColor=HexColor('#153B5B')))]
qd = [[p('Pattern', head), p('Think of', head)]] + [[p(a,cellb),p(b)] for a,b in quick]
qt = Table(qd, colWidths=[8.5*cm,17.7*cm], repeatRows=1)
qt.setStyle(TableStyle([('BACKGROUND',(0,0),(-1,0),HexColor('#357394')),('GRID',(0,0),(-1,-1),0.35,HexColor('#B8C7D1')),('VALIGN',(0,0),(-1,-1),'TOP'),('ROWBACKGROUNDS',(0,1),(-1,-1),[colors.white,HexColor('#F3F8FB')]),('LEFTPADDING',(0,0),(-1,-1),4),('RIGHTPADDING',(0,0),(-1,-1),4),('TOPPADDING',(0,0),(-1,-1),3),('BOTTOMPADDING',(0,0),(-1,-1),3)]))
story += [qt, Spacer(1, 6), p('<b>Exam note:</b> In current practice, cardiac troponin is preferred for diagnosing myocardial infarction. CK-MB, LDH isoenzymes, ACP and aldolase remain high-yield for MBBS clinical enzymology questions.', small), Spacer(1,4), p('Academic sources: Harper’s Illustrated Biochemistry, 32nd ed, Liver Function Tests; Harrison’s Principles of Internal Medicine, 22nd ed, Evaluation of Liver Function and Tests of Exocrine Pancreatic Function; Lippincott Illustrated Reviews: Biochemistry, 8th ed, Isoenzymes.', small)]
def footer(canvas, doc):
canvas.saveState(); canvas.setFont(font, 6.5); canvas.setFillColor(HexColor('#5A6872')); canvas.drawRightString(landscape(A4)[0]-0.7*cm, 0.35*cm, 'ABVMU MBBS Biochemistry | Page %d' % doc.page); canvas.restoreState()
doc = SimpleDocTemplate(OUT, pagesize=landscape(A4), leftMargin=0.7*cm, rightMargin=0.7*cm, topMargin=0.7*cm, bottomMargin=0.7*cm)
doc.build(story, onFirstPage=footer, onLaterPages=footer)
print(OUT)
python "/tmp/workspace/enzyme-disease-patterns-pdf/src/make_pdf_v2.py" && python -c "from pypdf import PdfReader; import os; p='/tmp/workspace/enzyme-disease-patterns-pdf/output/Enzyme_Disease_Patterns_MBBS_ABVMU.pdf'; r=PdfReader(p); print('pages=',len(r.pages),'bytes=',os.path.getsize(p)); print((r.pages[0].extract_text() or '')[:180])"
~/enzyme-disease-patterns-pdf/src/make_pdf_v2.py
Successfully replaced 1 instance(s) of the string in '/tmp/workspace/enzyme-disease-patterns-pdf/src/make_pdf_v2.py'
python "/tmp/workspace/enzyme-disease-patterns-pdf/src/make_pdf_v2.py" && python -c "from pypdf import PdfReader; import os; p='/tmp/workspace/enzyme-disease-patterns-pdf/output/Enzyme_Disease_Patterns_MBBS_ABVMU.pdf'; r=PdfReader(p); print('pages=',len(r.pages),'bytes=',os.path.getsize(p)); print((r.pages[0].extract_text() or '')[:180])"
Enzyme Disease Patterns MBBS ABVMU
PDF Document · PDF