[英]PDFJS losing check marks on pdf forms that are converted to text
我一直在使用這些帖子的代碼改編版:
PDF 到沒有操作系統依賴性的 nodejs 中的文本提取器
將 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/基於與我的 output 的相似性使用 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
同樣,我的 output 看起來像他們的,但丟失了這些支票。 我不確定他們使用 pdfjs,但我認為他們使用。
請注意,我已經在 standard_fonts 目錄中下載了一對 fonts。 即使我沒有看到警告消息,我是否應該全部復制它們?
在表單中,復選框是一個字段邊界,不是任何附近文本的一部分(所有字段都是如此,它們不直接與其描述相關),它們只有一個名稱和值,這里放置了復選框 1 和 Box2,而 Box3 正在等待表面外觀.
請特別注意,它們的外觀不是固定的,它們在顯示時會變形,它們是嵌合體,看起來就像它們存在一樣。
在這些 AcroForm 案例中,它們沒有原生的純文本等價物,沒有什么可以檢測到索引只是指向頁面坐標。
PDF.js 是一個 PDF2HTML 轉換器,因此可以輕松地將這些索引區域顯示為 html 字段,
注意它的 AN X
就 PDF 可提取表面而言,沒有文本,我們可以看到上方和下方的框只有那些單選框旁邊的描述
注意它是一個勾號,除了顯示器(查看器)外沒有什么不同
如果我們嘗試使用 PDF.js(在瀏覽器中)提取文本,我們只會得到文本
在某些情況下,Symbol 或 ZapfDingbats 本機字體或其他帶有這些代碼點的 TTF 已被嵌入並適應狀態,可能會得到一個字體復選標記符號,但這種情況很少見,除非特別設計。
☐ 如您所見,然后用一個替換
☑ 從字體中選擇正確的並添加為
☒ 更換不是很容易但可行。
對於其他人來說:
https://formulae.brew.sh/formula/poppler
這包括獲取復選標記的pdftotext
命令
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.