All-in-One Utility Tools Suite

${file.name}
`;
filesQueue2.appendChild(div);
};
reader.readAsDataURL(file);
});
});
document.getElementById('convertBtn2').addEventListener('click', async () => {
const pdfDoc = await PDFLib.PDFDocument.create();
const images = Array.from(filesQueue2.children);
for (const imgEl of images) {
const imgData = imgEl.querySelector('img').src;
const imgBytes = await fetch(imgData).then(r => r.arrayBuffer());
const image = imgData.includes('jpeg') ? await pdfDoc.embedJpg(imgBytes) : await pdfDoc.embedPng(imgBytes);
const page = pdfDoc.addPage([600, 800]);
const margin = options2.mar;
page.drawImage(image, {
x: margin, y: margin,
width: 600 - (margin * 2),
height: 800 - (margin * 2)
});
}
const pdfBytes = await pdfDoc.save();
const blob = new Blob([pdfBytes], {type: 'application/pdf'});
const a = document.createElement('a');
a.href = URL.createObjectURL(blob);
a.download = "converted.pdf";
a.click();
});
// --- Tool 3 Logic ---
pdfjsLib.GlobalWorkerOptions.workerSrc = 'https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.4.120/pdf.worker.min.js';
let fileMap3 = new Map();
const uploadView3 = document.getElementById('uploadView3');
const workspaceView3 = document.getElementById('workspaceView3');
const dropZone3 = document.getElementById('dropZone3');
const fileInput3 = document.getElementById('fileInput3');
const filesQueue3 = document.getElementById('filesQueue3');
const sidebarFileCount3 = document.getElementById('sidebarFileCount3');
const mergeBtn3 = document.getElementById('mergeBtn3');
const clearAllBtn3 = document.getElementById('clearAllBtn3');
const addMoreBtn3 = document.getElementById('addMoreBtn3');
new Sortable(filesQueue3, { animation: 180, ghostClass: 'bg-red-50/40' });
dropZone3.addEventListener('click', () => fileInput3.click());
addMoreBtn3.addEventListener('click', () => fileInput3.click());
fileInput3.addEventListener('change', (e) => handleUploadProcessing3(Array.from(e.target.files)));
async function handleUploadProcessing3(files) {
if (files.length === 0) return;
uploadView3.classList.add('hidden');
workspaceView3.classList.remove('hidden');
for (const file of files) {
const uniqueId = `file_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
fileMap3.set(uniqueId, { file: file, rotation: 0 });
filesQueue3.appendChild(createSkeletonCard3(uniqueId, file.name));
renderThumbnailStream3(file, uniqueId);
}
updateSidebarStats3();
fileInput3.value = '';
}
function createSkeletonCard3(id, filename) {
const div = document.createElement('div');
div.className = "group relative bg-slate-50 border border-slate-200 rounded-xl p-3 flex flex-col items-center transition-all hover:shadow-md cursor-grab";
div.dataset.id = id;
div.innerHTML = `
${filename}
`;
return div;
}
async function renderThumbnailStream3(file, id) {
try {
const pdf = await pdfjsLib.getDocument({ data: await file.arrayBuffer() }).promise;
const page = await pdf.getPage(1);
const viewport = page.getViewport({ scale: 0.3 });
const canvas = document.createElement('canvas');
canvas.height = viewport.height; canvas.width = viewport.width;
await page.render({ canvasContext: canvas.getContext('2d'), viewport: viewport }).promise;
document.getElementById(`loader_${id}`).remove();
document.querySelector(`[data-id="${id}"] .canvas-container`).appendChild(canvas);
} catch (err) { document.getElementById(`loader_${id}`).innerHTML = `
`; }
}
function downloadSinglePdf3(id) {
const data = fileMap3.get(id);
const a = document.createElement('a');
a.href = URL.createObjectURL(data.file);
a.download = data.file.name;
a.click();
}
function rotateCard3(id) {
const data = fileMap3.get(id);
data.rotation = (data.rotation + 90) % 360;
document.querySelector(`[data-id="${id}"] .canvas-container`).style.transform = `rotate(${data.rotation}deg)`;
}
function removeCard3(id) {
document.querySelector(`[data-id="${id}"]`).remove();
fileMap3.delete(id);
updateSidebarStats3();
}
function updateSidebarStats3() {
sidebarFileCount3.innerText = filesQueue3.children.length;
if (filesQueue3.children.length === 0) { workspaceView3.classList.add('hidden'); uploadView3.classList.remove('hidden'); }
}
clearAllBtn3.addEventListener('click', () => { filesQueue3.innerHTML = ''; fileMap3.clear(); updateSidebarStats3(); });
mergeBtn3.addEventListener('click', async () => {
const activeCards = Array.from(filesQueue3.children);
if (activeCards.length < 2) return alert('Add at least 2 files');
mergeBtn3.disabled = true;
try {
const mergedPdf = await PDFLib.PDFDocument.create();
for (const card of activeCards) {
const record = fileMap3.get(card.dataset.id);
const pdfDoc = await PDFLib.PDFDocument.load(await record.file.arrayBuffer());
const pages = await mergedPdf.copyPages(pdfDoc, pdfDoc.getPageIndices());
pages.forEach(p => { if (record.rotation) p.setRotation(PDFLib.degrees(record.rotation)); mergedPdf.addPage(p); });
}
const blob = new Blob([await mergedPdf.save()], { type: 'application/pdf' });
const link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = 'merged_documents.pdf';
link.click();
} catch (e) { console.error(e); } finally { mergeBtn3.disabled = false; }
});