| |
|
|
| |
| function initTheme() { |
| const savedTheme = localStorage.getItem('theme') || 'dark'; |
| document.documentElement.setAttribute('data-theme', savedTheme); |
| |
| const themeToggle = document.querySelector('.theme-toggle'); |
| if (themeToggle) { |
| themeToggle.addEventListener('click', () => { |
| const currentTheme = document.documentElement.getAttribute('data-theme'); |
| const newTheme = currentTheme === 'dark' ? 'light' : 'dark'; |
| document.documentElement.setAttribute('data-theme', newTheme); |
| localStorage.setItem('theme', newTheme); |
| }); |
| } |
| } |
|
|
| |
| async function renderPDF(pdfUrl, canvasId) { |
| const canvas = document.getElementById(canvasId); |
| if (!canvas) return; |
| |
| const ctx = canvas.getContext('2d'); |
| |
| try { |
| |
| const pdfjsLib = await import('https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.min.mjs'); |
| pdfjsLib.GlobalWorkerOptions.workerSrc = 'https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.worker.min.mjs'; |
| |
| |
| const loadingTask = pdfjsLib.getDocument(pdfUrl); |
| const pdf = await loadingTask.promise; |
| |
| |
| const page = await pdf.getPage(1); |
| |
| |
| const viewport = page.getViewport({ scale: 1 }); |
| const scale = canvas.width / viewport.width; |
| const scaledViewport = page.getViewport({ scale: scale }); |
| |
| |
| canvas.height = scaledViewport.height; |
| canvas.width = scaledViewport.width; |
| |
| |
| const renderContext = { |
| canvasContext: ctx, |
| viewport: scaledViewport |
| }; |
| |
| await page.render(renderContext).promise; |
| } catch (error) { |
| console.error('Error rendering PDF:', error); |
| ctx.fillStyle = '#ef4444'; |
| ctx.font = '16px Arial'; |
| ctx.fillText('Error loading PDF', 10, 30); |
| } |
| } |
|
|
| |
| document.addEventListener('DOMContentLoaded', () => { |
| initTheme(); |
| |
| |
| const pdfUrl = document.getElementById('pdf-url'); |
| const canvasId = document.getElementById('canvas-id'); |
| |
| if (pdfUrl && canvasId) { |
| renderPDF(pdfUrl.value, canvasId.value); |
| } |
| }); |