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
相关产品推荐
相关产品推荐

