let pdfDoc = null;
let originalPDFs = [];
async function loadPDF(files) {
originalPDFs = [];
pdfDoc = await PDFLib.PDFDocument.create();
for (let file of files) {
const arrayBuffer = await file.arrayBuffer();
const pdf = await PDFLib.PDFDocument.load(arrayBuffer);
originalPDFs.push(pdf);
const pages = await pdfDoc.copyPages(pdf, pdf.getPageIndices());
pages.forEach(page => pdfDoc.addPage(page));
}
updatePageList();
renderPreview();
}
function updatePageList() {
const pageList = document.getElementById('pageList');
pageList.innerHTML = '';
for (let i = 0; i < pdfDoc.getPageCount(); i++) {
const pageItem = document.createElement('div');
pageItem.className = 'page-item';
pageItem.textContent = `Page ${i + 1}`;
pageList.appendChild(pageItem);
}
}
async function renderPreview() {
const preview = document.getElementById('preview');
preview.innerHTML = 'Rendering preview...';
const pdfBytes = await pdfDoc.save();
const blob = new Blob([pdfBytes], { type: 'application/pdf' });
const url = URL.createObjectURL(blob);
preview.innerHTML = ``;
}
async function extractPage() {
const pageNum = parseInt(document.getElementById('pageNumber').value) - 1;
if (isNaN(pageNum) || pageNum = pdfDoc.getPageCount()) {
alert('Invalid page number');
return;
}
const newPdf = await PDFLib.PDFDocument.create();
const [page] = await newPdf.copyPages(pdfDoc, [pageNum]);
newPdf.addPage(page);
pdfDoc.removePage(pageNum);
updatePageList();
renderPreview();
}
async function rotatePage() {
const pageNum = parseInt(document.getElementById('pageNumber').value) - 1;
if (isNaN(pageNum) || pageNum = pdfDoc.getPageCount()) {
alert('Invalid page number');
return;
}
const page = pdfDoc.getPage(pageNum);
const rotation = (page.getRotation().angle + 90) % 360;
page.setRotation(PDFLib.degrees(rotation));
updatePageList();
renderPreview();
}
async function deletePage() {
const pageNum = parseInt(document.getElementById('pageNumber').value) - 1;
if (isNaN(pageNum) || pageNum = pdfDoc.getPageCount()) {
alert('Invalid page number');
return;
}
pdfDoc.removePage(pageNum);
updatePageList();
renderPreview();
}
async function addPage() {
const pageNum = parseInt(document.getElementById('pageNumber').value) - 1;
if (isNaN(pageNum) || pageNum = pdfDoc.getPageCount()) {
alert('Invalid page number');
return;
}
pdfDoc.insertPage(pageNum + 1, [595, 842]); // A4 size in points
updatePageList();
renderPreview();
}
async function downloadPDF() {
const pdfBytes = await pdfDoc.save();
const blob = new Blob([pdfBytes], { type: 'application/pdf' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'modified_pdf.pdf';
a.click();
URL.revokeObjectURL(url);
}
document.getElementById('pdfInput').addEventListener('change', async (event) => {
const files = event.target.files;
if (files.length > 0) {
await loadPDF(files);
}
});