Hood-CS's picture
You are an expert in image and PDF manipulation,
0853b0a verified
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');
}
});