{"id":48687664,"url":"https://github.com/jshields-ca/pdf-accessibility","last_synced_at":"2026-04-11T04:34:58.394Z","repository":{"id":305225035,"uuid":"1019767457","full_name":"jshields-ca/pdf-accessibility","owner":"jshields-ca","description":"A comprehensive web application for evaluating PDF accessibility and automatically remediating common issues according to WCAG AA and AAA standards.","archived":false,"fork":false,"pushed_at":"2026-04-07T01:47:55.000Z","size":13399,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-07T03:25:49.647Z","etag":null,"topics":["accessibility","accessibility-automation","accessibility-checker","accessibility-testing","pdf","pdf-accessibility"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jshields-ca.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-07-14T20:54:57.000Z","updated_at":"2026-03-24T13:51:06.000Z","dependencies_parsed_at":"2025-07-19T01:15:38.771Z","dependency_job_id":"b05c4f43-1d6d-407f-b1c2-6e618a513436","html_url":"https://github.com/jshields-ca/pdf-accessibility","commit_stats":null,"previous_names":["jshields-ca/pdf-accessibility"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/jshields-ca/pdf-accessibility","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jshields-ca%2Fpdf-accessibility","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jshields-ca%2Fpdf-accessibility/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jshields-ca%2Fpdf-accessibility/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jshields-ca%2Fpdf-accessibility/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jshields-ca","download_url":"https://codeload.github.com/jshields-ca/pdf-accessibility/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jshields-ca%2Fpdf-accessibility/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31669117,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-10T17:19:37.612Z","status":"online","status_checked_at":"2026-04-11T02:00:05.776Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["accessibility","accessibility-automation","accessibility-checker","accessibility-testing","pdf","pdf-accessibility"],"created_at":"2026-04-11T04:34:54.892Z","updated_at":"2026-04-11T04:34:58.369Z","avatar_url":"https://github.com/jshields-ca.png","language":"JavaScript","readme":"# PDF Accessibility Tool\n\n[![Build Status](https://img.shields.io/github/actions/workflow/status/jshields-ca/pdf-accessibility/ci.yml?branch=main)](https://github.com/jshields-ca/pdf-accessibility/actions)\n[![License](https://img.shields.io/github/license/jshields-ca/pdf-accessibility)](LICENSE)\n[![Version](https://img.shields.io/github/package-json/v/jshields-ca/pdf-accessibility)](package.json)\n[![Issues](https://img.shields.io/github/issues/jshields-ca/pdf-accessibility)](https://github.com/jshields-ca/pdf-accessibility/issues)\n[![Pull Requests](https://img.shields.io/github/issues-pr/jshields-ca/pdf-accessibility)](https://github.com/jshields-ca/pdf-accessibility/pulls)\n[![Last Commit](https://img.shields.io/github/last-commit/jshields-ca/pdf-accessibility)](https://github.com/jshields-ca/pdf-accessibility/commits/main)\n[![Contributors](https://img.shields.io/github/contributors/jshields-ca/pdf-accessibility)](https://github.com/jshields-ca/pdf-accessibility/graphs/contributors)\n\nA comprehensive web application for evaluating PDF accessibility and automatically remediating common issues according to WCAG AA and AAA standards.\n\n---\n\n**Author:** Jeremy Shields\n\n---\n\n## Project Status\n\n[![Project Status: Active – Maintained and supported](https://img.shields.io/badge/status-active-brightgreen.svg)](https://github.com/jeremyshields/pdf-accessibility)\n\n- **Current version:** 0.0.1 (initial/alpha release)\n- This project is actively maintained. Contributions, bug reports, and feature requests are welcome!\n- Expect rapid changes and improvements as the project matures.\n\n---\n\n## Features\n\n- 🔍 **Automated PDF Analysis** - Comprehensive accessibility evaluation\n- ♿ **WCAG Compliance** - Support for both AA and AAA standards\n- 🔧 **Automatic Remediation** - Fix common issues without user intervention\n- 📊 **Detailed Reports** - HTML reports with actionable insights\n- 🎯 **Zero User Input** - Fully automated remediation process\n- 🚀 **Modern Web Interface** - Beautiful, accessible user experience\n- 📱 **Responsive Design** - Works on desktop, tablet, and mobile\n- 🔒 **Security First** - File cleanup, rate limiting, and validation\n\n## Supported Standards\n\n- **WCAG 2.1 AA** - Standard compliance level required by most accessibility regulations\n- **WCAG 2.1 AAA** - Enhanced accessibility with stricter requirements\n- **PDF/UA** - PDF Universal Accessibility standards compatibility\n\n## What Gets Fixed Automatically\n\n### ✅ Automatic Fixes\n- Missing document metadata (title, subject, language)\n- Basic document structure and tagging\n- Reading order optimization\n- Form field accessibility attributes\n- Document outline/bookmarks creation\n- Language specification\n\n### ⚠️ Manual Review Required\n- Alternative text for images (requires human context)\n- Color contrast verification\n- Complex table structures\n- Context-specific content descriptions\n\n## Installation\n\n### Prerequisites\n\n- Node.js 16+ and npm\n- Python 3.8+ (for PDF processing)\n- Git\n\n### Quick Start\n\n1. **Clone the repository**\n   ```bash\n   git clone \u003crepository-url\u003e\n   cd pdf-accessibility-app\n   ```\n2. **Install Node.js dependencies**\n   ```bash\n   npm install\n   ```\n3. **Install Python dependencies**\n   ```bash\n   pip install -r requirements.txt\n   ```\n4. **Configure environment**\n   ```bash\n   cp .env.example .env\n   # Edit .env with your settings\n   ```\n5. **Start the application**\n   ```bash\n   npm start\n   ```\n6. **Access the application**\n   - Open http://localhost:3000 in your browser\n\n## Development\n\n### Development Mode\n```bash\nnpm run dev\n```\n\n### Build for Production\n```bash\nnpm run build\n```\n\n## API Endpoints\n\n### Upload and Analyze PDF\n```http\nPOST /api/analyze\nContent-Type: multipart/form-data\n\nParameters:\n- pdf: PDF file (max 50MB)\n- wcagLevel: \"AA\" or \"AAA\"\n```\n\n### Remediate PDF\n```http\nPOST /api/remediate/:jobId\nContent-Type: application/json\n\nBody:\n{\n  \"autoFix\": true\n}\n```\n\n### Download Remediated PDF\n```http\nGET /api/download/:jobId\n```\n\n### Get Job Status\n```http\nGET /api/status/:jobId\n```\n\n## Architecture\n\n```\npdf-accessibility-app/\n├── server.js                 # Express server\n├── package.json              # Node.js dependencies\n├── requirements.txt          # Python dependencies\n├── public/                   # Frontend files\n│   ├── index.html           # Main HTML\n│   ├── styles.css           # CSS styles\n│   └── app.js               # Frontend JavaScript\n├── src/\n│   └── services/            # Backend services\n│       ├── PDFProcessor.js          # PDF processing\n│       ├── AccessibilityAnalyzer.js # WCAG analysis\n│       ├── RemediationService.js    # Auto-remediation\n│       └── ReportGenerator.js       # HTML reports\n├── uploads/                 # Temporary PDF storage\n├── output/                  # Remediated PDFs\n└── reports/                 # Generated reports\n```\n\n## Configuration\n\n### Environment Variables\n\nCreate a `.env` file based on `.env.example`:\n\n```env\nPORT=3000\nMAX_FILE_SIZE=52428800\nRATE_LIMIT_MAX_REQUESTS=100\nFILE_RETENTION_HOURS=24\n```\n\n### Security Settings\n\n- **File Upload**: 50MB maximum, PDF files only\n- **Rate Limiting**: 100 requests per 15 minutes per IP\n- **File Cleanup**: Automatic deletion after 24 hours\n- **CORS**: Configurable allowed origins\n- **CSP**: Content Security Policy headers\n\n## Usage\n\n### Web Interface\n\n1. **Upload PDF**: Drag and drop or select a PDF file\n2. **Choose Standard**: Select WCAG AA or AAA compliance level\n3. **Analyze**: Wait for automatic analysis to complete\n4. **View Report**: Review detailed accessibility findings\n5. **Remediate**: Click to automatically fix issues\n6. **Download**: Get the improved, accessible PDF\n\n### Programmatic Usage\n\n```javascript\n// Upload and analyze\nconst formData = new FormData();\nformData.append('pdf', pdfFile);\nformData.append('wcagLevel', 'AA');\n\nconst response = await fetch('/api/analyze', {\n  method: 'POST',\n  body: formData\n});\nconst result = await response.json();\n\n// Remediate\nconst remediationResponse = await fetch(`/api/remediate/${result.jobId}`, {\n  method: 'POST',\n  headers: { 'Content-Type': 'application/json' },\n  body: JSON.stringify({ autoFix: true })\n});\n```\n\n## Accessibility Checks\n\n### WCAG AA Compliance\n- 1.1.1 Non-text Content\n- 1.3.1 Info and Relationships\n- 1.3.2 Meaningful Sequence\n- 1.4.3 Contrast (Minimum)\n- 2.4.2 Page Titled\n- 2.4.5 Multiple Ways\n- 3.1.1 Language of Page\n- 4.1.2 Name, Role, Value\n\n### WCAG AAA Additional Checks\n- 1.4.6 Contrast (Enhanced)\n- 3.3.5 Help\n- 2.4.9 Link Purpose (Link Only)\n- 2.4.10 Section Headings\n\n## Performance\n\n- **File Processing**: Optimized for PDFs up to 50MB\n- **Concurrent Jobs**: Multiple users supported simultaneously\n- **Memory Management**: Automatic cleanup and garbage collection\n- **Caching**: Temporary file caching for better performance\n\n## Security\n\n- **Input Validation**: File type and size validation\n- **Rate Limiting**: Prevents abuse and DoS attacks\n- **File Cleanup**: Automatic deletion of temporary files\n- **Secure Headers**: Helmet.js security headers\n- **CORS Protection**: Configurable cross-origin policies\n\n## Monitoring\n\n### Health Check\n```http\nGET /health\n```\n\n### Logs\nApplication logs are written to:\n- Console (development)\n- File: `./logs/app.log` (production)\n\n## Deployment\n\n### Production Setup\n\n1. **Environment Configuration**\n   ```bash\n   NODE_ENV=production\n   PORT=80\n   ```\n2. **Process Management**\n   ```bash\n   # Using PM2\n   npm install -g pm2\n   pm2 start server.js --name pdf-accessibility-tool\n   ```\n3. **Reverse Proxy**\n   Configure nginx or Apache to proxy requests to the Node.js server.\n\n### Docker Deployment\n\n```dockerfile\n# Example Dockerfile\nFROM node:16-alpine\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci --only=production\nCOPY . .\nEXPOSE 3000\nCMD [\"npm\", \"start\"]\n```\n\n## Browser Support\n\n- Chrome 80+\n- Firefox 75+\n- Safari 13+\n- Edge 80+\n\n## How to Contribute\n\n1. Fork the repository\n2. Create a feature branch: `git checkout -b feature-name`\n3. Make your changes\n4. Run tests and lint: `npm test \u0026\u0026 npm run lint`\n5. Commit using `npx cz` for conventional commits\n6. Push: `git push origin feature-name`\n7. Create a Pull Request\n\n## Community \u0026 Support\n\n- [Open an issue](https://github.com/jeremyshields/pdf-accessibility/issues) for bugs or feature requests\n- [Discussions](https://github.com/jeremyshields/pdf-accessibility/discussions) for Q\u0026A and ideas\n- [Changelog](CHANGELOG.md) for release history\n\n## License\n\nMIT License - see [LICENSE](LICENSE) for details.\n\n---\n\nBuilt with ❤️ for universal accessibility by Jeremy Shields.","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjshields-ca%2Fpdf-accessibility","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjshields-ca%2Fpdf-accessibility","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjshields-ca%2Fpdf-accessibility/lists"}