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 = '

Loading preview...

'; 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 = `

Original PDF Info

Pages: ${pdfDoc.getPageCount()}

Dimensions: ${width.toFixed(0)} × ${height.toFixed(0)}

Orientation: ${width > height ? 'Landscape' : 'Portrait'}

`; } catch (error) { preview.innerHTML = '

Error loading PDF. Please try another file.

'; 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 = ' 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 = `

Processing Complete!

Original pages: ${pageCount}

New pages: ${Math.ceil(pageCount / 2)}

`; downloadContainer.classList.remove('hidden'); } catch (error) { console.error('Error processing PDF:', error); preview.innerHTML = '

Error processing PDF. Please try again.

'; } finally { processBtn.disabled = false; processBtn.innerHTML = ' Process PDF'; feather.replace(); } } function downloadPDF() { if (!processedPdfBytes) return; const fileName = pdfInput.files[0].name.replace('.pdf', '') + '_processed.pdf'; download(processedPdfBytes, fileName, 'application/pdf'); } });