簡體   English   中英

PDFJS 在轉換為文本的 pdf forms 上丟失復選標記

[英]PDFJS losing check marks on pdf forms that are converted to text

我一直在使用這些帖子的代碼改編版:

PDF 到沒有操作系統依賴性的 nodejs 中的文本提取器

pdfjs:使用正確的換行符/空格從 pdf 獲取原始文本

將 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM