🔄 Tool engine last security update: 24 mins ago
🚀 Cloud engine optimization: High-speed local processing server enabled for بلدك !
Best Free Online Tool for PDF Merger – Secure & Fast
PDF Merger | Advanced Client-Side Tool
Files to merge
Clear all
No files added yet. Add PDF files to start merging.
Merge files now
Reset all
Powered by pdf-lib • Fast & secure merging • Handles large documents
(function(){
// ———- File storage ———-
let pdfFilesQueue = []; // each item: { id, file, name, size }
let nextId = 1;
// DOM references
const dropZone = document.getElementById(‘dropZone’);
const fileInput = document.getElementById(‘fileInput’);
const selectBtn = document.getElementById(‘selectFilesBtn’);
const fileListContainer = document.getElementById(‘fileListContainer’);
const mergeBtn = document.getElementById(‘mergeBtn’);
const resetBtn = document.getElementById(‘resetBtn’);
const clearAllBtn = document.getElementById(‘clearAllBtn’);
const statusContainer = document.getElementById(‘statusContainer’);
// render file list UI
function renderFileList() {
if (!fileListContainer) return;
if (pdfFilesQueue.length === 0) {
fileListContainer.innerHTML = ‘
No files added. Add PDF files to start merging.‘;
return;
}
let html = ”;
pdfFilesQueue.forEach((item, idx) => {
const sizeMB = (item.size / 1024 / 1024).toFixed(2);
const sizeDisplay = sizeMB >= 1 ? `${sizeMB} MB` : `${(item.size / 1024).toFixed(0)} KB`;
html += `
${escapeHtml(item.name)}
${sizeDisplay}
`;
});
fileListContainer.innerHTML = html;
// attach event handlers for dynamic buttons
document.querySelectorAll(‘.btn-move-up’).forEach(btn => {
btn.addEventListener(‘click’, (e) => {
e.stopPropagation();
const id = parseInt(btn.getAttribute(‘data-id’));
moveFileUp(id);
});
});
document.querySelectorAll(‘.btn-move-down’).forEach(btn => {
btn.addEventListener(‘click’, (e) => {
e.stopPropagation();
const id = parseInt(btn.getAttribute(‘data-id’));
moveFileDown(id);
});
});
document.querySelectorAll(‘.btn-remove’).forEach(btn => {
btn.addEventListener(‘click’, (e) => {
e.stopPropagation();
const id = parseInt(btn.getAttribute(‘data-id’));
removeFileById(id);
});
});
}
// helper functions
function escapeHtml(str) {
if(!str) return ”;
return str.replace(/[&]/g, function(m) {
if(m === ‘&’) return ‘&’;
if(m === ”) return ‘>’;
return m;
});
}
function moveFileUp(id) {
const index = pdfFilesQueue.findIndex(f => f.id === id);
if(index > 0) {
[pdfFilesQueue[index-1], pdfFilesQueue[index]] = [pdfFilesQueue[index], pdfFilesQueue[index-1]];
renderFileList();
}
}
function moveFileDown(id) {
const index = pdfFilesQueue.findIndex(f => f.id === id);
if(index !== -1 && index f.id !== id);
renderFileList();
clearStatus();
}
function clearAllFiles() {
pdfFilesQueue = [];
renderFileList();
clearStatus();
}
function clearStatus() {
if(statusContainer) statusContainer.innerHTML = ”;
}
// add new files (avoid exact duplicates)
function addFiles(files) {
if(!files || files.length === 0) return;
let addedCount = 0;
for(let file of files) {
if(file.type !== ‘application/pdf’) {
showTemporaryError(`File “${file.name}” is not a PDF, skipped.`);
continue;
}
const isDuplicate = pdfFilesQueue.some(f => f.name === file.name && f.size === file.size);
if(isDuplicate) {
showTemporaryError(`⚠️ File “${file.name}” already exists in the list, duplicate ignored.`);
continue;
}
pdfFilesQueue.push({
id: nextId++,
file: file,
name: file.name,
size: file.size
});
addedCount++;
}
if(addedCount > 0) {
renderFileList();
clearStatus();
}
}
function showTemporaryError(msg) {
const existing = statusContainer.querySelector(‘.temp-error’);
if(existing) existing.remove();
const errDiv = document.createElement(‘div’);
errDiv.className = ‘error-card temp-error’;
errDiv.style.padding = ’15px’;
errDiv.style.marginTop = ’10px’;
errDiv.innerHTML = `
${msg}`;
statusContainer.prepend(errDiv);
setTimeout(() => { if(errDiv && errDiv.remove) errDiv.remove(); }, 3000);
}
// —– merge process using pdf-lib (100% client side) —–
async function startMerge() {
if(pdfFilesQueue.length === 0) {
showTemporaryError(‘No files to merge. Please add PDF files first.’);
return;
}
if(pdfFilesQueue.length === 1) {
showTemporaryError(‘You need at least two PDF files to merge. Add more files.’);
return;
}
// disable buttons during processing
mergeBtn.disabled = true;
resetBtn.disabled = true;
clearAllBtn.disabled = true;
// show progress UI
statusContainer.innerHTML = `
Merging files…
Loading files and merging pages. May take a moment depending on file sizes.
⚡ Fast local processing – no data leaves your device
`;
const progressText = document.getElementById(‘mergeProgressText’);
try {
const mergedPdf = await PDFLib.PDFDocument.create();
let totalFiles = pdfFilesQueue.length;
for(let i = 0; i mergedPdf.addPage(page));
}
if(progressText) progressText.innerText = ‘Generating final PDF file…’;
const mergedPdfBytes = await mergedPdf.save();
const blob = new Blob([mergedPdfBytes], { type: ‘application/pdf’ });
const downloadUrl = URL.createObjectURL(blob);
const timestamp = new Date().toISOString().slice(0,19).replace(/:/g, ‘-‘);
const fileName = `merged_docs_${timestamp}.pdf`;
statusContainer.innerHTML = `
✅ Merge successful!
Successfully merged ${pdfFilesQueue.length} file(s) with all pages combined.
Download merged PDF
Merge new files
`;
const downloadLinkEl = document.getElementById(‘finalDownloadLink’);
if(downloadLinkEl) {
downloadLinkEl.addEventListener(‘click’, (e) => {
// allow download naturally
});
}
const newMergeBtn = document.getElementById(‘newMergeReset’);
if(newMergeBtn) {
newMergeBtn.addEventListener(‘click’, () => {
URL.revokeObjectURL(downloadUrl);
resetAllState();
});
}
} catch (err) {
console.error(err);
statusContainer.innerHTML = `
Merge failed
${escapeHtml(err.message || ‘Unexpected technical error. Please check your PDF files.’)}
Try again
`;
const tryAgain = document.getElementById(‘tryAgainReset’);
if(tryAgain) tryAgain.addEventListener(‘click’, () => resetAllState());
} finally {
mergeBtn.disabled = false;
resetBtn.disabled = false;
clearAllBtn.disabled = false;
}
}
// read file as ArrayBuffer using Promise
function readFileAsArrayBuffer(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = () => resolve(reader.result);
reader.onerror = () => reject(new Error(`Failed to read file: ${file.name}`));
reader.readAsArrayBuffer(file);
});
}
function resetAllState() {
pdfFilesQueue = [];
nextId = 1;
renderFileList();
clearStatus();
mergeBtn.disabled = false;
resetBtn.disabled = false;
clearAllBtn.disabled = false;
}
// drag & drop setup
function setupDragAndDrop() {
dropZone.addEventListener(‘dragover’, (e) => {
e.preventDefault();
dropZone.classList.add(‘drag-over’);
});
dropZone.addEventListener(‘dragleave’, () => {
dropZone.classList.remove(‘drag-over’);
});
dropZone.addEventListener(‘drop’, (e) => {
e.preventDefault();
dropZone.classList.remove(‘drag-over’);
const items = e.dataTransfer.files;
if(items && items.length) {
addFiles(Array.from(items));
}
});
dropZone.addEventListener(‘click’, (e) => {
if(e.target === dropZone || e.target.closest(‘.drop-area’) && !e.target.closest(‘#selectFilesBtn’)) {
fileInput.click();
}
});
}
// initialize all event listeners
function init() {
setupDragAndDrop();
selectBtn.addEventListener(‘click’, (e) => {
e.stopPropagation();
fileInput.click();
});
fileInput.addEventListener(‘change’, (e) => {
if(e.target.files && e.target.files.length) {
addFiles(Array.from(e.target.files));
}
fileInput.value = ”;
});
mergeBtn.addEventListener(‘click’, startMerge);
resetBtn.addEventListener(‘click’, resetAllState);
clearAllBtn.addEventListener(‘click’, clearAllFiles);
renderFileList();
}
init();
})();
Frequently Asked Questions about PDF Merger
Is PDF Merger safe for my confidential files?
Yes. PDF Nets processes your files strictly client-side within your browser. No files are uploaded to our servers, ensuring maximum privacy.
Do I need to install any software to use PDF Merger?
No, it is a 100% web-based tool that works instantly on Windows, Mac, iOS, and Android without installation.
Best Free Online Tool for PDF Merger Leverage the absolute capability of PDF Nets to execute PDF Merger operations effortlessly. This web utility runs completely on the client side, ensuring sub-second execution speeds, zero file storage on external servers, and maximum document compression ratios.
💡 Technical Specifications & Document Security
All your files are processed completely locally inside your browser using advanced JavaScript and WebAssembly frameworks. No documents are uploaded to our servers, ensuring 100% privacy and global data security compliance.
Technical Specifications (PDF Nets Docs)
⚙️ Processing Engine: 100% Secure Client-Side Scripting.
🛡️ Data Compliance: Safe for corporate, financial, and legal files.
🇪🇸 Versión en Español - Herramientas PDF Profesionales
Procese sus archivos de forma segura. Acceda a la utilidad global para PDF Merger en español de forma totalmente gratuita y sin registros.
🇩🇪 Deutsche Version - DSGVO-Konforme PDF-Bearbeitung
Sichere und schnelle Bearbeitung Ihrer PDF-Dokumente direkt im Browser. 100% Datenschutz durch lokale Client-Side Verarbeitung für PDF Merger .
🛠️ PDF Nets Hub: Check our comprehensive master list of the Best Free PDF Tools 2026 to accelerate your workspace productivity.