- enterprise_pdf_checker.py: resolve custom tag names through PDF RoleMap in _check_headings so PDFs using /Heading1-style tags (mapped to /H1) are correctly detected; add depth guard to walk_tree - js/results.js: add CP14 (Heading Structure) to CP_TO_CHECK; relax H-type restriction so M-type CPs with a linked check also get Mark as Passed / Undo buttons - api.php: add 'Heading Structure' => ['14'] to $check_to_cp for server-side recalculate score with heading override Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> |
||
|---|---|---|
| css | ||
| db | ||
| docs_req | ||
| js | ||
| README's | ||
| Test_files | ||
| tests | ||
| .dockerignore | ||
| .env.example | ||
| .gitignore | ||
| api.php | ||
| auth.php | ||
| CLAUDE.md | ||
| cleanup.py | ||
| cloudbuild.yaml | ||
| cloudrun_service.py | ||
| create_test_pdf_with_images.py | ||
| db_manager.py | ||
| deploy.sh | ||
| docker-compose.prod.yml | ||
| docker-compose.yml | ||
| docker-entrypoint-web.sh | ||
| Dockerfile.cloudrun | ||
| Dockerfile.web | ||
| Dockerfile.worker | ||
| enterprise_pdf_checker.py | ||
| ENTERPRISE_ROADMAP.md | ||
| history.html | ||
| index.html | ||
| logger_config.py | ||
| nginx.conf | ||
| pdf_remediation.py | ||
| pytest.ini | ||
| README.md | ||
| redis_queue.py | ||
| report_generator.py | ||
| requirements-cloudrun.txt | ||
| requirements.txt | ||
| retry_helper.py | ||
| screen_reader_simulator_proposal.md | ||
| test_auto_fixed.pdf | ||
| test_env.py | ||
| test_fixed.pdf | ||
| test_php_env.php | ||
| test_quick.sh | ||
| test_visual_inspector.pdf | ||
| test_visual_inspector_remediated.pdf | ||
| worker.py | ||
PDF Accessibility Checker - Current State
AI-Powered PDF Accessibility Validation System
Comprehensive WCAG 2.1 compliance checking with enterprise-grade features
📋 What This Application Does
This is a production-ready PDF accessibility checker that validates PDF documents against WCAG 2.1 Level A & AA standards. It combines traditional PDF analysis with cutting-edge AI to achieve approximately 95% automated coverage of accessibility requirements.
🆕 Recent Updates (Feb 2026)
Production Readiness Enhancements:
- ✅ API Authentication - Secure API access with key-based authentication
- ✅ Structured Logging - Production-grade logging with rotation and levels
- ✅ Error Resilience - Automatic retry logic with exponential backoff for API calls
- ✅ Test Suite - 31 automated tests ensuring code quality (34% coverage)
- ✅ veraPDF Integration - Enhanced PDF/UA-1 validation (ISO 14289-1)
- ✅ Virtual Environment - Isolated Python dependencies for clean deployment
- ✅ Requirements Docs - Full BRS/FRS/SAD specifications in
docs_req/ - ✅ Bug Fixes - Critical import bug fixed in remediation module
Status: 95% Production-Ready • All Critical Fixes Complete • All Tests Passing
Core Capabilities
✅ Automated WCAG Validation - Checks 30+ accessibility criteria ✅ AI-Powered Image Analysis - Uses Anthropic Claude 3.5 Sonnet for alt text validation ✅ OCR & Text Detection - Google Cloud Vision for text-in-images detection ✅ Color Contrast Analysis - WCAG AA/AAA compliance checking ✅ Readability Metrics - Flesch scores and grade-level analysis ✅ Auto-Remediation - Fixes common issues automatically ✅ Visual Inspector - See exactly where issues occur on each page ✅ Three Interfaces - Web UI, REST API, and Command Line ✅ API Authentication - Secure API access with key-based authentication ✅ Structured Logging - Production-ready logging with rotation ✅ Error Resilience - Automatic retry logic for API failures ✅ Test Suite - 31 automated tests with 34% coverage ✅ veraPDF Integration - Enhanced PDF/UA compliance validation
🏗️ System Architecture
Components
┌─────────────────────────────────────────────────────┐
│ Web Interface (index.html) │
│ • Drag-and-drop PDF upload │
│ • Real-time progress tracking │
│ • Visual results dashboard │
│ • Issue filtering and navigation │
└──────────────────┬──────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────┐
│ REST API (api.php) │
│ • File upload management │
│ • Job queue processing │
│ • Result storage and retrieval │
│ • Auto-remediation endpoint │
└──────────────────┬──────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────┐
│ Processing Engine (enterprise_pdf_checker.py) │
│ • PDF structure analysis │
│ • Image extraction and AI analysis │
│ • Color contrast checking │
│ • Readability analysis │
│ • Comprehensive reporting │
└─────────────────────────────────────────────────────┘
│ │
▼ ▼
┌──────────────────┐ ┌──────────────────────────┐
│ External APIs │ │ Remediation Engine │
│ • Claude Vision │ │ (pdf_remediation.py) │
│ • Google Vision │ │ • Metadata fixes │
│ • Document AI │ │ • Language setting │
└──────────────────┘ │ • Tagging corrections │
└──────────────────────────┘
File Structure
PDF-Accessibility-checker/
├── enterprise_pdf_checker.py # Main checker (1,508 lines)
├── pdf_remediation.py # Auto-fix engine (455 lines)
├── api.php # REST API backend (532 lines)
├── index.html # Web interface (1,727 lines)
├── auth.php # Authentication module (NEW)
├── logger_config.py # Logging framework (NEW)
├── retry_helper.py # API retry logic (NEW)
├── requirements.txt # Python dependencies
├── pytest.ini # Test configuration (NEW)
├── .env.example # Environment configuration template
│
├── venv/ # Virtual environment (created during setup)
├── uploads/ # Uploaded PDFs (temporary)
├── results/ # Check results and metadata
├── .cache/ # API response cache (cost optimization)
├── logs/ # Application logs (NEW)
│
├── tests/ # Test suite (NEW)
│ ├── conftest.py # pytest fixtures
│ ├── test_checker.py # Checker unit tests
│ ├── test_remediation.py # Remediation tests
│ └── test_api.py # API integration tests
│
├── Test_files/ # Sample PDFs for testing
│ ├── sample_good.pdf
│ └── sample_poor.pdf
│
├── docs_req/ # Requirements specifications (NEW)
│ ├── PDFAccessibilityHub_BRS_v1.1_2026-02-02.md
│ ├── PDFAccessibilityHub_FRS_v1.1_2026-02-02.md
│ └── PDFAccessibilityHub_SAD_v1.1_2026-02-02.md
│
└── README's/ # Extensive documentation (19 files)
├── START_HERE.md
├── QUICKSTART.md
├── ENTERPRISE_README.md
├── ARCHITECTURE.md
├── WCAG_LIMITATIONS.md
└── ... (14 more guides)
🚀 Quick Setup Guide
Prerequisites
- Python 3.8+
- PHP 7.4+ (for web interface)
- Tesseract OCR (for text extraction)
- Poppler (for PDF rendering)
- API Keys:
- Anthropic API key (required for AI analysis)
- Google Cloud credentials (optional, enhances analysis)
Installation (10 Minutes)
# 1. Navigate to project directory
cd /path/to/PDF-Accessibility-checker
# 2. Create virtual environment (recommended)
python3 -m venv venv
source venv/bin/activate
# 3. Install Python dependencies
pip install -r requirements.txt
# 4. Install system dependencies (macOS)
brew install php tesseract poppler
# Optional: Install veraPDF for enhanced PDF/UA validation
brew install verapdf
# 5. Configure API keys
cp .env.example .env
nano .env # Add your Anthropic API key
# 6. Start the web server
php -S localhost:8000
# 7. Open browser
open http://localhost:8000
Note: On macOS, use virtual environment to avoid externally-managed-environment errors.
Alternative: Command Line Usage
# Basic check
python3 enterprise_pdf_checker.py document.pdf
# With output file
python3 enterprise_pdf_checker.py document.pdf --output report.json
# Quick mode (skip AI analysis)
python3 enterprise_pdf_checker.py document.pdf --quick
🎯 Key Features Explained
1. AI-Powered Image Analysis
Uses Anthropic Claude 3.5 Sonnet to analyze every image in the PDF:
- Validates alt text quality and meaningfulness
- Detects text embedded in images (WCAG 1.4.5 violation)
- Identifies color-only information (WCAG 1.4.1)
- Classifies images as decorative vs. informational
- Provides specific accessibility recommendations
Cost: ~$0.015 per image (cached for free on repeat checks)
2. Comprehensive WCAG Checks
Automated validation of 30+ criteria including:
- ✅ Document structure and tagging (1.3.1, 4.1.2)
- ✅ Text alternatives for images (1.1.1)
- ✅ Color contrast ratios (1.4.3) - AA/AAA levels
- ✅ Language declaration (3.1.1)
- ✅ Page titles (2.4.2)
- ✅ Link text quality (2.4.4)
- ✅ Form field labels (3.3.2)
- ✅ Reading order (1.3.2)
- ✅ Font embedding (1.4.4)
- ✅ Content readability (3.1.5)
3. Auto-Remediation
Automatically fixes common issues:
- Missing document title
- Missing author/subject metadata
- Language not set
- Document not marked as tagged
- Missing bookmarks
Usage:
python3 pdf_remediation.py document.pdf --output fixed.pdf --all
4. Visual Page Inspector
- Displays PDF pages as images
- Highlights issue locations with color-coded markers
- Zoom and pan functionality
- Click issues to see exact page location
- Severity-based color coding (Critical/Error/Warning/Info)
5. Smart Caching
- Caches all API responses by content hash
- Repeat checks of same document = $0 cost
- Similar images across documents = cached automatically
- Reduces typical document cost from $0.10 to $0.00 on re-check
📊 What Gets Checked
Fully Automated (75% of WCAG)
| Check | WCAG Criterion | Description |
|---|---|---|
| Document Structure | 1.3.1, 4.1.2 | PDF tagging and semantic structure |
| Metadata | 2.4.2, 3.1.1 | Title, language, author, subject |
| Text Extractability | - | Ensures text can be read by screen readers |
| Font Embedding | 1.4.4 | Fonts are embedded for consistent rendering |
| Color Contrast | 1.4.3 | WCAG AA/AAA compliance (4.5:1, 7:1 ratios) |
| Form Fields | 3.3.2 | Labels and descriptions present |
| Links | 2.4.4 | Descriptive link text (not "click here") |
| Reading Order | 1.3.2 | Logical content sequence |
AI-Assisted (20% of WCAG)
| Check | WCAG Criterion | AI Model | Description |
|---|---|---|---|
| Alt Text Quality | 1.1.1 | Claude 3.5 | Validates meaningfulness of alt text |
| Text in Images | 1.4.5 | Claude + Google Vision | Detects text embedded in images |
| Color-Only Info | 1.4.1 | Claude 3.5 | Identifies information conveyed by color alone |
| Content Readability | 3.1.5 | TextBlob | Flesch scores, grade level analysis |
| Image Classification | 1.1.1 | Claude 3.5 | Decorative vs. informational |
Requires Manual Review (5% of WCAG)
- ⚠️ Keyboard navigation and tab order (2.1.1)
- ⚠️ Focus indicators (2.4.7)
- ⚠️ Actual screen reader testing
- ⚠️ Semantic structure quality
- ⚠️ Real user experience validation
💰 Cost Structure
Per Document Estimate (10 pages, 5 images)
| Service | Usage | Cost |
|---|---|---|
| Anthropic Claude | 5 images @ $0.015 | $0.075 |
| Google Cloud Vision | 5 images @ $0.0015 | $0.008 |
| Google Document AI (OCR) | 10 pages @ $0.0015 | $0.015 |
| Total | ~$0.10 |
Monthly Costs by Volume
- 100 documents/month = $10
- 500 documents/month = $50
- 1,000 documents/month = $100
- 5,000 documents/month = $500
ROI Comparison
| Method | Cost/Document | Time | Coverage |
|---|---|---|---|
| This Tool | $0.10 | 2-5 min | 95% |
| Manual Review | $100 | 1-2 hours | 100% |
| Adobe Acrobat Pro | $20+ | 5-10 min | 90% |
| PAC (Free) | $0 | 3-5 min | 75% |
Break-even: After 2-3 documents vs. manual review
Time savings: 96% reduction in review time
🔧 Current Limitations
What This Tool CANNOT Do
- Full Screen Reader Simulation - Cannot replicate NVDA/JAWS behavior
- Keyboard Navigation Testing - Cannot test actual tab order functionality
- Real User Testing - Cannot replace human accessibility auditors
- PDF Creation - Only validates, doesn't create accessible PDFs
- Complex Table Analysis - Limited validation of table structure complexity
- Mathematical Content - Cannot validate MathML or equation accessibility
Known Issues
- Large PDFs (>50MB) - May timeout or require increased PHP limits
- Scanned PDFs - OCR quality depends on scan quality
- Complex Layouts - Multi-column layouts may have reading order issues
- Non-English Content - AI analysis optimized for English
- Password-Protected PDFs - Cannot analyze encrypted documents
📈 Accessibility Score Calculation
Starting Score: 100 points
Deductions:
- Critical Issue: -25 points each
- Error: -10 points each
- Warning: -5 points each
- Info: -2 points each
Minimum Score: 0
Score Interpretation
| Score | Grade | Meaning |
|---|---|---|
| 90-100 | A | Excellent - Minor improvements only |
| 80-89 | B | Good - Several issues to address |
| 70-79 | C | Fair - Significant barriers present |
| 60-69 | D | Poor - Major accessibility issues |
| 0-59 | F | Critical - Document largely inaccessible |
🔌 API Endpoints
Authentication
Development Mode: Localhost requests (http://localhost:8000) do not require authentication.
Production Mode: All API requests require authentication via API key.
Methods:
# 1. X-API-Key header (recommended)
curl -H 'X-API-Key: your-api-key' http://your-server.com/api.php
# 2. Authorization Bearer token
curl -H 'Authorization: Bearer your-api-key' http://your-server.com/api.php
# 3. Query parameter (development only)
curl 'http://localhost:8000/api.php?api_key=dev_key_12345'
Generate API Key:
curl 'http://localhost:8000/auth.php?generate'
# Returns: b85091698668907e360223e68868fa0a26dd48a2e3500a4eb48200bad63012c6
Default Dev Key: dev_key_12345
Upload PDF
POST /api.php?action=upload
Content-Type: multipart/form-data
X-API-Key: your-api-key
Body: pdf (file)
Response:
{
"success": true,
"data": {
"job_id": "pdf_123456",
"filename": "document.pdf"
}
}
Start Check
POST /api.php?action=check
Content-Type: application/json
Body:
{
"job_id": "pdf_123456",
"quick_mode": false
}
Response:
{
"success": true,
"data": {
"job_id": "pdf_123456",
"status": "processing"
}
}
Get Results
GET /api.php?action=result&job_id=pdf_123456
Response:
{
"success": true,
"data": {
"filename": "document.pdf",
"accessibility_score": 75,
"severity_counts": {...},
"issues": [...]
}
}
Auto-Remediate
POST /api.php?action=remediate
Content-Type: application/json
Body: {"job_id": "pdf_123456"}
Response:
{
"success": true,
"data": {
"remediated_pdf": "pdf_123456_remediated.pdf",
"fixes_applied": 5,
"download_url": "api.php?action=download&job_id=pdf_123456&type=remediated"
}
}
🧪 Testing
Test Files Included
Test_files/sample_good.pdf- Well-structured PDF with metadataTest_files/sample_poor.pdf- PDF with multiple accessibility issues
Quick Test
# Activate virtual environment
source venv/bin/activate
# Test the checker
python enterprise_pdf_checker.py Test_files/sample_poor.pdf --output test_result.json
# View results
cat test_result.json | python -m json.tool
# Test remediation
python pdf_remediation.py Test_files/sample_poor.pdf --all
Running Automated Tests
# Activate virtual environment
source venv/bin/activate
# Run all tests
pytest tests/ -v
# Run with coverage report
pytest tests/ --cov=. --cov-report=html
# Run only unit tests (skip integration)
pytest tests/ -m "not integration"
# View coverage report
open htmlcov/index.html
Test Results:
- ✅ 31 tests passing
- ✅ 34% code coverage
- ✅ Unit tests for checker and remediation
- ✅ Integration tests for API and authentication
🏭 Production Features
Authentication & Security
The application now includes production-ready security features:
API Authentication (auth.php)
- API key-based authentication for all endpoints
- Support for multiple authentication methods (Bearer token, X-API-Key header, query parameter)
- Development mode bypass for localhost testing
- API key generation utility
Configuration:
# Generate production API key
curl 'http://localhost:8000/auth.php?generate'
# Add to .api_keys file
echo "your-generated-key-here" >> .api_keys
# Or set environment variable
export API_KEY="your-generated-key-here"
Logging & Monitoring
Structured Logging (logger_config.py)
- Automatic log rotation (10MB max size, 5 backups)
- Multiple log levels (DEBUG, INFO, WARNING, ERROR, CRITICAL)
- Separate logs for different modules
- Logs stored in
logs/directory
Log Files:
logs/pdf_checker.log- Main checker operationslogs/pdf_remediation.log- Remediation operationslogs/retry_helper.log- API retry eventslogs/php_server.log- Web server access logs
Error Resilience
Automatic Retry Logic (retry_helper.py)
- Exponential backoff for API failures (1s → 2s → 4s delays)
- Configurable retry attempts (default: 3)
- Graceful degradation on persistent failures
- Applied to all AI API calls (Claude and Google Vision)
Benefits:
- Handles transient network failures automatically
- Prevents job failures due to temporary API issues
- Improves overall system reliability
Testing & Quality Assurance
Automated Test Suite (tests/)
- 31 unit and integration tests
- 34% code coverage of critical paths
- pytest configuration with coverage reporting
- Tests for checker, remediation, API, and authentication
Run Tests:
source venv/bin/activate
pytest tests/ -v --cov=. --cov-report=html
open htmlcov/index.html
veraPDF Integration
Enhanced PDF/UA Validation:
# Validate PDF/UA-1 compliance
verapdf --defaultflavour ua1 document.pdf
# The remediation module automatically uses veraPDF if installed
📚 Documentation
The README's/ folder contains 19 comprehensive guides (140KB+ of documentation):
Essential Reading
- START_HERE.md - Package overview and quick start
- QUICKSTART.md - 5-minute setup guide
- ENTERPRISE_README.md - Complete installation and usage
- ARCHITECTURE.md - System design and technical details
Advanced Topics
- WCAG_LIMITATIONS.md - What can't be automated
- INTEGRATION_GUIDE.md - API integration strategies
- IMPLEMENTATION_ROADMAP.md - Step-by-step coding guide
- API_QUICK_REFERENCE.md - One-page cheat sheet
- MASTER_GUIDE.md - Evolution and best practices
Specialized Guides
- MAMP_SETUP.md - Local server configuration
- PROGRESS_DISPLAY_GUIDE.md - Real-time progress implementation
- TECHNICAL_BACKGROUND.md - Deep dive into accessibility standards
- screen_reader_simulator_proposal.md - Future enhancement ideas
🔒 Security Considerations
Current Implementation
✅ File type validation (PDF only) ✅ File size limits (50MB default) ✅ API keys in environment variables ✅ Temporary file cleanup ✅ CORS headers configured ✅ Input sanitization in API ✅ API Authentication - API key-based access control ✅ Development Mode - Localhost bypass for local testing ✅ Structured Logging - Audit trail for all operations ✅ Error Handling - Retry logic for API failures
Production Recommendations
- Enable HTTPS (required)
- Implement rate limiting (infrastructure ready in auth.php)
- Add API authentication (✅ Implemented)
- Set up malware scanning
- Configure file retention policies
- Enable audit logging (✅ Implemented with logger_config.py)
- Implement API key rotation
- Deploy to production server (Apache/Nginx + PHP-FPM)
- Configure production API keys (replace dev_key_12345)
🎯 Use Cases
1. Content Publishing
Check PDFs before publication to ensure accessibility compliance
2. Legal Compliance
Validate documents meet Section 508, ADA, WCAG 2.1 requirements
3. Quality Assurance
Integrate into CI/CD pipeline for automated accessibility testing
4. Batch Processing
Audit large document libraries for accessibility issues
5. Remediation Workflow
Identify issues → Auto-fix simple problems → Manual review complex cases
🛠️ Technology Stack
Backend
- Python 3.8+ - Core processing engine
- PHP 7.4+ - REST API and web server
- Tesseract OCR - Text extraction from images
- Poppler - PDF rendering and conversion
Python Libraries
pypdf- PDF parsing and manipulationpdfplumber- Advanced PDF analysisPillow- Image processingnumpy- Numerical computationstextblob- Natural language processinganthropic- Claude AI integrationgoogle-cloud-vision- Google Vision APIgoogle-cloud-documentai- Document AI
Frontend
- Pure HTML5/CSS3/JavaScript - No frameworks
- Montserrat Font - Professional typography
- Responsive Design - Mobile-friendly interface
📞 Support & Resources
Getting Help
- Check the extensive documentation in
README's/folder - Review troubleshooting section in ENTERPRISE_README.md
- Test with sample PDFs in
Test_files/ - Verify API keys are properly configured
External Resources
🌟 What Makes This Special
✨ Quality-First Design - Uses best-in-class AI models (Claude, Google)
✨ Production-Ready - Enterprise-grade code and architecture
✨ Complete Package - Nothing else to buy or build
✨ Well-Documented - 140KB+ of comprehensive guides
✨ Cost-Optimized - Smart caching reduces API costs
✨ Three Interfaces - Web, CLI, and REST API
✨ Easy Integration - Simple REST API for existing systems
✨ Proven Technology - Built on industry-standard libraries
📊 Current Status Summary
| Aspect | Status | Notes |
|---|---|---|
| Core Functionality | ✅ Complete | All checks implemented |
| Web Interface | ✅ Complete | Drag-drop, progress, results |
| REST API | ✅ Complete | All endpoints functional |
| CLI | ✅ Complete | Full command-line support |
| AI Integration | ✅ Complete | Claude + Google Vision |
| Auto-Remediation | ✅ Complete | Fixes metadata issues |
| Visual Inspector | ✅ Complete | Page-level issue visualization |
| Documentation | ✅ Extensive | 19 guides + requirements specs |
| Testing | ✅ Implemented | 31 automated tests, 34% coverage |
| Authentication | ✅ Implemented | API key-based, localhost dev mode |
| Logging | ✅ Implemented | Structured logs with rotation |
| Error Handling | ✅ Implemented | Retry logic with exponential backoff |
| veraPDF | ✅ Integrated | Enhanced PDF/UA validation |
| Multi-tenancy | ⚠️ Partial | Single deployment, multi-file |
| Report History | ❌ Not Implemented | No tracking over time |
🚀 Quick Start Checklist
First-Time Setup
- Install Python 3.8+ and PHP 8.0+
- Install Tesseract, Poppler, and veraPDF:
brew install tesseract poppler php verapdf - Create virtual environment:
python3 -m venv venv - Activate venv:
source venv/bin/activate - Install dependencies:
pip install -r requirements.txt - Copy
.env.exampleto.env - Add Anthropic API key to
.env - (Optional) Add Google Cloud credentials for enhanced analysis
Every Session
- Activate venv:
source venv/bin/activate - Start server:
php -S localhost:8000 - Open browser:
http://localhost:8000 - Upload PDF and review accessibility report
Testing & Validation
- Run tests:
pytest tests/ -v - Check logs:
tail -f logs/pdf_checker.log - Generate API key:
curl 'http://localhost:8000/auth.php?generate' - Test veraPDF:
verapdf --defaultflavour ua1 Test_files/sample_good.pdf
Estimated setup time: 15 minutes (first time), 30 seconds (subsequent sessions)
Built with ❤️ for web accessibility. Making the internet accessible for everyone.