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'); imgsGrid.innerHTML = ''; resultContent.innerHTML = ''; progressWrap.style.display = 'block'; progressBar.style.width = '0%'; try { var minSize = parseInt(minSizeInp.value); var bytes = await file.arrayBuffer(); var pdf = await pdfjsLib.getDocument({ data: bytes }).promise; if (pdf.numPages > 50) { errorMsg.textContent = '页数超过 50 页'; return; } var count = 0; var seen = {}; for (var p = 1; p <= pdf.numPages; p++) { btnMain.textContent = '解析中 (' + p + '/' + pdf.numPages + ')...'; var page = await pdf.getPage(p); // 提取操作符里的图片 var ops = await page.getOperatorList(); // 用 page.objs 缓存提取的图像 for (var i = 0; i < ops.fnArray.length; i++) { if (ops.fnArray[i] === pdfjsLib.OPS.paintImageXObject || ops.fnArray[i] === pdfjsLib.OPS.paintInlineImageXObject) { var imgName = ops.argsArray[i][0]; try { var imgData = page.objs.get(imgName); if (!imgData || seen[imgName]) continue; seen[imgName] = true; if (imgData.width < minSize || imgData.height < minSize) continue; // 渲染到 canvas var c = document.createElement('canvas'); c.width = imgData.width; c.height = imgData.height; var ctx = c.getContext('2d'); if (imgData.kind === 'rgba_32bpp' || imgData.kind === 'rgb_24bpp') { var imgDataC = ctx.createImageData(imgData.width, imgData.height); imgDataC.data.set(imgData.data); ctx.putImageData(imgDataC, 0, 0); } else if (imgData.bitmap) { ctx.drawImage(imgData.bitmap, 0, 0); } else continue; var blob = await new Promise(function(r){ c.toBlob(r, 'image/png'); }); var url = URL.createObjectURL(blob); count++; var item = document.createElement('div'); item.className = 'item'; item.innerHTML = '
' + '
p' + p + '-' + count + '.png (' + fmtSize(blob.size) + ')
'; imgsGrid.appendChild(item); } catch (e) { /* skip */ } } } page.cleanup(); progressBar.style.width = (p / pdf.numPages * 100) + '%'; } resultMeta.textContent = '从 ' + pdf.numPages + ' 页 PDF 中提取 ' + count + ' 张图片'; } catch (err) { errorMsg.textContent = '提取失败: ' + err.message; } finally { btnMain.disabled = false; btnMain.textContent = '开始提取'; } }); })();