🔄 Última actualización del motor de herramientas: hace 5 min
🚀 Ein lokaler Hochgeschwindigkeitsserver wurde für Besucher aus بلدك aktiviert.
La mejor herramienta gratuita para Fusionador de PDF en línea
Fusionador de PDF | Herramienta avanzada 100% local
Archivos para fusionar
Limpiar todo
Aún no hay archivos. Añade archivos PDF para comenzar a fusionar.
Fusionar ahora
Reiniciar todo
Desarrollado con pdf-lib • Fusión rápida y segura • Maneja documentos grandes
(function(){
// ———- Almacenamiento de archivos ———-
let pdfFilesQueue = []; // cada elemento: { id, file, name, size }
let nextId = 1;
// Referencias DOM
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’);
// Renderizar lista de archivos
function renderFileList() {
if (!fileListContainer) return;
if (pdfFilesQueue.length === 0) {
fileListContainer.innerHTML = ‘
No hay archivos. Añade archivos PDF para fusionar.‘;
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;
// eventos para botones dinámicos
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);
});
});
}
// funciones auxiliares
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 = »;
}
// añadir archivos (evitar duplicados exactos)
function addFiles(files) {
if(!files || files.length === 0) return;
let addedCount = 0;
for(let file of files) {
if(file.type !== ‘application/pdf’) {
showTemporaryError(`El archivo «${file.name}» no es PDF, se ha omitido.`);
continue;
}
const isDuplicate = pdfFilesQueue.some(f => f.name === file.name && f.size === file.size);
if(isDuplicate) {
showTemporaryError(`⚠️ El archivo «${file.name}» ya existe en la lista, duplicado ignorado.`);
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);
}
// —– Proceso de fusión usando pdf-lib (100% cliente) —–
async function startMerge() {
if(pdfFilesQueue.length === 0) {
showTemporaryError(‘No hay archivos para fusionar. Agrega archivos PDF primero.’);
return;
}
if(pdfFilesQueue.length === 1) {
showTemporaryError(‘Necesitas al menos dos archivos PDF para fusionar. Añade más archivos.’);
return;
}
// deshabilitar botones durante el proceso
mergeBtn.disabled = true;
resetBtn.disabled = true;
clearAllBtn.disabled = true;
// mostrar UI de progreso
statusContainer.innerHTML = `
Fusionando archivos…
Cargando archivos y combinando páginas. Puede tomar un momento según el tamaño.
⚡ Procesamiento local rápido – tus datos nunca salen del dispositivo
`;
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 = ‘Generando el archivo PDF final…’;
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 = `fusion_${timestamp}.pdf`;
statusContainer.innerHTML = `
✅ ¡Fusión exitosa!
Se fusionaron correctamente ${pdfFilesQueue.length} archivo(s) con todas sus páginas.
Descargar PDF fusionado
Fusionar nuevos archivos
`;
const downloadLinkEl = document.getElementById(‘finalDownloadLink’);
if(downloadLinkEl) {
downloadLinkEl.addEventListener(‘click’, (e) => {
// permitir la descarga normalmente
});
}
const newMergeBtn = document.getElementById(‘newMergeReset’);
if(newMergeBtn) {
newMergeBtn.addEventListener(‘click’, () => {
URL.revokeObjectURL(downloadUrl);
resetAllState();
});
}
} catch (err) {
console.error(err);
statusContainer.innerHTML = `
Error en la fusión
${escapeHtml(err.message || ‘Error técnico inesperado. Por favor verifica tus archivos PDF.’)}
Intentar de nuevo
`;
const tryAgain = document.getElementById(‘tryAgainReset’);
if(tryAgain) tryAgain.addEventListener(‘click’, () => resetAllState());
} finally {
mergeBtn.disabled = false;
resetBtn.disabled = false;
clearAllBtn.disabled = false;
}
}
// leer archivo como ArrayBuffer
function readFileAsArrayBuffer(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = () => resolve(reader.result);
reader.onerror = () => reject(new Error(`Error al leer el archivo: ${file.name}`));
reader.readAsArrayBuffer(file);
});
}
function resetAllState() {
pdfFilesQueue = [];
nextId = 1;
renderFileList();
clearStatus();
mergeBtn.disabled = false;
resetBtn.disabled = false;
clearAllBtn.disabled = false;
}
// configuración drag & drop
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();
}
});
}
// inicialización de eventos
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();
})();
Preguntas frecuentes sobre Fusionador de PDF
¿Es segura la herramienta Fusionador de PDF para mis documentos?
Sí, absolutamente. PDF Nets procesa todos los archivos localmente en su navegador (Client-Side). Sus datos nunca se suben a ningún servidor.
¿Necesito instalar software para usar Fusionador de PDF?
No, funciona completamente en línea desde cualquier dispositivo y navegador de forma gratuita.
Das beste kostenlose Online-Tool für Fusionador de PDF Mit der Webanwendung PDF Nets können Sie Dokumente über das integrierte Fusionador de PDF Tool sicher und schnell bearbeiten. Keine Softwareinstallation erforderlich – absolute Privatsphäre und DSGVO-konforme clientseitige Datenverarbeitung.
💡 Technische Details und Dokumentensicherheit
Alle Ihre Dateien werden lokal in Ihrem Browser über erweitertes JavaScript und WebAssembly verarbeitet. Es werden keine Dokumente auf unsere Server hochgeladen, was 100% Privatsphäre und DSGVO-Konformität garantiert.
Technical Specifications (PDF Nets Docs)
⚙️ Processing Engine: 100% Secure Client-Side Scripting.
🛡️ Data Compliance: Safe for corporate, financial, and legal files.
🇬🇧 English Version - Enterprise PDF Engine
Need to process your documents internationally? Access our high-performance English workspace for Fusionador de PDF . 100% secure, browser-based, client-side WebAssembly rendering. No installation required.
🇩🇪 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 Fusionador de PDF .