Objective
Create a system for storing scanned documents as images with OCR text extraction. This enables building searchable document archives from paper documents.
Step 1: Create Scanned Documents Table
Create a table for storing scanned document images.
CREATE TABLE scanned_documents (
id INTEGER PRIMARY KEY,
document_name VARCHAR(255) NOT NULL,
scan_image IMAGE(PNG),
document_type VARCHAR(50),
page_number INTEGER DEFAULT 1,
total_pages INTEGER DEFAULT 1,
scan_resolution INTEGER DEFAULT 300,
scan_color_mode VARCHAR(20) DEFAULT 'color',
scanned_by VARCHAR(100),
scanned_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Step 2: Create OCR Results Table
Create a table for storing extracted text.
CREATE TABLE document_ocr (
id INTEGER PRIMARY KEY,
document_id INTEGER NOT NULL,
extracted_text TEXT,
confidence_score DECIMAL(5, 4),
word_count INTEGER,
language_detected VARCHAR(10),
processed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (document_id) REFERENCES scanned_documents(id)
);
Step 3: Insert Sample Scanned Documents
Add sample scanned document records.
INSERT INTO scanned_documents (id, document_name, document_type, page_number, total_pages, scanned_by) VALUES
(1, 'Contract_2024_001', 'contract', 1, 5, 'legal_dept'),
(2, 'Contract_2024_001', 'contract', 2, 5, 'legal_dept'),
(3, 'Contract_2024_001', 'contract', 3, 5, 'legal_dept'),
(4, 'Invoice_March_001', 'invoice', 1, 1, 'accounting'),
(5, 'Receipt_Office_Supplies', 'receipt', 1, 1, 'accounting'),
(6, 'Employee_ID_JohnDoe', 'identification', 1, 1, 'hr_dept'),
(7, 'Meeting_Notes_Q1', 'notes', 1, 2, 'admin'),
(8, 'Meeting_Notes_Q1', 'notes', 2, 2, 'admin');
Step 4: Process OCR Extraction
Extract text from scanned images.
INSERT INTO document_ocr (id, document_id, extracted_text, confidence_score, word_count, language_detected)
VALUES
(1, 1, 'SERVICE AGREEMENT\n\nThis Agreement is entered into as of January 1, 2024...', 0.9523, 450, 'en'),
(2, 2, 'TERMS AND CONDITIONS\n\nSection 2.1 Payment Terms...', 0.9412, 380, 'en'),
(3, 4, 'INVOICE #INV-2024-0315\nDate: March 15, 2024\nTotal Due: $1,250.00', 0.9856, 85, 'en'),
(4, 5, 'OFFICE DEPOT\nReceipt #12345\nPaper supplies $45.99\nToner $89.99', 0.9234, 42, 'en'),
(5, 7, 'Q1 Planning Meeting\nAttendees: John, Sarah, Mike\nAgenda items discussed...', 0.8876, 320, 'en');
Step 5: Search Document Content
Search across extracted text.
SELECT
sd.document_name,
sd.document_type,
sd.page_number,
doc.extracted_text
FROM scanned_documents sd
INNER JOIN document_ocr doc ON sd.id = doc.document_id
WHERE doc.extracted_text LIKE '%Agreement%'
OR doc.extracted_text LIKE '%Contract%';
Step 6: Create Document Index
Build a searchable document index.
CREATE TABLE document_search_index (
id INTEGER PRIMARY KEY,
document_id INTEGER NOT NULL,
document_name VARCHAR(255),
document_type VARCHAR(50),
full_text TEXT,
keywords TEXT,
indexed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO document_search_index (id, document_id, document_name, document_type, full_text, keywords)
SELECT
sd.id,
sd.id,
sd.document_name,
sd.document_type,
doc.extracted_text,
CASE sd.document_type
WHEN 'contract' THEN 'agreement, terms, conditions, legal'
WHEN 'invoice' THEN 'payment, due, amount, billing'
WHEN 'receipt' THEN 'purchase, payment, expense'
ELSE 'document'
END
FROM scanned_documents sd
INNER JOIN document_ocr doc ON sd.id = doc.document_id;