--- name: ocr-and-documents description: Extract text from PDFs, images, scans, Word docs (Python) category: productivity version: 1.0.0 origin: aiden license: Apache-2.0 tags: ocr, pdf, image, text-extraction, documents, docx, scan, pymupdf, tesseract, pdf-parse --- # OCR and Document Text Extraction Extract readable text from PDFs, scanned images, and Word documents using Python libraries available in most environments. No cloud API required. ## When to Use - User wants to read text from a PDF file - User wants to extract text from a scanned image or photo of a document - User wants to read a `.docx` Word document programmatically - User wants to convert a multi-page document to plain text for analysis - User wants to extract specific pages or sections from a PDF ## How to Use ### 1. Extract text from a PDF (pymupdf — fastest) ```python import fitz # pip install pymupdf doc = fitz.open("document.pdf") text = "\n\n".join(page.get_text() for page in doc) print(text[:2000]) # preview first 2000 chars doc.close() ``` ### 2. Extract text from a PDF (pdf-parse via Node.js) ```javascript // requires: npm install pdf-parse (already in DevOS dependencies) const pdfParse = require('pdf-parse') const fs = require('fs') const data = await pdfParse(fs.readFileSync('document.pdf')) console.log(data.text.slice(0, 2000)) console.log(`Pages: ${data.numpages}`) ``` ### 3. OCR a scanned image (Tesseract) Requires Tesseract installed: `winget install UB-Mannheim.TesseractOCR` ```python import pytesseract # pip install pytesseract from PIL import Image # pip install Pillow img = Image.open("scan.png") text = pytesseract.image_to_string(img, lang="eng") print(text) ``` ### 4. OCR with preprocessing for better accuracy ```python import pytesseract from PIL import Image, ImageFilter, ImageOps img = Image.open("scan.jpg") img = ImageOps.grayscale(img) img = img.filter(ImageFilter.SHARPEN) img = img.point(lambda p: 255 if p > 128 else 0) # binarize text = pytesseract.image_to_string(img, config="--psm 6") print(text) ``` ### 5. Extract text from a Word .docx file ```python from docx import Document # pip install python-docx doc = Document("report.docx") paras = [p.text for p in doc.paragraphs if p.text.strip()] text = "\n".join(paras) print(text) ``` ### 6. Extract a specific page range from a PDF ```python import fitz doc = fitz.open("big_report.pdf") pages = range(4, 9) # pages 5-9 (0-indexed) text = "\n\n".join(doc[i].get_text() for i in pages) print(text) ``` ### 7. Extract tables from a PDF ```python import pdfplumber # pip install pdfplumber with pdfplumber.open("financial_report.pdf") as pdf: for page in pdf.pages: for table in page.extract_tables(): for row in table: print("\t".join(str(cell or "") for cell in row)) ``` ## Examples **"Read the text from this PDF contract"** → Use step 1 (pymupdf) or step 2 (pdf-parse) depending on whether Python or Node is preferred. **"Extract the table from page 3 of this quarterly report PDF"** → Use step 7 (pdfplumber) targeting `pdf.pages[2]` for page 3. **"Read the text from this scanned invoice image"** → Use step 3 or 4 (Tesseract). For low-quality scans, use step 4 with preprocessing. ## Cautions - Scanned PDFs (image-only) have no embedded text — Tesseract OCR is required - Tesseract accuracy drops on handwriting, decorative fonts, or low-resolution images (< 150 DPI) - pymupdf (`fitz`) extracts only programmatically embedded text — it won't OCR scanned pages - Large PDFs can use significant memory — process page by page for files > 100 MB - For non-English text, specify the language code in Tesseract: `lang="hin"` for Hindi, `"deu"` for German