gpt4 book ai didi

pdf.js - PDFJS 在转换为文本的 pdf 表单上丢失复选标记

转载 作者:行者123 更新时间:2023-12-05 04:19:43 26 4
gpt4 key购买 nike

我一直在使用这些帖子的代码改编版:

PDF to Text extractor in nodejs without OS dependencies

pdfjs: get raw text from pdf with correct newline/withespace

将 pdf 转换为文本:

import pdfjsLib from 'pdfjs-dist/legacy/build/pdf.js';

import {
TextItem,
DocumentInitParameters,
} from 'pdfjs-dist/types/src/display/api';

const getPageText = async (pdf: pdfjsLib.PDFDocumentProxy, pageNo: number) => {
const page = await pdf.getPage(pageNo);
const tokenizedText = await page.getTextContent();
var textItems = tokenizedText.items;
var finalString = '';
var line = 0;

// Concatenate the string of the item to the final string
for (var i = 0; i < textItems.length; i++) {
if (line != (textItems[i] as TextItem).transform[5]) {
if (line != 0) {
finalString += '\r\n';
}

line = (textItems[i] as TextItem).transform[5];
}
var item = textItems[i];

finalString += (item as TextItem).str;
}
return finalString;
};

export const getPDFText = async (
data: string,
password: string | undefined = undefined
) => {
const initParams: DocumentInitParameters = {
data: Buffer.from(data, 'base64'),
//useSystemFonts: true,
//disableFontFace: false,
standardFontDataUrl: 'standard_fonts/'
};

if (password !== undefined) {
initParams.password = password;
}

const pdf = await pdfjsLib.getDocument(initParams).promise;
const maxPages = pdf.numPages;
const pageTextPromises = [];
for (let pageNo = 1; pageNo <= maxPages; pageNo += 1) {
pageTextPromises.push(getPageText(pdf, pageNo));
}
const pageTexts = await Promise.all(pageTextPromises);
const joined = pageTexts.join(' ');
return joined;
};

在 pdfjs-dist 的 3.1.81 版本中,这看起来很不错,但是表单字段上的复选框丢失了,文本字段的值显示在每个页面的末尾,而不是保留在上下文中。我觉得这个页面:https://pdftotext.com/基于与我的输出的相似性使用 pdfjs,但他们在方框上打勾,他们的文本字段“答案”由问题决定。

运行:

import { join } from 'path';
import { readFileSync } from 'fs';

const rawContents = readFileSync(join('directory', 'file.pdf'), 'base64');

const pdfText = await getPDFText(rawContents as string);

有人知道我为什么会丢失支票(盒子在那里)吗?

我得到的示例:

22. when something something?
☐ 0-3 months ago
☐ 4-6 months ago
☐ 7-12 months ago
☐ 13-18 months ago
☐ 19-24 months ago
☐ 25-60 months ago
☐ I don't know

这是该网页获得的内容:

22. when something something?

✔ 0-3 months ago

☐ 4-6 months ago

☐ 7-12 months ago

☐ 13-18 months ago

☐ 19-24 months ago

☐ 25-60 months ago

☐ I don’t know

同样,我的输出看起来像他们的,但丢失了这些检查。我不确定他们使用 pdfjs,但我认为他们使用。

请注意,我已经在 standard_fonts 目录中下载了一些字体。即使没有看到警告消息,我是否也应该复制它们?

最佳答案

在表单中,复选框是一个字段边界,不是任何附近文本的一部分(所有字段都是如此,它们不直接与其描述相关),它们只有一个名称和值,这里放置了复选框 1 和 Box2,而 Box3 是等待表面外观。

请特别注意,它们并不是固定的外观,它们在展示时会变形,它们是嵌合体,看起来就像存在一样。

enter image description here

在这些 AcroForm 案例中,它们没有原生的纯文本等价物,没有任何东西可以检测到索引只是指向页面坐标。

PDF.js 是一个 PDF2HTML 转换器,因此可以轻松实现!将这些索引区域显示为 html 字段,
注意它是一个 X

enter image description here

就 PDF 可提取表面而言,没有文本,我们可以看到上方和下方的框只有那些单选框旁边的描述

注意它是一个滴答声除了显示器(查看器)外没有什么不同

enter image description here

如果我们尝试使用 PDF.js(在浏览器中)提取文本,我们只会得到文本

enter image description here

在某些情况下,Symbol 或 ZapfDingbats native 字体或其他带有这些代码点的 TTF 已被嵌入并适应状态,可能会得到一个字体复选标记符号,但这种情况很少见,除非特别设计。

☐ 如您所见,然后用一个替换
☑ 正在从字体中选择正确的一个并添加为
☒ 更换不是很容易但可行。

关于pdf.js - PDFJS 在转换为文本的 pdf 表单上丢失复选标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74736754/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com