QC labs of pharmacy , can u explain line to line , it is for a engineer student who has exam
QC laboratory pharmacy pharmaceutical quality control tests explained engineering students
https://despharmaconsulting.com/a-deep-dive-into-quality-con…
Simple analogy for engineers: Think of QC lab as the quality inspection team on a manufacturing plant floor - they check every part/batch against blueprints (specifications) before dispatch.
| Feature | Quality Control (QC) | Quality Assurance (QA) |
|---|---|---|
| Focus | Product-oriented | Process-oriented |
| Goal | Detect defects | Prevent defects |
| Timing | Reactive (tests products made) | Proactive (before/during production) |
| Methods | Lab testing, analysis, inspections | SOPs, audits, training, validation |
| Role | "Inspector" - tests if the product matches specs | "Architect" - designs systems so defects don't happen |
| Test | What it checks | Product type |
|---|---|---|
| Hardness test | Tablet strength (won't break in packaging) | Tablets |
| Friability test | % weight loss when tablets tumble | Tablets |
| Disintegration test | Time for tablet to break apart in fluid | Tablets |
| Dissolution test | Rate of drug release into solution | Tablets, capsules |
| Weight variation | All tablets weigh the same | Tablets |
| Clarity test | Injection is free from visible particles | Injections |
| Viscosity | Thickness of syrup or gel | Liquids |
| Particle size | Fine enough for inhalation/absorption | Powders |
| Test | Instrument Used | Purpose |
|---|---|---|
| Assay (potency) | HPLC, UV Spectrophotometer | Measures exact drug content |
| Identification | IR Spectroscopy, Mass Spectrometry | Confirms identity of drug |
| Impurity profiling | HPLC, GC-MS | Detects degradation products |
| pH measurement | pH meter | Ensures correct acidity/alkalinity |
| Water content | Karl Fischer titration | Controls moisture in drug |
| Heavy metal testing | AAS (Atomic Absorption Spectroscopy) | Checks for toxic metal contamination |
| Test | Purpose |
|---|---|
| Sterility test | Confirms injections/eye drops have zero microorganisms |
| Microbial limit test | For non-sterile products - confirms acceptable microbial count |
| Pyrogen/LAL test | Detects endotoxins (bacterial toxins that cause fever) |
| Antimicrobial effectiveness test | Confirms preservatives in multi-dose products are working |
| Environmental monitoring | Checks air, surfaces, and personnel in cleanrooms |
| Instrument | Full Form | What it does |
|---|---|---|
| HPLC | High Performance Liquid Chromatography | Separates drug from impurities, measures quantity precisely - the most important QC instrument |
| UV-Vis Spectrophotometer | Ultraviolet-Visible Spectrophotometer | Measures how much light a drug absorbs - gives concentration |
| IR Spectrometer | Infrared Spectrometer | Identifies drug by its molecular fingerprint |
| GC / GC-MS | Gas Chromatography / with Mass Spec | Tests volatile substances, residual solvents |
| pH Meter | - | Measures acidity/alkalinity |
| Balance (Analytical) | - | Weighs small amounts accurately (0.0001 g precision) |
| Dissolution apparatus | - | Mimics how tablet dissolves in human body |
| Disintegration apparatus | - | Checks how fast a tablet breaks apart |
| Friability tester | - | Tumbles tablets to check how much powder they lose |
| Autoclave | - | Sterilizes equipment and media for microbiology |
| LAF (Laminar Air Flow) | - | Provides sterile environment for sterility testing |
| Incubator | - | Maintains temperature for microbial growth tests |
| Karl Fischer Titrator | - | Measures water content in drug substance |
Key rule: In pharma QC - "If it isn't written, it didn't happen."
| Parameter | What it means |
|---|---|
| Accuracy | How close the result is to the true value |
| Precision | How reproducible (repeatable) the result is |
| Specificity/Selectivity | Can the method measure only the target drug without interference? |
| Linearity | Does the result respond proportionally to drug concentration? |
| Limit of Detection (LOD) | Smallest amount that can be detected |
| Limit of Quantitation (LOQ) | Smallest amount that can be accurately measured |
| Robustness | Does the method still work with small changes in conditions? |
1. Sample received from production / store
|
2. Sample logged in LIMS (Lab Information Management System)
|
3. Analyst assigned + SOP followed
|
4. Tests performed (physical, chemical, microbiological)
|
5. Results compared to pharmacopoeial specifications
|
6. PASS → Certificate of Analysis issued → Batch Released
FAIL → OOS investigation → Reject / Retest
| Regulatory Body | Country | Document |
|---|---|---|
| CDSCO | India | Schedule M (GMP Rules) |
| FDA | USA | 21 CFR Part 211 |
| EMA | Europe | EU GMP Guidelines |
| WHO | Global | WHO GMP Guidelines |
| IP/BP/USP | Global | Pharmacopoeial standards for each drug |
| Area | Key Point |
|---|---|
| Purpose of QC lab | Test identity, purity, potency, safety of drugs |
| 3 stages | Raw material → In-process → Finished product |
| Most important instrument | HPLC |
| Key document | SOP, COA, Batch Release Record |
| Sterility test for | Injections, eye drops (parenteral products) |
| Pyrogen test | Detects endotoxins in injections |
| Dissolution test | Checks drug release rate from tablets |
| Friability test | Checks tablet physical strength |
| cGMP | Current Good Manufacturing Practice - the law |
| OOS | Out of Specification - triggers investigation |
| Stability testing ICH | 40°C/75% RH = accelerated; 25°C/60% RH = long-term |
Can u make all this notes a pdf and send me ( don't shorten ) I need exact all this notes without summarised
mkdir -p /tmp/workspace/qc-pharmacy && ls /tmp/workspace/
~/qc-pharmacy/generate_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm
from reportlab.lib import colors
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, PageBreak, KeepTogether
)
from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_JUSTIFY
OUTPUT = "/tmp/workspace/qc-pharmacy/QC_Labs_of_Pharmacy.pdf"
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
rightMargin=2*cm,
leftMargin=2*cm,
topMargin=2.5*cm,
bottomMargin=2*cm,
title="QC Labs of Pharmacy - Complete Study Guide",
author="Orris AI"
)
styles = getSampleStyleSheet()
# Custom styles
title_style = ParagraphStyle(
'CustomTitle',
parent=styles['Title'],
fontSize=22,
textColor=colors.HexColor('#1a3c5e'),
spaceAfter=6,
spaceBefore=0,
alignment=TA_CENTER,
fontName='Helvetica-Bold'
)
subtitle_style = ParagraphStyle(
'Subtitle',
parent=styles['Normal'],
fontSize=12,
textColor=colors.HexColor('#4a6fa5'),
spaceAfter=20,
alignment=TA_CENTER,
fontName='Helvetica'
)
h1_style = ParagraphStyle(
'H1',
parent=styles['Heading1'],
fontSize=15,
textColor=colors.white,
backColor=colors.HexColor('#1a3c5e'),
spaceBefore=16,
spaceAfter=8,
leftIndent=-10,
rightIndent=-10,
fontName='Helvetica-Bold',
borderPad=6,
)
h2_style = ParagraphStyle(
'H2',
parent=styles['Heading2'],
fontSize=12,
textColor=colors.HexColor('#1a3c5e'),
spaceBefore=12,
spaceAfter=4,
fontName='Helvetica-Bold',
borderWidth=0,
borderColor=colors.HexColor('#4a6fa5'),
)
h3_style = ParagraphStyle(
'H3',
parent=styles['Heading3'],
fontSize=11,
textColor=colors.HexColor('#2e6da4'),
spaceBefore=10,
spaceAfter=3,
fontName='Helvetica-Bold',
)
body_style = ParagraphStyle(
'Body',
parent=styles['Normal'],
fontSize=10,
textColor=colors.HexColor('#2c2c2c'),
spaceAfter=5,
spaceBefore=2,
leading=15,
fontName='Helvetica',
alignment=TA_JUSTIFY
)
bullet_style = ParagraphStyle(
'Bullet',
parent=styles['Normal'],
fontSize=10,
textColor=colors.HexColor('#2c2c2c'),
spaceAfter=4,
spaceBefore=1,
leading=14,
leftIndent=16,
bulletIndent=4,
fontName='Helvetica',
)
note_style = ParagraphStyle(
'Note',
parent=styles['Normal'],
fontSize=10,
textColor=colors.HexColor('#5a3e00'),
backColor=colors.HexColor('#fff8e1'),
spaceAfter=8,
spaceBefore=6,
leading=14,
leftIndent=10,
rightIndent=10,
fontName='Helvetica-Oblique',
borderPad=8,
)
code_style = ParagraphStyle(
'Code',
parent=styles['Normal'],
fontSize=9,
textColor=colors.HexColor('#1a1a1a'),
backColor=colors.HexColor('#f4f4f4'),
spaceAfter=8,
spaceBefore=4,
leading=14,
leftIndent=10,
fontName='Courier',
borderPad=6,
)
def h1(text):
return Paragraph(f" {text}", h1_style)
def h2(text):
return Paragraph(text, h2_style)
def h3(text):
return Paragraph(text, h3_style)
def body(text):
return Paragraph(text, body_style)
def bullet(text, symbol="•"):
return Paragraph(f"{symbol} {text}", bullet_style)
def note(text):
return Paragraph(text, note_style)
def sp(n=1):
return Spacer(1, n * 0.3 * cm)
def hr():
return HRFlowable(width="100%", thickness=1, color=colors.HexColor('#c0c8d8'), spaceAfter=6, spaceBefore=6)
def make_table(headers, rows, col_widths=None):
data = [headers] + rows
if col_widths is None:
n = len(headers)
available = 17 * cm
col_widths = [available / n] * n
t = Table(data, colWidths=col_widths, repeatRows=1)
t.setStyle(TableStyle([
('BACKGROUND', (0, 0), (-1, 0), colors.HexColor('#1a3c5e')),
('TEXTCOLOR', (0, 0), (-1, 0), colors.white),
('FONTNAME', (0, 0), (-1, 0), 'Helvetica-Bold'),
('FONTSIZE', (0, 0), (-1, 0), 10),
('ALIGN', (0, 0), (-1, -1), 'LEFT'),
('VALIGN', (0, 0), (-1, -1), 'TOP'),
('FONTNAME', (0, 1), (-1, -1), 'Helvetica'),
('FONTSIZE', (0, 1), (-1, -1), 9),
('ROWBACKGROUNDS', (0, 1), (-1, -1), [colors.HexColor('#f0f4fa'), colors.white]),
('GRID', (0, 0), (-1, -1), 0.5, colors.HexColor('#c0c8d8')),
('TOPPADDING', (0, 0), (-1, -1), 5),
('BOTTOMPADDING', (0, 0), (-1, -1), 5),
('LEFTPADDING', (0, 0), (-1, -1), 6),
('RIGHTPADDING', (0, 0), (-1, -1), 6),
]))
return t
story = []
# ─────────────────────────────────────────────
# COVER / TITLE
# ─────────────────────────────────────────────
story.append(sp(4))
story.append(Paragraph("QC Labs of Pharmacy", title_style))
story.append(Paragraph("Complete Study Notes for Engineering Students", subtitle_style))
story.append(hr())
story.append(sp(1))
story.append(note("These notes cover every topic — from basics to advanced — exactly as required for your exam. Nothing has been shortened or summarised."))
story.append(sp(2))
# ─────────────────────────────────────────────
# SECTION 1
# ─────────────────────────────────────────────
story.append(h1("1. What is a QC Lab?"))
story.append(sp())
story.append(body(
"A <b>Quality Control (QC) Laboratory</b> in a pharmaceutical company or hospital pharmacy is the dedicated department that <b>tests, verifies, and approves</b> every batch of drug before it reaches the patient."
))
story.append(sp(0.5))
story.append(bullet("It is the <b>scientific gatekeeper</b> — no product leaves the factory without QC clearance."))
story.append(bullet("It tests raw materials coming IN, products being made IN-PROCESS, and finished products going OUT."))
story.append(bullet("It works strictly under <b>cGMP (current Good Manufacturing Practices)</b> — regulatory rules from agencies like FDA (USA), CDSCO (India), EMA (Europe)."))
story.append(sp())
story.append(note(
"Simple analogy for engineers: Think of QC lab as the quality inspection team on a manufacturing plant floor — "
"they check every part/batch against blueprints (specifications) before dispatch."
))
# ─────────────────────────────────────────────
# SECTION 2
# ─────────────────────────────────────────────
story.append(h1("2. QC vs QA — Know the Difference (Very Common Exam Q)"))
story.append(sp())
qcqa_headers = [
Paragraph('<b>Feature</b>', ParagraphStyle('th', fontName='Helvetica-Bold', fontSize=10, textColor=colors.white)),
Paragraph('<b>Quality Control (QC)</b>', ParagraphStyle('th', fontName='Helvetica-Bold', fontSize=10, textColor=colors.white)),
Paragraph('<b>Quality Assurance (QA)</b>', ParagraphStyle('th', fontName='Helvetica-Bold', fontSize=10, textColor=colors.white)),
]
qcqa_rows = [
["Focus", "Product-oriented", "Process-oriented"],
["Goal", "Detect defects", "Prevent defects"],
["Timing", "Reactive (tests products made)", "Proactive (before/during production)"],
["Methods", "Lab testing, analysis, inspections", "SOPs, audits, training, validation"],
["Role", '"Inspector" — tests if product matches specs', '"Architect" — designs systems so defects don\'t happen'],
]
story.append(make_table(qcqa_headers, qcqa_rows, [3.5*cm, 6.5*cm, 6.5*cm]))
# ─────────────────────────────────────────────
# SECTION 3
# ─────────────────────────────────────────────
story.append(h1("3. What Does QC Lab Test? (3 Stages)"))
story.append(sp())
story.append(h2("Stage 1 — Raw Material Testing (Incoming)"))
story.append(body("Before any manufacturing begins, all raw materials entering the factory are tested."))
story.append(bullet("<b>Identity test</b> — Is this actually the chemical it claims to be? (e.g., using IR spectroscopy)"))
story.append(bullet("<b>Purity test</b> — Is it free from impurities?"))
story.append(bullet("<b>Potency test</b> — Does it have the correct strength/concentration?"))
story.append(bullet("<b>Microbial contamination test</b> — Is it free from bacteria/fungi?"))
story.append(sp(0.5))
story.append(body("Only after QC approves raw materials does production begin. This prevents using wrong or contaminated inputs."))
story.append(h2("Stage 2 — In-Process Testing (During Manufacturing)"))
story.append(body("Samples are collected from the <b>beginning, middle, and end</b> of the batch during production."))
story.append(bullet("Monitors critical parameters like pH, viscosity, weight, particle size."))
story.append(bullet("Detects problems early — so a whole batch is not wasted."))
story.append(bullet("Example: Tablet compression — checking tablet hardness, thickness, weight variation every few minutes."))
story.append(h2("Stage 3 — Finished Product Testing (Before Release)"))
story.append(body("The final product (tablets, injections, syrups, etc.) undergoes full testing before release. Tests include:"))
story.append(bullet("<b>Assay (Potency):</b> Does the tablet contain exactly the labelled drug amount? (e.g., 500 mg paracetamol)"))
story.append(bullet("<b>Dissolution test:</b> Does the tablet dissolve and release drug at the right rate?"))
story.append(bullet("<b>Sterility test:</b> Is the injection free from all microorganisms?"))
story.append(bullet("<b>Pyrogen test / LAL test:</b> Is the injection free from fever-causing substances?"))
story.append(bullet("<b>Uniformity of weight/content:</b> Are all tablets in a batch consistent?"))
story.append(bullet("<b>pH test:</b> Is the syrup or injection at the correct pH?"))
story.append(bullet("<b>Packaging integrity:</b> Is the container sealed properly?"))
# ─────────────────────────────────────────────
# SECTION 4
# ─────────────────────────────────────────────
story.append(h1("4. Main Types of Tests in QC Lab"))
story.append(sp())
story.append(h2("A. Physical Tests"))
phys_headers = ["Test", "What it checks", "Product type"]
phys_rows = [
["Hardness test", "Tablet strength (won't break in packaging)", "Tablets"],
["Friability test", "% weight loss when tablets tumble", "Tablets"],
["Disintegration test", "Time for tablet to break apart in fluid", "Tablets"],
["Dissolution test", "Rate of drug release into solution", "Tablets, Capsules"],
["Weight variation", "All tablets weigh the same", "Tablets"],
["Clarity test", "Injection is free from visible particles", "Injections"],
["Viscosity", "Thickness of syrup or gel", "Liquids"],
["Particle size", "Fine enough for inhalation/absorption", "Powders"],
]
story.append(make_table(phys_headers, phys_rows, [4*cm, 8*cm, 4.5*cm]))
story.append(sp())
story.append(h2("B. Chemical Tests (Analytical)"))
chem_headers = ["Test", "Instrument Used", "Purpose"]
chem_rows = [
["Assay (potency)", "HPLC, UV Spectrophotometer", "Measures exact drug content"],
["Identification", "IR Spectroscopy, Mass Spectrometry", "Confirms identity of drug"],
["Impurity profiling", "HPLC, GC-MS", "Detects degradation products"],
["pH measurement", "pH meter", "Ensures correct acidity/alkalinity"],
["Water content", "Karl Fischer titration", "Controls moisture in drug"],
["Heavy metal testing", "AAS (Atomic Absorption Spectroscopy)", "Checks for toxic metal contamination"],
]
story.append(make_table(chem_headers, chem_rows, [4.5*cm, 6*cm, 6*cm]))
story.append(sp())
story.append(h2("C. Microbiological Tests"))
micro_headers = ["Test", "Purpose"]
micro_rows = [
["Sterility test", "Confirms injections/eye drops have zero microorganisms"],
["Microbial limit test", "For non-sterile products — confirms acceptable microbial count"],
["Pyrogen / LAL test", "Detects endotoxins (bacterial toxins that cause fever)"],
["Antimicrobial effectiveness test", "Confirms preservatives in multi-dose products are working"],
["Environmental monitoring", "Checks air, surfaces, and personnel in cleanrooms"],
]
story.append(make_table(micro_headers, micro_rows, [6*cm, 10.5*cm]))
# ─────────────────────────────────────────────
# SECTION 5
# ─────────────────────────────────────────────
story.append(PageBreak())
story.append(h1("5. Key Instruments in QC Lab (Engineer-Friendly Explanation)"))
story.append(sp())
inst_headers = ["Instrument", "Full Form", "What it does"]
inst_rows = [
["HPLC", "High Performance Liquid Chromatography", "Separates drug from impurities, measures quantity precisely — the most important QC instrument"],
["UV-Vis Spectrophotometer", "Ultraviolet-Visible Spectrophotometer", "Measures how much light a drug absorbs — gives concentration"],
["IR Spectrometer", "Infrared Spectrometer", "Identifies drug by its molecular fingerprint"],
["GC / GC-MS", "Gas Chromatography / with Mass Spectrometry", "Tests volatile substances, residual solvents"],
["pH Meter", "—", "Measures acidity/alkalinity"],
["Analytical Balance", "—", "Weighs small amounts accurately (0.0001 g precision)"],
["Dissolution apparatus", "—", "Mimics how a tablet dissolves in the human body"],
["Disintegration apparatus", "—", "Checks how fast a tablet breaks apart in fluid"],
["Friability tester", "—", "Tumbles tablets to check how much powder they lose"],
["Autoclave", "—", "Sterilises equipment and media for microbiology"],
["LAF (Laminar Air Flow)", "—", "Provides sterile environment for sterility testing"],
["Incubator", "—", "Maintains temperature for microbial growth tests"],
["Karl Fischer Titrator", "—", "Measures water content in drug substance"],
]
story.append(make_table(inst_headers, inst_rows, [4*cm, 5*cm, 7.5*cm]))
# ─────────────────────────────────────────────
# SECTION 6
# ─────────────────────────────────────────────
story.append(h1("6. QC Lab Documentation — Very Important in Pharma"))
story.append(sp())
story.append(body("Every action in QC lab is documented. This is called <b>data integrity</b>."))
story.append(sp(0.5))
story.append(bullet("<b>SOP (Standard Operating Procedure):</b> Written procedure for every instrument and test. All staff must follow it exactly."))
story.append(bullet("<b>COA (Certificate of Analysis):</b> Official document stating all test results for a batch. Sent to customer/regulatory body."))
story.append(bullet("<b>Logbook:</b> Record of every instrument use, calibration, and maintenance. Must be handwritten in ink."))
story.append(bullet("<b>OOS (Out of Specification):</b> If any result fails the limit — full investigation is mandatory before rejecting or retesting."))
story.append(bullet("<b>Batch Release Record:</b> QC head signs off that all tests passed — only then can the product be shipped."))
story.append(sp())
story.append(note('Key rule in pharma QC: "If it isn\'t written, it didn\'t happen." — Every action must be documented in real time.'))
# ─────────────────────────────────────────────
# SECTION 7
# ─────────────────────────────────────────────
story.append(h1("7. Reference Standards"))
story.append(sp())
story.append(body("QC tests require comparison against a <b>standard</b> — a pure, certified sample of known quality."))
story.append(sp(0.5))
story.append(bullet("<b>Primary Standard:</b> Highest purity, issued by pharmacopoeias (IP, BP, USP). Used as the gold standard. Very expensive, used sparingly."))
story.append(bullet("<b>Secondary / Working Standard:</b> Calibrated against the primary standard and used daily in the lab. Saves expensive primary standards from being used up."))
story.append(sp(0.5))
story.append(body("Pharmacopoeias (IP = Indian Pharmacopoeia, BP = British Pharmacopoeia, USP = United States Pharmacopoeia) set the <b>specifications</b> (limits) every drug must meet."))
# ─────────────────────────────────────────────
# SECTION 8
# ─────────────────────────────────────────────
story.append(h1("8. Method Validation"))
story.append(sp())
story.append(body(
"Before any test method is used routinely in a QC lab, it must be <b>validated</b> — scientifically proven that it gives correct, consistent, reliable results. "
"This is a regulatory requirement under cGMP."
))
story.append(sp(0.5))
val_headers = ["Validation Parameter", "What it means"]
val_rows = [
["Accuracy", "How close the result is to the true/known value"],
["Precision", "How reproducible (repeatable) the result is when done multiple times"],
["Specificity / Selectivity", "Can the method measure only the target drug without interference from other substances?"],
["Linearity", "Does the result respond proportionally to drug concentration across a range?"],
["Limit of Detection (LOD)", "Smallest amount of drug that can be detected (not necessarily measured)"],
["Limit of Quantitation (LOQ)", "Smallest amount of drug that can be accurately and reproducibly measured"],
["Robustness", "Does the method still give correct results with small deliberate changes in conditions?"],
["Range", "The interval of drug concentration over which the method is valid"],
]
story.append(make_table(val_headers, val_rows, [6*cm, 10.5*cm]))
# ─────────────────────────────────────────────
# SECTION 9
# ─────────────────────────────────────────────
story.append(h1("9. Stability Testing"))
story.append(sp())
story.append(body(
"QC lab is also responsible for <b>stability testing</b> — confirming that a drug remains effective and safe until its expiry date. "
"This is governed by <b>ICH guidelines</b> (International Council for Harmonisation)."
))
story.append(sp(0.5))
story.append(bullet("<b>Accelerated testing:</b> 40°C / 75% RH for 6 months — predicts long-term stability quickly by forcing faster degradation."))
story.append(bullet("<b>Long-term / Real-time testing:</b> 25°C / 60% RH for 12-24 months — monitors actual degradation over time."))
story.append(bullet("<b>Intermediate testing:</b> 30°C / 65% RH for 12 months — for climatic zones III and IV (tropical countries like India)."))
story.append(bullet("<b>Stress testing:</b> Extreme heat, light, acid, base, oxidation — forces degradation to identify all possible impurities."))
story.append(sp(0.5))
story.append(body("Products are tested for appearance, assay, impurities, dissolution, and pH at each stability time point."))
story.append(sp(0.5))
story.append(note(
"ICH Climatic Zones: Zone I = Temperate (UK), Zone II = Mediterranean (USA), Zone III = Hot/Dry (Middle East), "
"Zone IV = Hot/Humid (India, SE Asia). India falls under Zone IVb — most stringent conditions apply."
))
# ─────────────────────────────────────────────
# SECTION 10
# ─────────────────────────────────────────────
story.append(PageBreak())
story.append(h1("10. Sample Flow in QC Lab (Step-by-Step)"))
story.append(sp())
story.append(body("The following is the complete journey of a sample from collection to batch release:"))
story.append(sp(0.5))
flow_steps = [
("Step 1", "Sample received from production line / store / warehouse"),
("Step 2", "Sample logged in LIMS (Laboratory Information Management System) — unique ID assigned"),
("Step 3", "Sample labelled, stored under correct conditions until testing begins"),
("Step 4", "Analyst assigned + correct SOP retrieved and followed"),
("Step 5", "Tests performed: physical tests, chemical tests (HPLC, UV, etc.), microbiological tests"),
("Step 6", "All raw data recorded in instrument logbook and laboratory notebook"),
("Step 7", "Results compared against pharmacopoeial specifications (limits)"),
("Step 8a", "PASS → Certificate of Analysis (COA) prepared → QC Head reviews and signs → Batch Released"),
("Step 8b", "FAIL → OOS (Out of Specification) investigation initiated → Root cause analysis → Reject / Retest"),
]
flow_headers = ["Step", "Action"]
flow_rows = [[s, d] for s, d in flow_steps]
story.append(make_table(flow_headers, flow_rows, [2.5*cm, 14*cm]))
# ─────────────────────────────────────────────
# SECTION 11
# ─────────────────────────────────────────────
story.append(h1("11. Regulatory Framework"))
story.append(sp())
story.append(body("QC labs do not operate on their own rules. They follow strict regulations set by government and international bodies:"))
story.append(sp(0.5))
reg_headers = ["Regulatory Body", "Country / Region", "Key Document / Rule"]
reg_rows = [
["CDSCO (Central Drugs Standard Control Organisation)", "India", "Schedule M of Drugs & Cosmetics Act — GMP Rules"],
["FDA (Food and Drug Administration)", "USA", "21 CFR Part 211 — Current GMP for Finished Pharmaceuticals"],
["EMA (European Medicines Agency)", "Europe", "EU GMP Guidelines — Volume 4"],
["WHO (World Health Organisation)", "Global", "WHO GMP Guidelines — TRS 986"],
["ICH (International Council for Harmonisation)", "Global", "Q1-Q14 Guidelines (Stability, Validation, Impurities, etc.)"],
["IP (Indian Pharmacopoeia)", "India", "Specifications and methods for drugs marketed in India"],
["BP (British Pharmacopoeia)", "UK/Commonwealth", "Specifications and methods for UK/international drugs"],
["USP (United States Pharmacopoeia)", "USA / Global", "Global reference standard for drug specifications"],
]
story.append(make_table(reg_headers, reg_rows, [5.5*cm, 4*cm, 7*cm]))
# ─────────────────────────────────────────────
# SECTION 12
# ─────────────────────────────────────────────
story.append(h1("12. 7 Basic Tools of QC (Statistical Tools)"))
story.append(sp())
story.append(body(
"Originally developed by quality guru <b>Kaoru Ishikawa</b>, these 7 tools help find and fix root causes of quality problems. "
"They are used in pharma QC to move from simple pass/fail testing to understanding WHY a process might be going wrong."
))
story.append(sp(0.5))
tools_headers = ["Tool", "What it is", "How it is used in Pharma QC"]
tools_rows = [
["1. Cause-and-Effect Diagram (Fishbone / Ishikawa)", "Diagram showing all possible causes of a problem", "Investigating OOS results — traces back to Man, Machine, Method, Material, Environment"],
["2. Check Sheet", "Simple tally sheet to collect data in real time", "Recording tablet defects during production line inspection"],
["3. Control Chart", "Graph tracking process variation over time with control limits", "Monitoring HPLC system suitability, tablet weight variation over a shift"],
["4. Histogram", "Bar chart showing the distribution (spread) of data", "Visualising how tablet weights are distributed across a batch"],
["5. Pareto Chart", "Bar + line chart showing frequency of problems in descending order", "Identifying that 20% of defect types cause 80% of rejections (Pareto principle)"],
["6. Scatter Diagram", "Graph showing relationship/correlation between two variables", "Checking if dissolution is correlated with hardness of tablets"],
["7. Flowchart / Stratification", "Step-by-step map of a process", "Mapping the complete sample testing process to find inefficiencies"],
]
story.append(make_table(tools_headers, tools_rows, [5*cm, 4.5*cm, 7*cm]))
# ─────────────────────────────────────────────
# SECTION 13 — QUICK REVISION TABLE
# ─────────────────────────────────────────────
story.append(PageBreak())
story.append(h1("13. Quick Revision Summary Table"))
story.append(sp())
story.append(body("Use this table for last-minute revision before your exam:"))
story.append(sp(0.5))
rev_headers = ["Topic / Term", "Key Point to Remember"]
rev_rows = [
["Purpose of QC lab", "Test identity, purity, potency, and safety of drugs before release"],
["3 stages of QC testing", "Raw material → In-process → Finished product testing"],
["Most important QC instrument", "HPLC (High Performance Liquid Chromatography)"],
["Key documents in QC", "SOP, COA (Certificate of Analysis), Batch Release Record, Logbook"],
["Sterility test is for", "Injections, eye drops, and all parenteral (injectable) products"],
["Pyrogen / LAL test detects", "Endotoxins (fever-causing bacterial toxins) in injections"],
["Dissolution test purpose", "Checks the rate at which drug is released from the dosage form"],
["Friability test purpose", "Checks how much a tablet crumbles/loses weight during handling"],
["Disintegration test purpose", "Checks how fast a tablet breaks into small pieces in liquid"],
["cGMP full form", "current Good Manufacturing Practices"],
["OOS full form and meaning", "Out of Specification — result failed the limit, triggers investigation"],
["Accelerated stability conditions", "40°C / 75% RH for 6 months (ICH guideline)"],
["Long-term stability conditions", "25°C / 60% RH for 12-24 months (ICH guideline)"],
["Primary vs Secondary standard", "Primary = highest purity from pharmacopoeia; Secondary = calibrated working standard"],
["Pharmacopoeia abbreviations", "IP = Indian, BP = British, USP = United States Pharmacopoeia"],
["LIMS full form", "Laboratory Information Management System — tracks samples and results"],
["Validation parameter: Accuracy", "How close the result is to the true value"],
["Validation parameter: Precision", "How reproducible the result is on repeated testing"],
["Validation parameter: LOD", "Limit of Detection — smallest detectable amount"],
["Validation parameter: LOQ", "Limit of Quantitation — smallest accurately measurable amount"],
["India's QC regulatory body", "CDSCO — follows Schedule M of Drugs & Cosmetics Act"],
["WHO GMP document", "TRS 986 — WHO Technical Report Series on GMP"],
["7 QC tools inventor", "Kaoru Ishikawa (Japanese engineer)"],
["Fishbone diagram also called", "Cause-and-Effect diagram or Ishikawa diagram"],
["Karl Fischer titration measures", "Water content / moisture in drug substances"],
["Autoclave used for", "Sterilisation using steam under pressure (121°C, 15 psi, 15-20 min)"],
["LAF full form and use", "Laminar Air Flow — provides aseptic (sterile) environment for microbiology testing"],
["Data integrity key rule", "'If it isn't written, it didn't happen' — all actions must be documented"],
]
story.append(make_table(rev_headers, rev_rows, [6*cm, 10.5*cm]))
# Footer note
story.append(sp(2))
story.append(hr())
story.append(Paragraph(
"Generated by Orris AI | QC Labs of Pharmacy — Complete Engineering Exam Notes | All content included without summarisation",
ParagraphStyle('footer', parent=styles['Normal'], fontSize=8, textColor=colors.grey, alignment=TA_CENTER)
))
# ─────────────────────────────────────────────
# BUILD
# ─────────────────────────────────────────────
doc.build(story)
print(f"PDF saved to: {OUTPUT}")
cd /tmp/workspace/qc-pharmacy && python generate_pdf.py
ls -lh /tmp/workspace/qc-pharmacy/QC_Labs_of_Pharmacy.pdf
QC Labs of Pharmacy
PDF Document · PDF