You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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支持检测文本的方向,还能返回每个文本块的边界框,方便精准筛选目标内容。步骤如下:

  1. 先在Google Cloud控制台启用Cloud Vision API并创建API密钥
  2. 修改代码调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 04:55:38