Add visual page-by-page issue display

New Features:
- 📄 Interactive page overview map showing issue severity
- Color-coded page cards (red=critical, yellow=warning, green=good)
- Click page cards to jump to that page's issues
- Collapsible sections for each page
- Issue grouping: Document-wide vs Page-specific
- Visual icons for each issue category (🏗️📋🖼️🎨 etc)
- Severity icons (🚨⚠️ℹ️)
- Better "How to Fix" recommendations
- Page sections collapse/expand with ▼▶ indicators

Improvements:
- Much easier to navigate multi-page PDFs
- Visual heat map shows problem areas at a glance
- Grouped by page makes fixing issues more systematic
- Category icons help identify issue types quickly

🤖 Generated with Claude Code
This commit is contained in:
DJP 2025-10-20 15:53:11 -04:00
parent bf83a409bb
commit 87bdacc22b
12 changed files with 653 additions and 16 deletions

View file

@ -958,40 +958,197 @@
function displayIssues(issues) {
const issuesList = document.getElementById('issuesList');
if (issues.length === 0) {
issuesList.innerHTML = '<p style="text-align: center; color: var(--text-light); padding: 40px;">No issues to display</p>';
return;
}
issuesList.innerHTML = issues.map(issue => `
<div class="issue ${issue.severity}">
<div class="issue-header">
<div class="issue-category">${issue.category}</div>
<span class="issue-badge ${issue.severity}">${issue.severity}</span>
// Group issues by page and category
const pageGroups = {};
const documentWideIssues = [];
issues.forEach(issue => {
if (issue.page_number) {
if (!pageGroups[issue.page_number]) {
pageGroups[issue.page_number] = [];
}
pageGroups[issue.page_number].push(issue);
} else {
documentWideIssues.push(issue);
}
});
// Create page overview map
const pageNumbers = Object.keys(pageGroups).map(Number).sort((a, b) => a - b);
const pageOverview = pageNumbers.length > 0 ? `
<div style="background: white; padding: 20px; border-radius: 12px; margin-bottom: 30px; box-shadow: 0 1px 3px rgba(0,0,0,0.1);">
<h3 style="margin-bottom: 15px; font-size: 18px;">📄 Page Overview</h3>
<div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(60px, 1fr)); gap: 10px;">
${pageNumbers.map(pageNum => {
const pageIssues = pageGroups[pageNum];
const criticalCount = pageIssues.filter(i => i.severity === 'CRITICAL').length;
const errorCount = pageIssues.filter(i => i.severity === 'ERROR').length;
const warningCount = pageIssues.filter(i => i.severity === 'WARNING').length;
let bgColor = '#10b981'; // Success green
let iconColor = 'white';
if (criticalCount > 0) {
bgColor = '#dc2626'; // Critical red
} else if (errorCount > 0) {
bgColor = '#ef4444'; // Error red
} else if (warningCount > 0) {
bgColor = '#f59e0b'; // Warning yellow
iconColor = 'black';
}
return `
<div onclick="scrollToPage(${pageNum})" style="cursor: pointer; background: ${bgColor}; color: ${iconColor}; padding: 15px 10px; border-radius: 8px; text-align: center; transition: transform 0.2s; font-weight: 600;" onmouseover="this.style.transform='scale(1.05)'" onmouseout="this.style.transform='scale(1)'">
<div style="font-size: 12px; opacity: 0.9;">Page</div>
<div style="font-size: 20px;">${pageNum}</div>
<div style="font-size: 11px; margin-top: 5px;">${pageIssues.length} issue${pageIssues.length !== 1 ? 's' : ''}</div>
</div>
`;
}).join('')}
</div>
</div>
` : '';
// Build the issues HTML
let issuesHTML = pageOverview;
// Document-wide issues first
if (documentWideIssues.length > 0) {
issuesHTML += `
<div id="page-document" style="margin-bottom: 30px;">
<h3 style="font-size: 20px; margin-bottom: 15px; padding: 15px; background: #f8f9fa; border-radius: 8px; cursor: pointer;" onclick="togglePageSection('document')">
📋 Document-Wide Issues (${documentWideIssues.length})
<span id="toggle-document" style="float: right;"></span>
</h3>
<div id="section-document" style="display: block;">
${documentWideIssues.map(issue => createIssueCard(issue)).join('')}
</div>
</div>
`;
}
// Then page-specific issues
pageNumbers.forEach(pageNum => {
const pageIssues = pageGroups[pageNum];
const criticalCount = pageIssues.filter(i => i.severity === 'CRITICAL').length;
const errorCount = pageIssues.filter(i => i.severity === 'ERROR').length;
const warningCount = pageIssues.filter(i => i.severity === 'WARNING').length;
issuesHTML += `
<div id="page-${pageNum}" style="margin-bottom: 30px;">
<h3 style="font-size: 20px; margin-bottom: 15px; padding: 15px; background: #f8f9fa; border-radius: 8px; cursor: pointer;" onclick="togglePageSection(${pageNum})">
📄 Page ${pageNum} - ${pageIssues.length} Issue${pageIssues.length !== 1 ? 's' : ''}
${criticalCount > 0 ? `<span style="background: #dc2626; color: white; padding: 2px 8px; border-radius: 12px; font-size: 12px; margin-left: 10px;">${criticalCount} Critical</span>` : ''}
${errorCount > 0 ? `<span style="background: #ef4444; color: white; padding: 2px 8px; border-radius: 12px; font-size: 12px; margin-left: 10px;">${errorCount} Error${errorCount !== 1 ? 's' : ''}</span>` : ''}
${warningCount > 0 ? `<span style="background: #f59e0b; color: white; padding: 2px 8px; border-radius: 12px; font-size: 12px; margin-left: 10px;">${warningCount} Warning${warningCount !== 1 ? 's' : ''}</span>` : ''}
<span id="toggle-${pageNum}" style="float: right;"></span>
</h3>
<div id="section-${pageNum}" style="display: block;">
${pageIssues.map(issue => createIssueCard(issue)).join('')}
</div>
</div>
`;
});
issuesList.innerHTML = issuesHTML;
}
function createIssueCard(issue) {
const iconMap = {
'CRITICAL': '🚨',
'ERROR': '❌',
'WARNING': '⚠️',
'INFO': '',
'SUCCESS': '✅'
};
const categoryIconMap = {
'Document Structure': '🏗️',
'Metadata': '📋',
'Language': '🌐',
'Text Accessibility': '📝',
'Images': '🖼️',
'Color Contrast': '🎨',
'Readability': '📚',
'Link Text': '🔗',
'Forms': '📄',
'Tables': '📊',
'Headings': '📑',
'Navigation': '🧭',
'Fonts': '🔤',
'Security': '🔒',
'OCR Quality': '🔍'
};
const icon = iconMap[issue.severity] || '•';
const categoryIcon = Object.keys(categoryIconMap).find(key => issue.category.includes(key))
? categoryIconMap[Object.keys(categoryIconMap).find(key => issue.category.includes(key))]
: '📌';
return `
<div class="issue ${issue.severity}" style="margin-bottom: 15px; border-left: 4px solid var(--${issue.severity.toLowerCase()});">
<div class="issue-header" style="display: flex; justify-content: space-between; align-items: center;">
<div class="issue-category" style="display: flex; align-items: center; gap: 8px;">
<span style="font-size: 20px;">${categoryIcon}</span>
<span>${issue.category}</span>
</div>
<span class="issue-badge ${issue.severity}" style="display: flex; align-items: center; gap: 5px;">
<span>${icon}</span>
<span>${issue.severity}</span>
</span>
</div>
<div class="issue-description">${issue.description}</div>
${issue.page_number ? `<div class="issue-meta"><span>📄 Page ${issue.page_number}</span></div>` : ''}
${issue.wcag_criterion ? `<div class="issue-meta"><span>📋 WCAG ${issue.wcag_criterion}</span></div>` : ''}
${issue.recommendation ? `<div class="issue-recommendation"><strong>💡 Recommendation:</strong> ${issue.recommendation}</div>` : ''}
${issue.recommendation ? `<div class="issue-recommendation"><strong>💡 How to Fix:</strong> ${issue.recommendation}</div>` : ''}
</div>
`).join('');
`;
}
function togglePageSection(pageNum) {
const section = document.getElementById(`section-${pageNum}`);
const toggle = document.getElementById(`toggle-${pageNum}`);
if (section.style.display === 'none') {
section.style.display = 'block';
toggle.textContent = '▼';
} else {
section.style.display = 'none';
toggle.textContent = '▶';
}
}
function scrollToPage(pageNum) {
const element = document.getElementById(`page-${pageNum}`);
if (element) {
element.scrollIntoView({ behavior: 'smooth', block: 'start' });
// Briefly highlight the section
element.style.background = '#fff3cd';
setTimeout(() => {
element.style.background = '';
}, 1000);
}
}
function filterIssues(severity) {
currentFilter = severity;
// Update filter buttons
document.querySelectorAll('.filter-btn').forEach(btn => {
btn.classList.remove('active');
});
event.target.classList.add('active');
if (event && event.target) {
event.target.classList.add('active');
}
// Filter issues
const filtered = severity === 'all'
? allIssues
const filtered = severity === 'all'
? allIssues
: allIssues.filter(issue => issue.severity === severity);
displayIssues(filtered);
}

