Zum Hauptinhalt springen
claw
am
tools
Werkzeuge
Dokumente
Daoark
EN
Startseite
Startseite
/
Dokumente
›
20 * 1024 * 1024) { errorMsg.textContent = '文件超过 20MB'; return; } errorMsg.textContent = ''; btnMain.disabled = true; btnMain.textContent = '合成中...'; resultArea.classList.add('show'); resultContent.innerHTML = ''; progressWrap.style.display = 'block'; progressBar.style.width = '0%'; try { var N = parseInt(layoutSel.value); // 网格 rows × cols var grids = {2: [2,1], 4: [2,2], 6: [3,2], 8: [4,2], 9: [3,3]}; var g = grids[N]; // 页面尺寸 var s = sizes[sizeSel.value]; var pw = orientSel.value === 'portrait' ? s[0] : s[1]; var ph = orientSel.value === 'portrait' ? s[1] : s[0]; var bytes = await file.arrayBuffer(); var src = await pdfjsLib.getDocument({ data: bytes }).promise; if (src.numPages > 50) { errorMsg.textContent = '页数超过 50 页'; return; } // 流式:把每页转图嵌入新 PDF var doc = await PDFLib.PDFDocument.create(); var cellW = pw / g[1], cellH = ph / g[0]; var totalOut = Math.ceil(src.numPages / N); for (var batch = 0; batch < totalOut; batch++) { var page = doc.addPage([pw, ph]); for (var k = 0; k < N; k++) { var srcIdx = batch * N + k; if (srcIdx >= src.numPages) break; var sp = await src.getPage(srcIdx + 1); var sv = sp.getViewport({ scale: 2 }); var c = document.createElement('canvas'); c.width = sv.width; c.height = sv.height; await sp.render({ canvasContext: c.getContext('2d'), viewport: sv }).promise; var blob = await new Promise(function(r){ c.toBlob(r, 'image/png'); }); var pngBytes = await blob.arrayBuffer(); var png = await doc.embedPng(pngBytes); // 网格位置 var col = k % g[1], row = Math.floor(k / g[1]); // cell 中心 var cx = col * cellW + cellW/2, cy = ph - row * cellH - cellH/2; var scale = Math.min((cellW * 0.95) / png.width, (cellH * 0.95) / png.height); var dw = png.width * scale, dh = png.height * scale; page.drawImage(png, { x: cx - dw/2, y: cy - dh/2, width: dw, height: dh }); sp.cleanup(); c.width = c.height = 0; } progressBar.style.width = ((batch+1)/totalOut*100) + '%'; } var out = await doc.save(); var pdfBlob = new Blob([out], { type: 'application/pdf' }); var url = URL.createObjectURL(pdfBlob); resultMeta.textContent = src.numPages + ' 页 → ' + totalOut + ' 页 (' + N + ' 合 1)'; resultContent.innerHTML = '
下载 nup-' + N + '.pdf (' + fmtSize(pdfBlob.size) + ')
'; } catch (err) { errorMsg.textContent = '合成失败: ' + err.message; } finally { btnMain.disabled = false; btnMain.textContent = '开始合成'; } }); })();