Перейти к основному содержимому
';
});
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';
}
});
})();