如何通过Google Cloud Vision API区分PDF中的打印与手写文本?
区分Google Cloud Vision API返回的打印文本与手写文本
核心方案:利用Vision API的手写检测属性
Google Cloud Vision API的异步PDF批量处理接口(asyncBatchAnnotateFiles)返回的结果中,每个文本块(Block)的property字段会包含手写检测标记。通过解析这个字段可以精准区分打印与手写文本,这是最可靠的原生方案。
Node.js实现步骤:
- 调用异步PDF处理接口时,请求需包含
DOCUMENT_TEXT_DETECTION特征(默认已启用布局分析)。 - 处理响应时,遍历每个页面的
textAnnotations下的blocks数组,检查每个Block的property.detectedHandwriting属性:- 若该属性存在且值为
true,则为手写文本 - 否则为打印文本
- 若该属性存在且值为
代码示例:
const { ImageAnnotatorClient } = require('@google-cloud/vision').v1; const client = new ImageAnnotatorClient(); async function processPdf(pdfPath) { const request = { requests: [ { inputConfig: { mimeType: 'application/pdf', gcsSource: { uri: `gs://your-bucket/${pdfPath}` }, // 需将PDF上传至GCS存储桶 }, features: [{ type: 'DOCUMENT_TEXT_DETECTION' }], outputConfig: { gcsDestination: { uri: `gs://your-bucket/output/` }, }, }, ], }; const [operation] = await client.asyncBatchAnnotateFiles(request); const [response] = await operation.promise(); // 遍历每页结果 response.responses.forEach((pageResponse, pageIndex) => { console.log(`第${pageIndex + 1}页结果:`); pageResponse.fullTextAnnotation.pages.forEach(page => { page.blocks.forEach(block => { const isHandwritten = block.property?.detectedHandwriting?.value === true; // 拼接文本块内容 const text = block.paragraphs .map(p => p.words.map(w => w.symbols.map(s => s.text).join('')).join(' ')) .join('\n'); console.log(`文本类型:${isHandwritten ? '手写' : '打印'}`); console.log(`内容:${text}\n`); }); }); }); } processPdf('your-document.pdf').catch(console.error);
辅助方案:结合页面位置过滤
针对你的PDF有固定页眉页脚的场景,可以结合文本块的坐标范围进一步验证:
- 预先定义页眉页脚的坐标区间(比如页面顶部10%、底部10%区域)
- 落在该区间的文本直接判定为打印文本;中间区域的文本再结合手写检测属性确认,减少误判概率
注意事项
- 必须使用异步批量处理接口(
asyncBatchAnnotateFiles),同步的documentTextDetection接口不返回手写检测属性 - 需将PDF文件上传至Google Cloud Storage(GCS),API不支持直接上传本地PDF文件
内容的提问来源于stack exchange,提问作者Lakshay Nagpal
相关产品推荐
相关产品推荐

