PDF Processing Guide
Overview
This skill provides enterprise-grade PDF processing using the pdf-reader MCP server (5-10x faster parallel processing) and Python fallbacks.
Quick Reference
| Task | Method | Tool |
|---|---|---|
| Extract text | MCP or pdfplumber | pdf-reader / Bash |
| Extract tables | pdfplumber | Bash |
| Merge PDFs | pypdf | Bash |
| Split PDFs | pypdf / qpdf | Bash |
| OCR scanned | pytesseract | Bash |
| Read from URL | Download + Process | WebFetch + Bash |
MCP Tool Usage (Preferred)
Basic Text Extraction
{
"sources": [{
"path": "/path/to/document.pdf"
}],
"operation": "extract",
"pages": "all"
}
Extract Specific Pages
{
"sources": [{
"path": "document.pdf"
}],
"operation": "extract",
"pages": "1-5"
}
Get Metadata Only
{
"sources": [{
"path": "document.pdf"
}],
"operation": "metadata"
}
URL PDFs Workflow
For PDFs from URLs (like HubFS, S3, etc.):
- Download PDF:
curl -L -o /tmp/document.pdf "https://example.com/file.pdf"
- Extract with MCP:
{
"sources": [{"path": "/tmp/document.pdf"}],
"operation": "extract"
}
- Cleanup (optional):
rm /tmp/document.pdf
Python Fallbacks
When MCP is unavailable, use Python:
Install Dependencies
pip install pypdf pdfplumber reportlab pytesseract pdf2image
Extract Text (pdfplumber)
import pdfplumber
with pdfplumber.open("document.pdf") as pdf:
for page in pdf.pages:
text = page.extract_text()
print(text)
Extract Tables
import pdfplumber
import pandas as pd
with pdfplumber.open("document.pdf") as pdf:
for page in pdf.pages:
tables = page.extract_tables()
for table in tables:
df = pd.DataFrame(table[1:], columns=table[0])
print(df)
OCR for Scanned PDFs
import pytesseract
from pdf2image import convert_from_path
images = convert_from_path('scanned.pdf')
for i, image in enumerate(images):
text = pytesseract.image_to_string(image, lang='jpn') # Japanese
print(f"Page {i+1}:\n{text}")
Command-Line Tools
pdftotext (poppler-utils)
# Install on macOS
brew install poppler
# Extract text preserving layout
pdftotext -layout input.pdf output.txt
# Extract specific pages
pdftotext -f 1 -l 5 input.pdf output.txt
qpdf
# Install
brew install qpdf
# Merge PDFs
qpdf --empty --pages file1.pdf file2.pdf -- merged.pdf
# Split pages
qpdf input.pdf --pages . 1-5 -- pages1-5.pdf
Apify Integration (for complex PDFs)
For PDFs requiring advanced processing:
# PDF Text Extractor (jirimoravcik)
npx apify-cli run jirimoravcik/pdf-text-extractor \
-i '{"pdfUrls": ["https://example.com/file.pdf"]}'
See references/apify-actors.md for full Apify integration.
Common Tasks
Anthropic Guide PDF (Example)
# Download
curl -L -o /tmp/anthropic-guide.pdf \
"https://resources.anthropic.com/hubfs/The-Complete-Guide-to-Building-Skill-for-Claude.pdf"
# Extract with MCP
# Use pdf-reader tool with path: /tmp/anthropic-guide.pdf
Merge Multiple PDFs
from pypdf import PdfWriter, PdfReader
writer = PdfWriter()
for pdf_file in ["doc1.pdf", "doc2.pdf", "doc3.pdf"]:
reader = PdfReader(pdf_file)
for page in reader.pages:
writer.add_page(page)
with open("merged.pdf", "wb") as output:
writer.write(output)
Add Watermark
from pypdf import PdfReader, PdfWriter
watermark = PdfReader("watermark.pdf").pages[0]
reader = PdfReader("document.pdf")
writer = PdfWriter()
for page in reader.pages:
page.merge_page(watermark)
writer.add_page(page)
with open("watermarked.pdf", "wb") as output:
writer.write(output)
Validation Loop
- Extract: Run extraction
- Verify: Check output quality
- Retry with OCR: If text is empty/garbled, try OCR
- Save: Store extracted content
Troubleshooting
| Issue | Solution |
|---|---|
| Empty text | PDF may be scanned - use OCR |
| Garbled characters | Check encoding, try different library |
| Tables broken | Use pdfplumber with explicit table settings |
| Large file slow | Use page ranges, parallel processing |
References
- Advanced features: See references/advanced-pdf.md
- Form filling: See references/pdf-forms.md
- Apify integration: See references/apify-actors.md