Zum Hauptinhalt springen
claw
am
tools
Werkzeuge
Dokumente
Daoark
EN
Startseite
Startseite
/
Dokumente
›
Startseite
manifest.json
"']/g, function(c) { return {'&':'&','<':'<','>':'>','"':'"',"'":'''}[c]; }); } // 简化 PDF 文本提取:从流中匹配 (xxx) Tj / [(xxx)] TJ function extractTextFromPdf(bytes) { var s = ''; var len = Math.min(bytes.length, 20 * 1024 * 1024); // 限 20MB for (var i = 0; i < len; i++) s += String.fromCharCode(bytes[i]); var out = []; var lines = []; // 匹配 (text) Tj var re1 = /\((?:\\.|[^\\()])*\)\s*Tj/g; var m; while ((m = re1.exec(s)) !== null) { var txt = m[0]; // 提取 (...) 内容 var inner = txt.match(/^\(([\s\S]*)\)\s*Tj$/); if (inner) lines.push(unpdfStr(inner[1])); } // 匹配 [(xxx) (yyy)] TJ var re2 = /\[((?:\([\s\S]*?\)\s*)+)\]\s*TJ/g; while ((m = re2.exec(s)) !== null) { var arr = m[1]; var parts = arr.match(/\([\s\S]*?\)/g) || []; var combined = ''; for (var k = 0; k < parts.length; k++) { var p = parts[k].replace(/^\(|\)$/g, ''); combined += unpdfStr(p); } if (combined) lines.push(combined); } return lines; } function unpdfStr(s) { return s.replace(/\\([nrtbf()\\])/g, function(m, c) { switch (c) { case 'n': return '\n'; case 'r': return '\r'; case 't': return '\t'; case 'b': return '\b'; case 'f': return '\f'; case '(': return '('; case ')': return ')'; case '\\': return '\\'; default: return m; } }).replace(/\\([0-7]{1,3})/g, function(m, oct) { return String.fromCharCode(parseInt(oct, 8)); }); } var lastText = ''; $('btn-extract').addEventListener('click', function() { var f = $('file').files[0]; if (!f) { showError('请先选 PDF'); return; } if (f.size > 20 * 1024 * 1024) { showError('文件超 20MB,本工具简化版仅支持小文件'); return; } var r = new FileReader(); r.onload = function(e) { try { var bytes = new Uint8Array(e.target.result); var lines = extractTextFromPdf(bytes); var filter = $('filter').value.trim(); var filtered = filter ? lines.filter(function(l) { return l.indexOf(filter) >= 0; }) : lines; if (lines.length === 0) { showResult('未提取到任何文本。可能原因:\n1. PDF 是扫描版(纯图片,需 OCR)\n2. PDF 字体被压缩且本工具未解压(简化版)\n3. PDF 加密了\n\n文件大小: ' + (f.size / 1024).toFixed(1) + ' KB', '0 行,可能需 OCR'); return; } lastText = filtered.join('\n'); showResult( '=== 提取统计 ===\n总行数: ' + lines.length + (filter ? '\n过滤后: ' + filtered.length + ' (关键词: ' + filter + ')' : '') + '\n\n=== 文本内容 ===\n' + lastText.substring(0, 5000) + (lastText.length > 5000 ? '\n... (共 ' + lastText.length + ' 字符)' : ''), lines.length + ' 行' ); } catch (e) { showError('提取失败: ' + (e.message || e)); } }; r.readAsArrayBuffer(f); }); $('btn-copy').addEventListener('click', function() { if (!lastText) return; if (navigator.clipboard) { navigator.clipboard.writeText(lastText).then(function() { /* ok */ }); } }); $('btn-download').addEventListener('click', function() { if (!lastText) return; var blob = new Blob([lastText], { type: 'text/plain;charset=utf-8' }); var url = URL.createObjectURL(blob); var a = document.createElement('a'); a.href = url; a.download = 'pdf-text.txt'; a.click(); URL.revokeObjectURL(url); }); $('btn-clear').addEventListener('click', function() { $('file').value = ''; $('filter').value = ''; lastText = ''; var ra = $('result-area'); ra.hidden = true; ra.style.display = 'none'; var em = $('error-msg'); em.hidden = true; em.style.display = 'none'; $('btn-copy').style.display = 'none'; $('btn-download').style.display = 'none'; }); })();