在Google AppScript中读取PDF表格竖列的OCR问题问询
解决Google OCR垂直文本提取混乱问题
我要处理的PDF结构为:顶部有一个大文本框,下方横向排列三个小文本框。第一个小文本框内是垂直排列的「a, b, c」,第二个是「a, 空格, b」,第三个是「a, c, 空格」。目标是提取第一个框里的「a, b, c」,但Google OCR按横向读取后,提取出的文本混乱成了「a, a, a, b, c, c, b」。当前使用的代码如下:
var blob = UrlFetchApp.fetch(url).getBlob() var resource = { title: blob.getName(), mimeType: blob.getContentType() } var docFile = Drive.Files.insert(resource, blob, options) var doc = DocumentApp.openById(docFile.id) var text = doc.getBody().getText()
以下是几种可行的解决方法:
方案1:用Google Cloud Vision API识别文本方向并定位目标块
Google Cloud Vision API支持检测文本的方向,还能返回每个文本块的边界框,方便精准筛选目标内容。步骤如下:
- 先在Google Cloud控制台启用Cloud Vision API并创建API密钥
- 修改代码调用API,指定文本方向提示并筛选目标块:
function extractVerticalText() { var url = "你的PDF链接"; var blob = UrlFetchApp.fetch(url).getBlob(); var apiKey = "你的Cloud Vision API密钥"; // 将PDF转换为单页图片(Vision API处理PDF需先转成图片) var imageResource = { title: "temp_ocr_image.png", mimeType: "image/png" }; var imageFile = Drive.Files.insert(imageResource, blob, {convert: true}); var imageBlob = DriveApp.getFileById(imageFile.id).getBlob(); // 构建Vision API请求体 var payload = { requests: [ { image: { content: Utilities.base64Encode(imageBlob.getBytes()) }, features: [{type: "DOCUMENT_TEXT_DETECTION", maxResults: 1}], imageContext: { textDetectionParams: { textOrientationHints: ["LEFT", "RIGHT"] // 指定垂直方向的文本提示 } } } ] }; // 发送请求并解析结果 var response = UrlFetchApp.fetch( `https://vision.googleapis.com/v1/images:annotate?key=${apiKey}`, { method: "POST", contentType: "application/json", payload: JSON.stringify(payload) } ); var result = JSON.parse(response.getContentText()); var textBlocks = result.responses[0].fullTextAnnotation.pages[0].blocks; // 根据边界框x坐标筛选左侧的第一个小文本框(需根据你的PDF调整阈值) var targetBlock = textBlocks.find(block => block.boundingBox.vertices[0].x < 150); var targetText = targetBlock.paragraphs .map(p => p.words.map(w => w.symbols.map(s => s.text).join('')).join(' ')) .join('\n'); Logger.log(targetText); // 输出a, b, c }
方案2:解析原生PDF的文本框结构(非扫描件适用)
如果你的PDF是原生生成的(非扫描图片),可以通过Drive API将其转为Google文档后,根据文本块的位置属性筛选目标内容:
function extractTargetTextBox() { var url = "你的PDF链接"; var blob = UrlFetchApp.fetch(url).getBlob(); var resource = { title: blob.getName(), mimeType: blob.getContentType() }; var docFile = Drive.Files.insert(resource, blob, {convert: true}); var doc = DocumentApp.openById(docFile.id); var body = doc.getBody(); var elements = body.getChildren(); var targetText = ""; // 遍历所有段落,根据左边距筛选左侧的文本框(调整阈值适配你的PDF) for (let i = 0; i < elements.length; i++) { const element = elements[i]; if (element.getType() === DocumentApp.ElementType.PARAGRAPH) { const leftMargin = element.getAttributes()[DocumentApp.Attribute.MARGIN_LEFT]; if (leftMargin && leftMargin < 100) { targetText += element.getText() + "\n"; } } } Logger.log(targetText.trim()); }
方案3:旋转图片后再OCR(扫描PDF适用)
如果是扫描生成的PDF,先将其转为图片,旋转90度让垂直文本变为横向,再用Google OCR读取,结果会更规整:
function rotateAndOCR() { var url = "你的PDF链接"; var blob = UrlFetchApp.fetch(url).getBlob(); // 转成图片文件 var imageResource = { title: "temp_scan_image.png", mimeType: "image/png" }; var imageFile = Drive.Files.insert(imageResource, blob, {convert: true}); var imageBlob = DriveApp.getFileById(imageFile.id).getBlob(); // 旋转图片90度(根据文本垂直方向调整为90/270) var rotatedImage = imageBlob.getAs("image/png").rotate(90); // 上传旋转后的图片并执行OCR var rotatedFile = Drive.Files.insert({title: "rotated_ocr.png"}, rotatedImage); var docFile = Drive.Files.insert({title: "ocr_result"}, rotatedFile.getBlob(), {ocr: true}); var doc = DocumentApp.openById(docFile.id); var fullText = doc.getBody().getText(); // 提取目标内容(此时文本为横向,可直接筛选) var targetText = fullText.split("\n").find(line => line.includes("a,") && line.includes("b,") && line.includes("c,")); Logger.log(targetText); }
内容的提问来源于stack exchange,提问作者Meowing
相关产品推荐
相关产品推荐

