如何从上传的PDF文件中读取保留换行符的文本内容
问题原因
- 你直接读取PDF原始二进制内容必然得到乱码:PDF是包含字体、排版、元数据等信息的复合二进制格式,不是纯文本文件,无法直接读取内容,必须通过专用解析库提取文本。
- 原有代码存在异步逻辑错误:
FileReader的load事件是异步触发的,你在事件回调外直接return output时,回调还没执行,永远拿不到正确结果。
正确实现方案
用Mozilla维护的pdf.js库完成PDF文本提取,这是目前浏览器端解析PDF最稳定的方案,原生支持保留文本换行格式。
代码实现
HTML部分
<input type="file" id="file" accept=".pdf"> <p id="result"></p> <!-- 引入pdf.js的生产环境umd包和对应的worker包即可 -->
JS部分
// 配置pdf.js的worker文件路径,和你引入的pdf.js文件保持同路径即可 pdfjsLib.GlobalWorkerOptions.workerSrc = 'pdf.worker.min.js'; // 封装异步解析函数,PDF解析全流程为异步操作 async function readPdf(file) { const arrayBuffer = await file.arrayBuffer(); const pdf = await pdfjsLib.getDocument({ data: arrayBuffer }).promise; let fullText = ''; // 遍历PDF所有页面提取文本 for (let pageNum = 1; pageNum <= pdf.numPages; pageNum++) { const page = await pdf.getPage(pageNum); const textContent = await page.getTextContent(); // 拼接文本时自动保留原换行格式 const pageText = textContent.items.map(item => item.str).join('\n'); fullText += pageText + '\n'; } return fullText.trim(); } // 监听文件选择事件触发解析 document.getElementById('file').addEventListener('change', async (e) => { const file = e.target.files[0]; if (!file || file.type !== 'application/pdf') return; const text = await readPdf(file); // 此处text变量就是带\n的目标文本,符合你要求的存储格式 console.log('提取结果:', text); document.getElementById('result').textContent = text; });
注意事项
提取的文本默认会保留PDF内的原生换行,你示例的场景下得到的结果就是"Hello World\nHow are you today?",完全匹配需求。不要用同步方式调用解析函数,所有PDF操作都为异步逻辑,统一用async/await或者Promise回调处理结果即可。
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

