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:
parent
bf83a409bb
commit
87bdacc22b
12 changed files with 653 additions and 16 deletions
189
index.html
189
index.html
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
56
results/pdf_68f68176c722a5.03184737.error.log
Normal file
56
results/pdf_68f68176c722a5.03184737.error.log
Normal 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.
|
||||
29
results/pdf_68f690e61b1447.67377632.error.log
Normal file
29
results/pdf_68f690e61b1447.67377632.error.log
Normal 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
|
||||
29
results/pdf_68f690f834ae44.29322803.error.log
Normal file
29
results/pdf_68f690f834ae44.29322803.error.log
Normal 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
|
||||
123
results/pdf_68f6910eeeb3d7.85806352.error.log
Normal file
123
results/pdf_68f6910eeeb3d7.85806352.error.log
Normal 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
|
||||
29
results/pdf_68f6916ce7f617.79988789.error.log
Normal file
29
results/pdf_68f6916ce7f617.79988789.error.log
Normal 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
|
||||
32
results/pdf_68f69229886380.01972382.error.log
Normal file
32
results/pdf_68f69229886380.01972382.error.log
Normal 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
|
||||
91
uploads/pdf_68f690e61b1447.67377632.pdf
Normal file
91
uploads/pdf_68f690e61b1447.67377632.pdf
Normal 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
|
||||
91
uploads/pdf_68f690f834ae44.29322803.pdf
Normal file
91
uploads/pdf_68f690f834ae44.29322803.pdf
Normal 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
|
||||
BIN
uploads/pdf_68f6910eeeb3d7.85806352.pdf
Normal file
BIN
uploads/pdf_68f6910eeeb3d7.85806352.pdf
Normal file
Binary file not shown.
BIN
uploads/pdf_68f6916ce7f617.79988789.pdf
Normal file
BIN
uploads/pdf_68f6916ce7f617.79988789.pdf
Normal file
Binary file not shown.
BIN
uploads/pdf_68f69229886380.01972382.pdf
Normal file
BIN
uploads/pdf_68f69229886380.01972382.pdf
Normal file
Binary file not shown.
Loading…
Add table
Reference in a new issue