'; }); fileList.innerHTML = html; // 绑定事件 fileList.querySelectorAll('button').forEach(function(b) { b.addEventListener('click', function(e) { e.preventDefault(); var item = e.target.closest('.file-item'); var idx = parseInt(item.dataset.idx); var action = e.target.dataset.action; if (action === 'remove') { selectedFiles.splice(idx, 1); renderFileList(); } else if (action === 'up' && idx > 0) { var tmp = selectedFiles[idx-1]; selectedFiles[idx-1] = selectedFiles[idx]; selectedFiles[idx] = tmp; renderFileList(); } else if (action === 'down' && idx < selectedFiles.length - 1) { var tmp = selectedFiles[idx+1]; selectedFiles[idx+1] = selectedFiles[idx]; selectedFiles[idx] = tmp; renderFileList(); } }); }); } fileInput.addEventListener('change', function(e) { errorMsg.textContent = ''; var newFiles = Array.from(e.target.files); // 大小校验 for (var i = 0; i < newFiles.length; i++) { if (newFiles[i].size > 20 * 1024 * 1024) { errorMsg.textContent = '文件 "' + newFiles[i].name + '" 超过 20MB 限制,建议拆分后合并'; fileInput.value = ''; return; } } selectedFiles = selectedFiles.concat(newFiles); fileInput.value = ''; renderFileList(); }); btnClear.addEventListener('click', function() { selectedFiles = []; fileInput.value = ''; errorMsg.textContent = ''; resultArea.classList.remove('show'); renderFileList(); }); document.getElementById('f').addEventListener('submit', async function(e) { e.preventDefault(); if (selectedFiles.length < 2) { errorMsg.textContent = '请至少选择 2 个 PDF 文件'; return; } errorMsg.textContent = ''; btnMain.disabled = true; btnMain.textContent = '合并中...'; try { const mergedPdf = await PDFLib.PDFDocument.create(); let totalPages = 0; for (let i = 0; i < selectedFiles.length; i++) { const bytes = await selectedFiles[i].arrayBuffer(); const srcPdf = await PDFLib.PDFDocument.load(bytes, { ignoreEncryption: true }); const copiedPages = await mergedPdf.copyPages(srcPdf, srcPdf.getPageIndices()); copiedPages.forEach(function(p) { mergedPdf.addPage(p); }); totalPages += srcPdf.getPageCount(); } const mergedBytes = await mergedPdf.save(); const blob = new Blob([mergedBytes], { type: 'application/pdf' }); const url = URL.createObjectURL(blob); const filename = 'merged-' + new Date().toISOString().slice(0,10) + '.pdf'; resultMeta.textContent = '已合并 ' + selectedFiles.length + ' 个文件,共 ' + totalPages + ' 页,' + fmtSize(mergedBytes.length); resultContent.innerHTML = ' 下载合并后的 PDF'; resultArea.classList.add('show'); } catch (err) { errorMsg.textContent = '合并失败: ' + err.message; } finally { btnMain.disabled = false; btnMain.textContent = '合并 PDF'; } }); })();