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

Gscript PDF转文本OCR工具波兰字符识别异常求助

解决方案

1. 调整OCR语言参数

Drive API的ocrLanguage参数在部分场景下更兼容ISO 639-2代码,波兰语的ISO 639-2代码为pol,替换原代码中的'pl':

var insertOpts = {
  ocr: true,
  ocrLanguage: options.ocrLanguage || 'pol'
}

2. 明确文本Blob的UTF-8编码

创建文本Blob时指定UTF-8编码,避免波兰字符因编码问题丢失:

var textBlob = Utilities.newBlob(text, MimeType.PLAIN_TEXT + ";charset=utf-8", resource.title);

3. 优化文本提取方式

替换直接调用getText()的方式,改为遍历段落获取文本,避免潜在的字符截断问题:

// 替换原文本提取代码
var text = "";
var paragraphs = gdocDoc.getBody().getParagraphs();
for (var i = 0; i < paragraphs.length; i++) {
  text += paragraphs[i].getText() + "\n";
}

4. 验证Drive API状态

重新在Google Apps Script的「资源 > 高级Google服务」中禁用并重新启用Drive API,确保服务权限和版本正常。


完整修改后的代码

/**
 * 将PDF文件(blob)转换为Drive上的文本文件,使用内置OCR。
 * 默认情况下,文本文件将放在根文件夹中,名称与源PDF相同(但扩展名为'txt')。选项:
 *   keepPdf (布尔值,默认false)     保留原始PDF文件的副本。
 *   keepGdoc (布尔值,默认false)    保留OCR生成的Google Doc文件副本。
 *   keepTextfile (布尔值,默认true) 保留文本文件副本。
 *   path (字符串,默认空)         文件存储的文件夹路径。
 *   ocrLanguage (ISO 639-1/2代码)         默认'en'。
 *   textResult (布尔值,默认false)  如果为true且keepTextfile为true,返回文本内容字符串。
 *                                  如果keepTextfile为false,则无论此选项如何都返回文本内容。
 *                                  否则,返回文本文件的ID。
 *
 * @param {blob}   pdfFile    包含PDF文件的Blob
 * @param {object} options    (可选) 指定处理细节的对象
 *
 * @returns {string}          文本文件的ID(默认)或文本内容
 */
function pdfToText(pdfFile, options) {
  // 确保高级Drive服务已启用
  try {
    Drive.Files.list();
  } catch (e) {
    throw new Error("要使用pdfToText(),请先在「资源 > 高级Google服务」中启用「Drive API」。");
  }

  // 设置默认选项
  options = options || {};
  options.keepTextfile = options.hasOwnProperty("keepTextfile") ? options.keepTextfile : true;

  // 准备文件创建的资源对象
  var parents = [];
  if (options.path) {
    parents.push(getDriveFolderFromPath(options.path));
  }
  var pdfName = pdfFile.getName();
  var resource = {
    title: pdfName,
    mimeType: pdfFile.getContentType(),
    parents: parents
  };

  // 如果请求,保存PDF到Drive
  if (options.keepPdf) {
    var file = Drive.Files.insert(resource, pdfFile);
  }

  Logger.log(resource);

  // 将PDF保存为GDOC
  resource.title = pdfName.replace(/pdf$/, 'gdoc');
  var insertOpts = {
    ocr: true,
    ocrLanguage: options.ocrLanguage || 'pol'
  };
  var gdocFile = Drive.Files.insert(resource, pdfFile, insertOpts);

  // 从GDOC获取文本
  var gdocDoc = DocumentApp.openById(gdocFile.id);
  var text = "";
  var paragraphs = gdocDoc.getBody().getParagraphs();
  for (var i = 0; i < paragraphs.length; i++) {
    text += paragraphs[i].getText() + "\n";
  }

  Logger.log(text);

  // 完成GDOC使用,除非请求保留,否则删除
  if (!options.keepGdoc) {
    Drive.Files.remove(gdocFile.id);
  }

  // 如果请求,保存文本文件
  if (options.keepTextfile) {
    resource.title = pdfName.replace(/pdf$/, 'txt');
    resource.mimeType = MimeType.PLAIN_TEXT;

    var textBlob = Utilities.newBlob(text, MimeType.PLAIN_TEXT + ";charset=utf-8", resource.title);
    var textFile = Drive.Files.insert(resource, textBlob);
  }

  // 返回转换结果
  if (!options.keepTextfile || options.textResult) {
    return text;
  } else {
    return textFile.id;
  }
}

// 辅助工具
function getDriveFolderFromPath(path) {
  return (path || "/").split("/").reduce(function(prev, current) {
    if (prev && current) {
      var fldrs = prev.getFoldersByName(current);
      return fldrs.hasNext() ? fldrs.next() : null;
    } else {
      return current ? null : prev;
    }
  }, DriveApp.getRootFolder());
}

内容的提问来源于stack exchange,提问作者Krzysztof B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 21:05:16