View file

@ -0,0 +1,56 @@
Traceback (most recent call last):
File "/Users/daveporter/Desktop/CODING-2024/PDF-Accessibility-checker/enterprise_pdf_checker.py", line 1297, in <module>
main()
~~~~^^
File "/Users/daveporter/Desktop/CODING-2024/PDF-Accessibility-checker/enterprise_pdf_checker.py", line 1275, in main
checker = EnterprisePDFChecker(args.pdf_file, config, quick_mode=args.quick)
File "/Users/daveporter/Desktop/CODING-2024/PDF-Accessibility-checker/enterprise_pdf_checker.py", line 328, in __init__
self.vision_client = vision.ImageAnnotatorClient()
~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
File "/Users/daveporter/Desktop/CODING-2024/PDF-Accessibility-checker/venv/lib/python3.14/site-packages/google/cloud/vision_v1/services/image_annotator/client.py", line 709, in __init__
self._transport = transport_init(
~~~~~~~~~~~~~~^
credentials=credentials,
^^^^^^^^^^^^^^^^^^^^^^^^
...<7 lines>...
api_audience=self._client_options.api_audience,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/Users/daveporter/Desktop/CODING-2024/PDF-Accessibility-checker/venv/lib/python3.14/site-packages/google/cloud/vision_v1/services/image_annotator/transports/grpc.py", line 237, in __init__
super().__init__(
~~~~~~~~~~~~~~~~^
host=host,
^^^^^^^^^^
...<6 lines>...
api_audience=api_audience,
^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/Users/daveporter/Desktop/CODING-2024/PDF-Accessibility-checker/venv/lib/python3.14/site-packages/google/cloud/vision_v1/services/image_annotator/transports/base.py", line 107, in __init__
credentials, _ = google.auth.default(
~~~~~~~~~~~~~~~~~~~^
**scopes_kwargs, quota_project_id=quota_project_id
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/Users/daveporter/Desktop/CODING-2024/PDF-Accessibility-checker/venv/lib/python3.14/site-packages/google/auth/_default.py", line 705, in default
credentials, project_id = checker()
~~~~~~~^^
File "/Users/daveporter/Desktop/CODING-2024/PDF-Accessibility-checker/venv/lib/python3.14/site-packages/google/auth/_default.py", line 698, in <lambda>
lambda: _get_explicit_environ_credentials(quota_project_id=quota_project_id),
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/daveporter/Desktop/CODING-2024/PDF-Accessibility-checker/venv/lib/python3.14/site-packages/google/auth/_default.py", line 346, in _get_explicit_environ_credentials
credentials, project_id = load_credentials_from_file(
~~~~~~~~~~~~~~~~~~~~~~~~~~^
os.environ[environment_vars.CREDENTIALS],
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
quota_project_id=quota_project_id,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/Users/daveporter/Desktop/CODING-2024/PDF-Accessibility-checker/venv/lib/python3.14/site-packages/google/auth/_default.py", line 173, in load_credentials_from_file
raise exceptions.DefaultCredentialsError(
"File {} was not found.".format(filename)
)
google.auth.exceptions.DefaultCredentialsError: File /path/to/your/google-credentials.json was not found.

View file

@ -0,0 +1,29 @@
Using Google API key: AIzaSyDWVxBWiDTeECqa...
✅ Anthropic Claude initialized
🔍 Enterprise PDF Accessibility Check
📄 File: pdf_68f690e61b1447.67377632.pdf
============================================================
⏳ Running: Document Structure... ❌ (0.00s)
⏳ Running: Metadata... ❌ (0.00s)
⏳ Running: Language Declaration... ❌ (0.00s)
⏳ Running: Text Extractability... ❌ (0.00s)
⏳ Running: OCR Quality... 🔍 Running OCR analysis...
⚠️ OCR check skipped: Unable to get page count. Is poppler installed and in PATH?
❌ (0.00s)
⏳ Running: Image Accessibility... 🖼️ Analyzing images with AI...
❌ (0.00s)
⏳ Running: Color Contrast... 🎨 Checking color contrast...
⚠️ Contrast check skipped: Unable to get page count. Is poppler installed and in PATH?
❌ (0.00s)
⏳ Running: Content Readability... ❌ (0.00s)
⏳ Running: Link Quality... ❌ (0.00s)
⏳ Running: Heading Structure... ❌ (0.00s)
⏳ Running: Form Accessibility... ❌ (0.00s)
⏳ Running: Table Structure... ❌ (0.00s)
⏳ Running: Reading Order... ❌ (0.00s)
⏳ Running: Font Accessibility... ❌ (0.00s)
⏳ Running: Security Settings... ❌ (0.00s)
⏳ Running: Navigation Aids... ❌ (0.00s)
📄 Report saved: /Users/daveporter/Desktop/CODING-2024/PDF-Accessibility-checker/results/pdf_68f690e61b1447.67377632.result.json

View file

@ -0,0 +1,29 @@
Using Google API key: AIzaSyDWVxBWiDTeECqa...
✅ Anthropic Claude initialized
🔍 Enterprise PDF Accessibility Check
📄 File: pdf_68f690f834ae44.29322803.pdf
============================================================
⏳ Running: Document Structure... ❌ (0.00s)
⏳ Running: Metadata... ❌ (0.00s)
⏳ Running: Language Declaration... ❌ (0.00s)
⏳ Running: Text Extractability... ❌ (0.00s)
⏳ Running: OCR Quality... 🔍 Running OCR analysis...
⚠️ OCR check skipped: Unable to get page count. Is poppler installed and in PATH?
❌ (0.00s)
⏳ Running: Image Accessibility... 🖼️ Analyzing images with AI...
❌ (0.00s)
⏳ Running: Color Contrast... 🎨 Checking color contrast...
⚠️ Contrast check skipped: Unable to get page count. Is poppler installed and in PATH?
❌ (0.00s)
⏳ Running: Content Readability... ❌ (0.00s)
⏳ Running: Link Quality... ❌ (0.00s)
⏳ Running: Heading Structure... ❌ (0.00s)
⏳ Running: Form Accessibility... ❌ (0.00s)
⏳ Running: Table Structure... ❌ (0.00s)
⏳ Running: Reading Order... ❌ (0.00s)
⏳ Running: Font Accessibility... ❌ (0.00s)
⏳ Running: Security Settings... ❌ (0.00s)
⏳ Running: Navigation Aids... ❌ (0.00s)
📄 Report saved: /Users/daveporter/Desktop/CODING-2024/PDF-Accessibility-checker/results/pdf_68f690f834ae44.29322803.result.json

View file

@ -0,0 +1,123 @@
Using Google API key: AIzaSyDWVxBWiDTeECqa...
✅ Anthropic Claude initialized
🔍 Enterprise PDF Accessibility Check
📄 File: pdf_68f6910eeeb3d7.85806352.pdf
============================================================
⏳ Running: Document Structure... ✅ (0.00s)
⏳ Running: Metadata... ✅ (0.00s)
⏳ Running: Language Declaration... ✅ (0.00s)
⏳ Running: Text Extractability... ✅ (0.45s)
⏳ Running: OCR Quality... 🔍 Running OCR analysis...
⚠️ OCR check skipped: Unable to get page count. Is poppler installed and in PATH?
✅ (0.00s)
⏳ Running: Image Accessibility... 🖼️ Analyzing images with AI...
📊 Found 94 images to analyze...
📷 Analyzed image 1/94 (Page 1) (cached)
📷 Analyzed image 2/94 (Page 1) (cached)
📷 Analyzed image 3/94 (Page 3) (cached)
📷 Analyzed image 4/94 (Page 3) (cached)
📷 Analyzed image 5/94 (Page 3) (cached)
📷 Analyzed image 6/94 (Page 3) (cached)
📷 Analyzed image 7/94 (Page 3) (cached)
📷 Analyzed image 8/94 (Page 3) (cached)
📷 Analyzed image 9/94 (Page 3) (cached)
📷 Analyzed image 10/94 (Page 3) (cached)
📷 Analyzed image 11/94 (Page 3) (cached)
📷 Analyzed image 12/94 (Page 3) (cached)
📷 Analyzed image 13/94 (Page 3) (cached)
📷 Analyzed image 14/94 (Page 3) (cached)
📷 Analyzed image 15/94 (Page 3) (cached)
📷 Analyzed image 16/94 (Page 4) (cached)
📷 Analyzed image 17/94 (Page 4) (cached)
📷 Analyzed image 18/94 (Page 4) (cached)
📷 Analyzed image 19/94 (Page 4) (cached)
📷 Analyzed image 20/94 (Page 6) (cached)
📷 Analyzed image 21/94 (Page 6) (cached)
📷 Analyzed image 22/94 (Page 5) (cached)
📷 Analyzed image 23/94 (Page 7) (cached)
📷 Analyzed image 24/94 (Page 7) (cached)
📷 Analyzed image 25/94 (Page 6) (cached)
📷 Analyzed image 26/94 (Page 6) (cached)
📷 Analyzed image 27/94 (Page 7) (cached)
📷 Analyzed image 28/94 (Page 7) (cached)
📷 Analyzed image 29/94 (Page 7) (cached)
📷 Analyzed image 30/94 (Page 7) (cached)
📷 Analyzed image 31/94 (Page 7) (cached)
📷 Analyzed image 32/94 (Page 7) (cached)
📷 Analyzed image 33/94 (Page 7) (cached)
📷 Analyzed image 34/94 (Page 8) (cached)
📷 Analyzed image 35/94 (Page 8) (cached)
📷 Analyzed image 36/94 (Page 8) (cached)
📷 Analyzed image 37/94 (Page 8) (cached)
📷 Analyzed image 38/94 (Page 8) (cached)
📷 Analyzed image 39/94 (Page 8) (cached)
📷 Analyzed image 40/94 (Page 8) (cached)
📷 Analyzed image 41/94 (Page 8) (cached)
📷 Analyzed image 42/94 (Page 8) (cached)
📷 Analyzed image 43/94 (Page 8) (cached)
📷 Analyzed image 44/94 (Page 9) (cached)
📷 Analyzed image 45/94 (Page 9) (cached)
📷 Analyzed image 46/94 (Page 9) (cached)
📷 Analyzed image 47/94 (Page 9) (cached)
📷 Analyzed image 48/94 (Page 9) (cached)
📷 Analyzed image 49/94 (Page 10) (cached)
📷 Analyzed image 50/94 (Page 10) (cached)
📷 Analyzed image 51/94 (Page 10) (cached)
📷 Analyzed image 52/94 (Page 9) (cached)
📷 Analyzed image 53/94 (Page 10) (cached)
📷 Analyzed image 54/94 (Page 10) (cached)
📷 Analyzed image 55/94 (Page 11) (cached)
📷 Analyzed image 56/94 (Page 11) (cached)
📷 Analyzed image 57/94 (Page 11) (cached)
📷 Analyzed image 58/94 (Page 11) (cached)
📷 Analyzed image 59/94 (Page 12) (cached)
📷 Analyzed image 60/94 (Page 12) (cached)
📷 Analyzed image 61/94 (Page 12) (cached)
📷 Analyzed image 62/94 (Page 12) (cached)
📷 Analyzed image 63/94 (Page 12) (cached)
📷 Analyzed image 64/94 (Page 14) (cached)
📷 Analyzed image 65/94 (Page 13) (cached)
📷 Analyzed image 66/94 (Page 14) (cached)
📷 Analyzed image 67/94 (Page 14) (cached)
📷 Analyzed image 68/94 (Page 13) (cached)
📷 Analyzed image 69/94 (Page 14) (cached)
📷 Analyzed image 70/94 (Page 15) (cached)
📷 Analyzed image 71/94 (Page 15) (cached)
📷 Analyzed image 72/94 (Page 15) (cached)
📷 Analyzed image 73/94 (Page 15) (cached)
📷 Analyzed image 74/94 (Page 15) (cached)
📷 Analyzed image 75/94 (Page 16) (cached)
📷 Analyzed image 76/94 (Page 16) (cached)
📷 Analyzed image 77/94 (Page 16) (cached)
📷 Analyzed image 78/94 (Page 16) (cached)
📷 Analyzed image 79/94 (Page 17) (cached)
📷 Analyzed image 80/94 (Page 19) (cached)
📷 Analyzed image 81/94 (Page 19) (cached)
📷 Analyzed image 82/94 (Page 19) (cached)
📷 Analyzed image 83/94 (Page 20) (cached)
📷 Analyzed image 84/94 (Page 20) (cached)
📷 Analyzed image 85/94 (Page 20) (cached)
📷 Analyzed image 86/94 (Page 20) (cached)
📷 Analyzed image 87/94 (Page 22) (cached)
📷 Analyzed image 88/94 (Page 22) (cached)
📷 Analyzed image 89/94 (Page 26) (cached)
📷 Analyzed image 90/94 (Page 23) (cached)
📷 Analyzed image 91/94 (Page 26) (cached)
📷 Analyzed image 92/94 (Page 26) (cached)
✅ Completed analysis of 92/94 images
❌ (1.54s)
⏳ Running: Color Contrast... 🎨 Checking color contrast...
⚠️ Contrast check skipped: Unable to get page count. Is poppler installed and in PATH?
❌ (0.01s)
⏳ Running: Content Readability... ❌ (0.00s)
⏳ Running: Link Quality... ❌ (0.00s)
⏳ Running: Heading Structure... ❌ (0.00s)
⏳ Running: Form Accessibility... ❌ (0.00s)
⏳ Running: Table Structure... ❌ (0.04s)
⏳ Running: Reading Order... ❌ (0.00s)
⏳ Running: Font Accessibility... ❌ (0.00s)
⏳ Running: Security Settings... ❌ (0.00s)
⏳ Running: Navigation Aids... ❌ (0.00s)
📄 Report saved: /Users/daveporter/Desktop/CODING-2024/PDF-Accessibility-checker/results/pdf_68f6910eeeb3d7.85806352.result.json

View file

@ -0,0 +1,29 @@
Using Google API key: AIzaSyDWVxBWiDTeECqa...
✅ Anthropic Claude initialized
🔍 Enterprise PDF Accessibility Check
📄 File: pdf_68f6916ce7f617.79988789.pdf
============================================================
⏳ Running: Document Structure... ❌ (0.00s)
⏳ Running: Metadata... ❌ (0.00s)
⏳ Running: Language Declaration... ❌ (0.00s)
⏳ Running: Text Extractability... ❌ (0.19s)
⏳ Running: OCR Quality... 🔍 Running OCR analysis...
⚠️ OCR check skipped: Unable to get page count. Is poppler installed and in PATH?
❌ (0.00s)
⏳ Running: Image Accessibility... 🖼️ Analyzing images with AI...
❌ (0.00s)
⏳ Running: Color Contrast... 🎨 Checking color contrast...
⚠️ Contrast check skipped: Unable to get page count. Is poppler installed and in PATH?
❌ (0.00s)
⏳ Running: Content Readability... ❌ (0.00s)
⏳ Running: Link Quality... ❌ (0.00s)
⏳ Running: Heading Structure... ❌ (0.00s)
⏳ Running: Form Accessibility... ❌ (0.00s)
⏳ Running: Table Structure... ❌ (0.00s)
⏳ Running: Reading Order... ❌ (0.00s)
⏳ Running: Font Accessibility... ❌ (0.00s)
⏳ Running: Security Settings... ❌ (0.00s)
⏳ Running: Navigation Aids... ❌ (0.00s)
📄 Report saved: /Users/daveporter/Desktop/CODING-2024/PDF-Accessibility-checker/results/pdf_68f6916ce7f617.79988789.result.json

View file

@ -0,0 +1,32 @@
⚡ Quick mode enabled - skipping expensive checks
Using Google API key: AIzaSyDWVxBWiDTeECqa...
✅ Anthropic Claude initialized
🔍 Enterprise PDF Accessibility Check
📄 File: pdf_68f69229886380.01972382.pdf
============================================================
⏳ Running: Document Structure... ✅ (0.00s)
⏳ Running: Metadata... ✅ (0.00s)
⏳ Running: Language Declaration... ✅ (0.00s)
⏳ Running: Text Extractability... ✅ (0.45s)
⏳ Running: OCR Quality... ⏩ Skipping OCR analysis (quick mode)
✅ (0.00s)
⏳ Running: Image Accessibility... 🖼️ Analyzing images with AI...
📊 Found 94 images to analyze...
⏩ Skipping AI image analysis (quick mode)
✅ (1.49s)
⏳ Running: Color Contrast... 🎨 Checking color contrast...
⏩ Skipping detailed contrast analysis (quick mode)
✅ (0.00s)
⏳ Running: Content Readability... ❌ (0.00s)
⏳ Running: Link Quality... ❌ (0.00s)
⏳ Running: Heading Structure... ❌ (0.00s)
⏳ Running: Form Accessibility... ❌ (0.00s)
⏳ Running: Table Structure... ❌ (0.04s)
⏳ Running: Reading Order... ❌ (0.00s)
⏳ Running: Font Accessibility... ❌ (0.00s)
⏳ Running: Security Settings... ❌ (0.00s)
⏳ Running: Navigation Aids... ❌ (0.00s)
📄 Report saved: /Users/daveporter/Desktop/CODING-2024/PDF-Accessibility-checker/results/pdf_68f69229886380.01972382.result.json

View file

@ -0,0 +1,91 @@
%PDF-1.3
%âãÏÓ
1 0 obj
<<
/Producer (pypdf)
/Title (Sample Accessible Document)
/Author (PDF Accessibility Checker)
/Subject (Demonstration of accessible PDF features)
>>
endobj
2 0 obj
<<
/Type /Pages
/Count 1
/Kids [ 4 0 R ]
>>
endobj
3 0 obj
<<
/Type /Catalog
/Pages 2 0 R
>>
endobj
4 0 obj
<<
/Contents 5 0 R
/MediaBox [ 0 0 612 792 ]
/Resources <<
/Font 6 0 R
/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>>
/Rotate 0
/Trans <<
>>
/Type /Page
/Parent 2 0 R
>>
endobj
5 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ]
/Length 272
>>
stream
Gas2Cd7s`t&4PLPMYi2VXP7>1X)BJNORPM%Ipag[>I/HD3ud_YmBWC&!iD/F9^Xo"UQDCONkb8&PJQ'A6"u],<07nL/%h7sENc'oDQh6br8"E;6KL4>pBgI/5?c5b]%<B*Df"b86Z-;g@;^R*QV.OgU6h:j7AM(po)#4fcPQ@u;W4`l[\-QcX.=WHa!>N[Qjros?JTspJr8R*Q(Umg]FRcAiL6lFGE;5ZXs;EdN3#CQk5`gp>8$c;R@TK'ROK@OBPht2*sA?W,Hklf~>
endstream
endobj
6 0 obj
<<
/F1 7 0 R
/F2 8 0 R
>>
endobj
7 0 obj
<<
/BaseFont /Helvetica
/Encoding /WinAnsiEncoding
/Name /F1
/Subtype /Type1
/Type /Font
>>
endobj
8 0 obj
<<
/BaseFont /Helvetica-Bold
/Encoding /WinAnsiEncoding
/Name /F2
/Subtype /Type1
/Type /Font
>>
endobj
xref
0 9
0000000000 65535 f
0000000015 00000 n
0000000178 00000 n
0000000237 00000 n
0000000286 00000 n
0000000475 00000 n
0000000838 00000 n
0000000879 00000 n
0000000986 00000 n
trailer
<<
/Size 9
/Root 3 0 R
/Info 1 0 R
>>
startxref
1098
%%EOF

View file

@ -0,0 +1,91 @@
%PDF-1.3
%âãÏÓ
1 0 obj
<<
/Producer (pypdf)
/Title (Sample Accessible Document)
/Author (PDF Accessibility Checker)
/Subject (Demonstration of accessible PDF features)
>>
endobj
2 0 obj
<<
/Type /Pages
/Count 1
/Kids [ 4 0 R ]
>>
endobj
3 0 obj
<<
/Type /Catalog
/Pages 2 0 R
>>
endobj
4 0 obj
<<
/Contents 5 0 R
/MediaBox [ 0 0 612 792 ]
/Resources <<
/Font 6 0 R
/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>>
/Rotate 0
/Trans <<
>>
/Type /Page
/Parent 2 0 R
>>
endobj
5 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ]
/Length 272
>>
stream
Gas2Cd7s`t&4PLPMYi2VXP7>1X)BJNORPM%Ipag[>I/HD3ud_YmBWC&!iD/F9^Xo"UQDCONkb8&PJQ'A6"u],<07nL/%h7sENc'oDQh6br8"E;6KL4>pBgI/5?c5b]%<B*Df"b86Z-;g@;^R*QV.OgU6h:j7AM(po)#4fcPQ@u;W4`l[\-QcX.=WHa!>N[Qjros?JTspJr8R*Q(Umg]FRcAiL6lFGE;5ZXs;EdN3#CQk5`gp>8$c;R@TK'ROK@OBPht2*sA?W,Hklf~>
endstream
endobj
6 0 obj
<<
/F1 7 0 R
/F2 8 0 R
>>
endobj
7 0 obj
<<
/BaseFont /Helvetica
/Encoding /WinAnsiEncoding
/Name /F1
/Subtype /Type1
/Type /Font
>>
endobj
8 0 obj
<<
/BaseFont /Helvetica-Bold
/Encoding /WinAnsiEncoding
/Name /F2
/Subtype /Type1
/Type /Font
>>
endobj
xref
0 9
0000000000 65535 f
0000000015 00000 n
0000000178 00000 n
0000000237 00000 n
0000000286 00000 n
0000000475 00000 n
0000000838 00000 n
0000000879 00000 n
0000000986 00000 n
trailer
<<
/Size 9
/Root 3 0 R
/Info 1 0 R
>>
startxref
1098
%%EOF

Binary file not shown.

Binary file not shown.

Binary file not shown.