在将 pdf 文档提取为文本时,我遇到了一个问题,它删除了多余的空间并转换为单个空间附加了 pdf 文档图像以供参考 - 。
PDF 数据 - “周期快速启动,01/09/2023 12:03”
示例 - 提取到文本“Cycle0started0Quick,001/09/2023012:03”后的“Cycle0started0000Quick,001/09/20230000012:03”
在上面的例子中我代表从0开始的空格
当前版本存在空间问题是
"pdfjs-dist": "3.11.174"
我之前使用的版本没有空间问题
"pdfjs-dist": "2.11.338",
我使用下面的代码来提取PDF文档
import pdfjs from 'pdfjs-dist/build/pdf.js';
import * as pdfWorker from 'pdfjs-dist/build/pdf.worker.js';
import logger from './utils/logger.js';
import fs from 'fs/promises';
pdfjs.GlobalWorkerOptions.workerSrc = pdfWorker;
const pdfToText = async function ({ file, dataBuffer, startPage = 1, endPage = Number.MAX_VALUE, columnSeparator = '', rowSeparator = '\n', renderOptions }) {
try {
if (file) {
dataBuffer = Uint8Array.from(await fs.readFile(file));
} else {
dataBuffer = Uint8Array.from(dataBuffer);
}
const doc = await pdfjs.getDocument(dataBuffer).promise;
const result = {
version: pdfjs.version,
numPages: doc.numPages,
metaData: await doc.getMetadata(),
}
result.info = result.metaData.info;
endPage = Math.min(endPage, doc.numPages);
const text = [];
for (let pageNumber = startPage; pageNumber <= endPage; pageNumber++) {
const page = await doc.getPage(pageNumber);
const textContent = await page.getTextContent(renderOptions);
let lastY, row = [];
const pageText = [];
for (const item of textContent.items) {
if (lastY !== item.transform[5]) {
row = [];
pageText.push(row);
lastY = item.transform[5];
}
item.str = item.str.replace(' ', '*');
row.push(item.str);
}
text.push(...pageText.map(row => row.join(columnSeparator)));
}
doc.destroy();
result.text = text.join(rowSeparator);
return result;
} catch (err) { logger.error(`Error while extracting pdf doc ${err} : File name ${file}`) }
}
export default pdfToText;
我尝试过不同版本的 pdfjs-dist 但不起作用,我无法使用较低的版本
此外,我正在使用 esbuild 来捆绑应用程序,因此我无法使用低于 3.11.174 的版本,它会引发画布错误
这就是 ChatGPT 的回答
您在使用
包时遇到的问题 Node.js 应用程序似乎与库的处理方式有关 PDF文本内容提取过程中的空格。这可以是一个 PDF 文本提取(作为文本表示)的常见问题 PDF 中的内容并不总是清晰地映射为纯文本,尤其是 关于间距。pdfjs-dist
鉴于您已经发现版本之间的行为变化
和2.11.338
的3.11.174
,有可能 图书馆文本提取逻辑的变化是否影响了 如何处理空格。pdfjs-dist
您可以采取以下几个步骤来尝试解决或解决问题 本期:
查看发行说明和文档:检查
的发行说明或文档以了解文本提取中的任何更改 您使用过的版本之间的行为。可能有注释 影响空间处理方式的更改或新选项。pdfjs-dist
调整渲染选项:您将
传递给renderOptions
,但不清楚您正在使用哪些选项。审查getTextContent
文档中的可用选项,看看是否 有任何可能影响空间处理。pdfjs-dist
对提取的文本进行后处理:如果库始终用单个空格替换多个空格,您可能会考虑 实施后处理步骤,您可以手动调整 间距根据您的具体需求而定。这可能涉及使用常规 表达式或其他字符串操作技术。
问题报告和社区支持:如果这看起来像是倒退或意外行为,请考虑在
GitHub 存储库。此外,社区论坛或 存储库的问题部分可能有与此相关的讨论 问题。pdfjs-dist
考虑替代库:如果由于此问题
无法满足您的要求,您可能需要探索 替代 PDF 解析库可以更有效地处理间距 满足您的需求。pdfjs-dist
esbuild 的版本约束:由于您使用的是 esbuild 并且对您可以使用的
版本有限制,因此您 可能需要查看 esbuild 是否有任何配置选项 或可以帮助解决您遇到的画布错误的插件 旧版本的pdfjs-dist
。pdfjs-dist
请记住,由于以下原因,PDF 文本提取本质上可能很棘手: PDF 中文本的表示方式,并不总是完美的保真度 可能,特别是对于复杂的布局或非标准文本 表示。