文本提取
- 福昕 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 直接得到整段字符串。
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。调用前需具备文档的提取权限。
提取单页文本
const page = await pdfDoc.getPageByIndex(0);
const text = await page.getText();
console.log(text);
需要按换行、最小宽度等选项做结构化换行时,可使用 PDFPage.getTexts()(参数见 API 说明)。
提取指定区域文本
PDFPage.getTextInRect(rect, type) 用于提取 PDF 坐标矩形内的文本。可选参数 type:0 同时返回页面文本与表单域文本、1 仅页面文本、2 仅表单域文本,默认 0。
返回值形如 { pageText, fieldsText }(fieldsText 为域内文本条目数组),不是纯字符串。
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 取精确矩形)。
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 }[]):
const charRange = await page.getCharRange({
left: 100,
right: 300,
top: 720,
bottom: 680
});
在给定 PDF 坐标点附近解析字符时,可使用 PDFPage.getCharInfoAtPoint(point, tolerance),point 为 [x, y],tolerance 为容差(例如 0~30)。
注意事项
- 页面索引从
0开始。 - 文本提取结果取决于 PDF 中是否包含可解析文本;扫描件通常需要 OCR 后才能获得可提取文本。
- 区域取词与字符几何均使用 PDF 坐标,和截图、页面渲染使用的 device pixels 不同。
- 批量提取大文档文本时,建议按页或按页段处理;
PDFDoc.getText()适合大文档时分段监听进度。 - 字符与区域相关接口同样需要提取或提取无障碍等相应权限(与实现一致)。