在nodejs应用程序中使用“pdfjs-dist”(pdfjs)包提取PDF文档时空间得到修剪

问题描述 投票:0回答:1

在将 pdf 文档提取为文本时,我遇到了一个问题,它删除了多余的空间并转换为单个空间附加了 pdf 文档图像以供参考 - enter image description here

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 的版本,它会引发画布错误

javascript node.js pdf.js esbuild pdfjs-dist
1个回答
0
投票

这就是 ChatGPT 的回答

您在使用

pdfjs-dist
包时遇到的问题 Node.js 应用程序似乎与库的处理方式有关 PDF文本内容提取过程中的空格。这可以是一个 PDF 文本提取(作为文本表示)的常见问题 PDF 中的内容并不总是清晰地映射为纯文本,尤其是 关于间距。

鉴于您已经发现版本之间的行为变化

2.11.338
3.11.174
pdfjs-dist
,有可能 图书馆文本提取逻辑的变化是否影响了 如何处理空格。

您可以采取以下几个步骤来尝试解决或解决问题 本期:

  1. 查看发行说明和文档:检查

    pdfjs-dist
    的发行说明或文档以了解文本提取中的任何更改 您使用过的版本之间的行为。可能有注释 影响空间处理方式的更改或新选项。

  2. 调整渲染选项:您将

    renderOptions
    传递给
    getTextContent
    ,但不清楚您正在使用哪些选项。审查
    pdfjs-dist
    文档中的可用选项,看看是否 有任何可能影响空间处理。

  3. 对提取的文本进行后处理:如果库始终用单个空格替换多个空格,您可能会考虑 实施后处理步骤,您可以手动调整 间距根据您的具体需求而定。这可能涉及使用常规 表达式或其他字符串操作技术。

  4. 问题报告和社区支持:如果这看起来像是倒退或意外行为,请考虑在

    pdfjs-dist
    GitHub 存储库。此外,社区论坛或 存储库的问题部分可能有与此相关的讨论 问题。

  5. 考虑替代库:如果由于此问题

    pdfjs-dist
    无法满足您的要求,您可能需要探索 替代 PDF 解析库可以更有效地处理间距 满足您的需求。

  6. esbuild 的版本约束:由于您使用的是 esbuild 并且对您可以使用的

    pdfjs-dist
    版本有限制,因此您 可能需要查看 esbuild 是否有任何配置选项 或可以帮助解决您遇到的画布错误的插件 旧版本的
    pdfjs-dist

请记住,由于以下原因,PDF 文本提取本质上可能很棘手: PDF 中文本的表示方式,并不总是完美的保真度 可能,特别是对于复杂的布局或非标准文本 表示。

© www.soinside.com 2019 - 2024. All rights reserved.