Spaces:
Running
Running
| document.addEventListener('DOMContentLoaded', () => { | |
| const pdfInput = document.getElementById('pdf-input'); | |
| const processBtn = document.getElementById('process-btn'); | |
| const downloadBtn = document.getElementById('download-btn'); | |
| const previewContainer = document.getElementById('preview-container'); | |
| const downloadContainer = document.getElementById('download-container'); | |
| const preview = document.getElementById('preview'); | |
| const reverseOrderCheckbox = document.getElementById('reverse-order'); | |
| const addPageNumbersCheckbox = document.getElementById('add-page-numbers'); | |
| let processedPdfBytes = null; | |
| pdfInput.addEventListener('change', handleFileSelect); | |
| processBtn.addEventListener('click', processPDF); | |
| downloadBtn.addEventListener('click', downloadPDF); | |
| async function handleFileSelect(event) { | |
| const file = event.target.files[0]; | |
| if (!file) return; | |
| previewContainer.classList.remove('hidden'); | |
| preview.innerHTML = '<p class="text-gray-500 text-center">Loading preview...</p>'; | |
| try { | |
| const arrayBuffer = await file.arrayBuffer(); | |
| const pdfDoc = await PDFLib.PDFDocument.load(arrayBuffer); | |
| const firstPage = pdfDoc.getPages()[0]; | |
| // Create a simple preview | |
| const { width, height } = firstPage.getSize(); | |
| preview.innerHTML = ` | |
| <div class="text-center"> | |
| <p class="text-gray-700 mb-2"><strong>Original PDF Info</strong></p> | |
| <p class="text-gray-600">Pages: ${pdfDoc.getPageCount()}</p> | |
| <p class="text-gray-600">Dimensions: ${width.toFixed(0)} × ${height.toFixed(0)}</p> | |
| <p class="text-gray-600">Orientation: ${width > height ? 'Landscape' : 'Portrait'}</p> | |
| </div> | |
| `; | |
| } catch (error) { | |
| preview.innerHTML = '<p class="text-red-500 text-center">Error loading PDF. Please try another file.</p>'; | |
| console.error('Error loading PDF:', error); | |
| } | |
| } | |
| async function processPDF() { | |
| const file = pdfInput.files[0]; | |
| if (!file) { | |
| alert('Please select a PDF file first'); | |
| return; | |
| } | |
| processBtn.disabled = true; | |
| processBtn.innerHTML = '<i data-feather="loader" class="animate-spin mr-2"></i> Processing...'; | |
| feather.replace(); | |
| try { | |
| const arrayBuffer = await file.arrayBuffer(); | |
| const originalPdfDoc = await PDFLib.PDFDocument.load(arrayBuffer); | |
| const newPdfDoc = await PDFLib.PDFDocument.create(); | |
| const originalPages = originalPdfDoc.getPages(); | |
| const pageCount = originalPages.length; | |
| const reverseOrder = reverseOrderCheckbox.checked; | |
| const addPageNumbers = addPageNumbersCheckbox.checked; | |
| // Process pages in pairs | |
| for (let i = 0; i < pageCount; i += 2) { | |
| const page1Index = reverseOrder ? pageCount - 1 - i : i; | |
| const page2Index = reverseOrder ? pageCount - 2 - i : i + 1; | |
| const page1 = originalPages[page1Index]; | |
| const page2 = page2Index < pageCount ? originalPages[page2Index] : null; | |
| // Create a new landscape page (double width) | |
| const { width: pw, height: ph } = page1.getSize(); | |
| const newPage = newPdfDoc.addPage([pw * 2, ph]); | |
| // Embed the first page | |
| const embeddedPage1 = await newPdfDoc.embedPage(page1); | |
| newPage.drawPage(embeddedPage1, { | |
| x: 0, | |
| y: 0, | |
| width: pw, | |
| height: ph, | |
| }); | |
| // Embed the second page if it exists | |
| if (page2) { | |
| const embeddedPage2 = await newPdfDoc.embedPage(page2); | |
| newPage.drawPage(embeddedPage2, { | |
| x: pw, | |
| y: 0, | |
| width: pw, | |
| height: ph, | |
| }); | |
| } | |
| // Add page numbers if enabled | |
| if (addPageNumbers) { | |
| const pageNumText = `Page ${page1Index + 1}${page2 ? `-${page2Index + 1}` : ''}`; | |
| newPage.drawText(pageNumText, { | |
| x: 10, | |
| y: 10, | |
| size: 12, | |
| color: PDFLib.rgb(0.5, 0.5, 0.5), | |
| }); | |
| } | |
| } | |
| // Save the processed PDF | |
| processedPdfBytes = await newPdfDoc.save(); | |
| // Update UI | |
| preview.innerHTML = ` | |
| <div class="text-center"> | |
| <p class="text-green-600 mb-2"><strong>Processing Complete!</strong></p> | |
| <p class="text-gray-700">Original pages: ${pageCount}</p> | |
| <p class="text-gray-700">New pages: ${Math.ceil(pageCount / 2)}</p> | |
| </div> | |
| `; | |
| downloadContainer.classList.remove('hidden'); | |
| } catch (error) { | |
| console.error('Error processing PDF:', error); | |
| preview.innerHTML = '<p class="text-red-500 text-center">Error processing PDF. Please try again.</p>'; | |
| } finally { | |
| processBtn.disabled = false; | |
| processBtn.innerHTML = '<i data-feather="repeat" class="mr-2"></i> Process PDF'; | |
| feather.replace(); | |
| } | |
| } | |
| function downloadPDF() { | |
| if (!processedPdfBytes) return; | |
| const fileName = pdfInput.files[0].name.replace('.pdf', '') + '_processed.pdf'; | |
| download(processedPdfBytes, fileName, 'application/pdf'); | |
| } | |
| }); |