Spaces:
Running
Running
File size: 5,870 Bytes
0853b0a |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 |
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');
}
}); |