Skip to content

文本提取

  • 福昕 PDF SDK(Web)支持提取文档文本、单页文本、指定区域文本,并可按字符索引读取文本信息。相关接口包括:
  • PDFDoc.getText()
  • PDFPage.getText()
  • PDFPage.getTextInRect()
  • PDFPage.getCharCount()
  • PDFPage.getCharInfoByIndex()
  • PDFPage.getCharRange()
  • PDFPage.getCharInfoAtPoint()

关键字在文档中查找并得到匹配矩形时,应使用 文本搜索 中的 PDFDoc.searchText()getTextSearch();本文面向顺序读出文本框选取词字符级几何信息

文本提取适合用于内容分析、校对定位、区域取词、批量处理,或与业务系统进行文本数据同步。

提取文档文本

PDFDoc.getText(pages) 用于在指定页面范围内提取文本。调用后返回 TaskProgress,通过 onProgress 接收进度与分段文本(具体字段以运行时回调为准),而不是 await 直接得到整段字符串。

javascript
const pdfDoc = pdfViewer.getCurrentPDFDoc();
const progress = pdfDoc.getText([[0, 2]]);
const removeListener = progress.onProgress((data) => {
    console.log(data.percent);
    if (data.content !== undefined) {
        console.log(data.content);
    }
});
// 提取结束后取消监听并视需要结束任务
removeListener();

提示

PDFDoc.getText() 不支持 XFA 文档(与实现一致,会在 XFA 上抛错)。如果需要处理 XFA 表单,请参考表单相关 API。调用前需具备文档的提取权限。

提取单页文本

javascript
const page = await pdfDoc.getPageByIndex(0);
const text = await page.getText();

console.log(text);

需要按换行、最小宽度等选项做结构化换行时,可使用 PDFPage.getTexts()(参数见 API 说明)。

提取指定区域文本

PDFPage.getTextInRect(rect, type) 用于提取 PDF 坐标矩形内的文本。可选参数 type0 同时返回页面文本与表单域文本、1 仅页面文本、2 仅表单域文本,默认 0

返回值形如 { pageText, fieldsText }fieldsText 为域内文本条目数组),不是纯字符串。

javascript
const page = await pdfDoc.getPageByIndex(0);

const { pageText, fieldsText } = await page.getTextInRect({
    left: 100,
    right: 300,
    top: 720,
    bottom: 680
}, 0);

注意

  • getTextInRect() 使用 PDF 坐标,与 Viewer 的 device pixels 不同;与 密文脱敏markRedactAnnot 所用坐标系一致。
  • Static XFA 上会抛错(与 PDFDoc.getText() 的 XFA 限制类似)。
  • 需要文档提取权限。

按字符索引读取文本信息

从 11.1.0 起,PDFPage 提供字符级索引能力,适合校对、批注锚点、以及与 文本搜索TextSearchMatch 的字符下标配合使用(例如搜索命中后再 getCharInfoByIndex 取精确矩形)。

javascript
const page = await pdfDoc.getPageByIndex(0);
const charCount = await page.getCharCount();

for (let i = 0; i < charCount; i++) {
    const charInfo = await page.getCharInfoByIndex(i);
    console.log(charInfo);
}

也可以通过区域获取字符下标区间列表({ start, end }[]):

javascript
const charRange = await page.getCharRange({
    left: 100,
    right: 300,
    top: 720,
    bottom: 680
});

在给定 PDF 坐标点附近解析字符时,可使用 PDFPage.getCharInfoAtPoint(point, tolerance)point[x, y]tolerance 为容差(例如 030)。

注意事项

  • 页面索引从 0 开始。
  • 文本提取结果取决于 PDF 中是否包含可解析文本;扫描件通常需要 OCR 后才能获得可提取文本。
  • 区域取词与字符几何均使用 PDF 坐标,和截图、页面渲染使用的 device pixels 不同。
  • 批量提取大文档文本时,建议按页或按页段处理;PDFDoc.getText() 适合大文档时分段监听进度。
  • 字符与区域相关接口同样需要提取提取无障碍等相应权限(与实现一致)。