A comprehensive web application for evaluating PDF accessibility and automatically remediating common issues according to WCAG AA and AAA standards.
Author: Jeremy Shields
- Current version: 0.0.1 (initial/alpha release)
- This project is actively maintained. Contributions, bug reports, and feature requests are welcome!
- Expect rapid changes and improvements as the project matures.
- 🔍 Automated PDF Analysis - Comprehensive accessibility evaluation
- ♿ WCAG Compliance - Support for both AA and AAA standards
- 🔧 Automatic Remediation - Fix common issues without user intervention
- 📊 Detailed Reports - HTML reports with actionable insights
- 🎯 Zero User Input - Fully automated remediation process
- 🚀 Modern Web Interface - Beautiful, accessible user experience
- 📱 Responsive Design - Works on desktop, tablet, and mobile
- 🔒 Security First - File cleanup, rate limiting, and validation
- WCAG 2.1 AA - Standard compliance level required by most accessibility regulations
- WCAG 2.1 AAA - Enhanced accessibility with stricter requirements
- PDF/UA - PDF Universal Accessibility standards compatibility
- Missing document metadata (title, subject, language)
- Basic document structure and tagging
- Reading order optimization
- Form field accessibility attributes
- Document outline/bookmarks creation
- Language specification
- Alternative text for images (requires human context)
- Color contrast verification
- Complex table structures
- Context-specific content descriptions
- Node.js 16+ and npm
- Python 3.8+ (for PDF processing)
- Git
- Clone the repository
git clone <repository-url> cd pdf-accessibility-app
- Install Node.js dependencies
npm install
- Install Python dependencies
pip install -r requirements.txt
- Configure environment
cp .env.example .env # Edit .env with your settings
- Start the application
npm start
- Access the application
- Open http://localhost:3000 in your browser
npm run dev
npm run build
POST /api/analyze
Content-Type: multipart/form-data
Parameters:
- pdf: PDF file (max 50MB)
- wcagLevel: "AA" or "AAA"
POST /api/remediate/:jobId
Content-Type: application/json
Body:
{
"autoFix": true
}
GET /api/download/:jobId
GET /api/status/:jobId
pdf-accessibility-app/
├── server.js # Express server
├── package.json # Node.js dependencies
├── requirements.txt # Python dependencies
├── public/ # Frontend files
│ ├── index.html # Main HTML
│ ├── styles.css # CSS styles
│ └── app.js # Frontend JavaScript
├── src/
│ └── services/ # Backend services
│ ├── PDFProcessor.js # PDF processing
│ ├── AccessibilityAnalyzer.js # WCAG analysis
│ ├── RemediationService.js # Auto-remediation
│ └── ReportGenerator.js # HTML reports
├── uploads/ # Temporary PDF storage
├── output/ # Remediated PDFs
└── reports/ # Generated reports
Create a .env
file based on .env.example
:
PORT=3000
MAX_FILE_SIZE=52428800
RATE_LIMIT_MAX_REQUESTS=100
FILE_RETENTION_HOURS=24
- File Upload: 50MB maximum, PDF files only
- Rate Limiting: 100 requests per 15 minutes per IP
- File Cleanup: Automatic deletion after 24 hours
- CORS: Configurable allowed origins
- CSP: Content Security Policy headers
- Upload PDF: Drag and drop or select a PDF file
- Choose Standard: Select WCAG AA or AAA compliance level
- Analyze: Wait for automatic analysis to complete
- View Report: Review detailed accessibility findings
- Remediate: Click to automatically fix issues
- Download: Get the improved, accessible PDF
// Upload and analyze
const formData = new FormData();
formData.append('pdf', pdfFile);
formData.append('wcagLevel', 'AA');
const response = await fetch('/api/analyze', {
method: 'POST',
body: formData
});
const result = await response.json();
// Remediate
const remediationResponse = await fetch(`/api/remediate/${result.jobId}`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ autoFix: true })
});
- 1.1.1 Non-text Content
- 1.3.1 Info and Relationships
- 1.3.2 Meaningful Sequence
- 1.4.3 Contrast (Minimum)
- 2.4.2 Page Titled
- 2.4.5 Multiple Ways
- 3.1.1 Language of Page
- 4.1.2 Name, Role, Value
- 1.4.6 Contrast (Enhanced)
- 3.3.5 Help
- 2.4.9 Link Purpose (Link Only)
- 2.4.10 Section Headings
- File Processing: Optimized for PDFs up to 50MB
- Concurrent Jobs: Multiple users supported simultaneously
- Memory Management: Automatic cleanup and garbage collection
- Caching: Temporary file caching for better performance
- Input Validation: File type and size validation
- Rate Limiting: Prevents abuse and DoS attacks
- File Cleanup: Automatic deletion of temporary files
- Secure Headers: Helmet.js security headers
- CORS Protection: Configurable cross-origin policies
GET /health
Application logs are written to:
- Console (development)
- File:
./logs/app.log
(production)
- Environment Configuration
NODE_ENV=production PORT=80
- Process Management
# Using PM2 npm install -g pm2 pm2 start server.js --name pdf-accessibility-tool
- Reverse Proxy Configure nginx or Apache to proxy requests to the Node.js server.
# Example Dockerfile
FROM node:16-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
- Chrome 80+
- Firefox 75+
- Safari 13+
- Edge 80+
- Fork the repository
- Create a feature branch:
git checkout -b feature-name
- Make your changes
- Run tests and lint:
npm test && npm run lint
- Commit using
npx cz
for conventional commits - Push:
git push origin feature-name
- Create a Pull Request
- Open an issue for bugs or feature requests
- Discussions for Q&A and ideas
- Changelog for release history
MIT License - see LICENSE for details.
Built with ❤️ for universal accessibility by Jeremy Shields.