从 Gmail 获取 pdf 附件作为文本

2024-05-10

我在网络和 Stack Overflow 上搜索但没有找到解决方案。我尝试做的事情如下:我通过邮件收到某些附件,我希望将其作为(纯)文本进行进一步处理。我的脚本如下所示:

function MyFunction() {

  var threads = GmailApp.search ('label:templabel'); 
  var messages = GmailApp.getMessagesForThreads(threads); 

   for (i = 0; i < messages.length; ++i)
   {
     j = messages[i].length; 
   var messageBody = messages[i][0].getBody(); 
   var messageSubject = messages [i][0].getSubject();
     var attach = messages [i][0].getAttachments();
     var attachcontent = attach.getContentAsString();
    GmailApp.sendEmail("mail", messageSubject, "", {htmlBody: attachcontent});
    }
}

不幸的是这不起作用。这里有人知道我该怎么做吗?有可能吗?

预先非常感谢您。

最好的,菲尔


Edit: Updated for DriveApp, as DocsList deprecated.


我建议将其分解为两个问题。第一个是如何从电子邮件中获取 pdf 附件,第二个是如何将 pdf 转换为文本。

正如你所发现的,getContentAsString()不会神奇地将 pdf 附件更改为纯文本或 html。我们需要做一些更复杂的事情。

首先,我们将获取附件Blob https://developers.google.com/apps-script/reference/base/blob,多个服务用来交换数据的实用程序类。

var blob = attachments[0].getAs(MimeType.PDF);

因此,第二个问题被分离出来,并保持我们只对标记为每个线程的第一条消息的第一个附件感兴趣的假设templabel,这是如何myFunction() looks:

/**
 * Get messages labeled 'templabel', and send myself the text contents of
 * pdf attachments in new emails.
 */
function myFunction() {

  var threads = GmailApp.search('label:templabel');
  var threadsMessages = GmailApp.getMessagesForThreads(threads);

  for (var thread = 0; thread < threadsMessages.length; ++thread) {
    var message = threadsMessages[thread][0];
    var messageBody = message.getBody();
    var messageSubject = message.getSubject();
    var attachments = message.getAttachments();

    var blob = attachments[0].getAs(MimeType.PDF);
    var filetext = pdfToText( blob, {keepTextfile: false} );

    GmailApp.sendEmail(Session.getActiveUser().getEmail(), messageSubject, filetext);
  }
}

我们依赖一个辅助函数,pdfToText(),转换我们的pdfblob转换为文本,然后我们将其作为纯文本电子邮件发送给自己。这个辅助函数有多种选项;通过设置keepTextfile: false,我们选择只将 PDF 文件的文本内容返回给我们,并且在我们的云端硬盘中不留下任何残留文件。

pdfToText()

该实用程序可用作为要点 https://gist.github.com/mogsdad/e6795e438615d252584f。那里提供了几个例子。

A 之前的回答 https://stackoverflow.com/questions/14406966/upload-pdf-with-ocr-with-google-apps-script-and-possibly-drive-api/14408321#14408321表明可以使用 Drive APIinsert执行方法OCR http://en.wikipedia.org/wiki/Optical_character_recognition,但没有提供代码详细信息。随着高级 Google 服务的推出,可以通过 Google Apps 脚本轻松访问 Drive API。您确实需要打开并启用Drive API来自编辑,根据Resources > Advanced Google Services.

pdfToText()使用 Drive 服务从 PDF 文件的内容生成 Google 文档。不幸的是,这包含文档中每个页面的“图片” - 我们对此无能为力。然后它使用常规的DocumentService将文档正文提取为纯文本。

/**
 * See gist: https://gist.github.com/mogsdad/e6795e438615d252584f
 *
 * Convert pdf file (blob) to a text file on Drive, using built-in OCR.
 * By default, the text file will be placed in the root folder, with the same
 * name as source pdf (but extension 'txt'). Options:
 *   keepPdf (boolean, default false)     Keep a copy of the original PDF file.
 *   keepGdoc (boolean, default false)    Keep a copy of the OCR Google Doc file.
 *   keepTextfile (boolean, default true) Keep a copy of the text file.
 *   path (string, default blank)         Folder path to store file(s) in.
 *   ocrLanguage (ISO 639-1 code)         Default 'en'.
 *   textResult (boolean, default false)  If true and keepTextfile true, return
 *                                        string of text content. If keepTextfile
 *                                        is false, text content is returned without
 *                                        regard to this option. Otherwise, return
 *                                        id of textfile.
 *
 * @param {blob}   pdfFile    Blob containing pdf file
 * @param {object} options    (Optional) Object specifying handling details
 *
 * @returns {string}          id of text file (default) or text content
 */
function pdfToText ( pdfFile, options ) {
  // Ensure Advanced Drive Service is enabled
  try {
    Drive.Files.list();
  }
  catch (e) {
    throw new Error( "To use pdfToText(), first enable 'Drive API' in Resources > Advanced Google Services." );
  }

  // Set default options
  options = options || {};
  options.keepTextfile = options.hasOwnProperty("keepTextfile") ? options.keepTextfile : true;

  // Prepare resource object for file creation
  var parents = [];
  if (options.path) {
    parents.push( getDriveFolderFromPath (options.path) );
  }
  var pdfName = pdfFile.getName();
  var resource = {
    title: pdfName,
    mimeType: pdfFile.getContentType(),
    parents: parents
  };

  // Save PDF to Drive, if requested
  if (options.keepPdf) {
    var file = Drive.Files.insert(resource, pdfFile);
  }

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

  // Get text from GDOC  
  var gdocDoc = DocumentApp.openById(gdocFile.id);
  var text = gdocDoc.getBody().getText();

  // We're done using the Gdoc. Unless requested to keepGdoc, delete it.
  if (!options.keepGdoc) {
    Drive.Files.remove(gdocFile.id);
  }

  // Save text file, if requested
  if (options.keepTextfile) {
    resource.title = pdfName.replace(/pdf$/, 'txt');
    resource.mimeType = MimeType.PLAIN_TEXT;

    var textBlob = Utilities.newBlob(text, MimeType.PLAIN_TEXT, resource.title);
    var textFile = Drive.Files.insert(resource, textBlob);
  }

  // Return result of conversion
  if (!options.keepTextfile || options.textResult) {
    return text;
  }
  else {
    return textFile.id
  }
}

转换为 DriveApp 有助于此布鲁斯·麦克弗森的实用程序 http://ramblings.mcpher.com/Home/excelquirks/gooscript/driveapppathfolder:

// From: http://ramblings.mcpher.com/Home/excelquirks/gooscript/driveapppathfolder
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()); 
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Gmail 获取 pdf 附件作为文本 的相关文章

  • Apache PDFBox:将最后一页移动到首页

    我正在使用 Apache PDFBox 编写一个简单的 Java 应用程序 我有几个 PDF 其中最后一页是前几页内容的索引 我需要索引 最后一页 成为PDF文件的第一页 是否可以 我还发现了http itextpdf com http i
  • 清除内容并从另一张纸复制

    我编写了一个脚本 旨在清除 Google Sheets 电子表格的内容并复制并粘贴另一个工作表的内容 需要清除的工作表称为 NEW SHEET 要复制的工作表称为 Database 由于某种原因 该脚本目前无法运行 当我运行它时什么也没有发
  • 使用 ApacheFOP 从 Java 中的 XML 生成 PDF

    我正在尝试从 Java 对象生成即时 PDF 报告 我找不到很多这方面的例子 所以我一直在关注这个例子 http svn apache org viewvc xmlgraphics fop trunk examples embedding
  • 如何从文本视图制作多页 PDF?

    我从 iPhone 应用程序生成了一个 PDF 文件 虽然大多数文档只有一页 但我希望能够检测文本是否超出 边距 如果是 则将其添加到下一页 我对此很陌生 所以不太确定如何做到这一点 下面是代码 有什么建议么 void drawBorder
  • 打开 PDF 到书签/指定目标?

    我正在尝试使用 python 打开特定书签的 PDF 到目前为止 我可以在命令提示符中运行以下命令并得到我想要的 last是 PDF test pdf 中指定目的地的名称 C Program Files x86 Adobe Reader 1
  • 如何使用 google Sheet 作为数据库

    如何在 HTML Web 应用程序中生成 Google 工作表数据 并允许用户从 HTML Web 应用程序更新评论 我在谷歌表中有一些数据 通过谷歌表单提交 我想使用搜索按钮根据 请求编号 从网络应用程序搜索工作表数据 应该能够更新网络应
  • UIDocumentInteractionController 显示空白 pdf

    我尝试使用 UIDocumentInteractionController PresentPreviewAnimated 方法在 iOS 设备上显示 pdf 但它一直显示空白文档 我认为这可能与字符编码有关 但我不确定 如果我使用 UIWe
  • 从图像创建 PDF 时设置文档名称

    我使用以下代码从 jpg 图像创建 pdf im new Imagick im gt readImage image jpg im gt setImageFormat pdf im gt writeImage images pdf imag
  • 将 html 转换为 pdf 时防止表格单元格跨页破坏

    使用 Google Apps 脚本 我有一个 html 模板 我填写该模板 然后以 pdf 形式发送 通过传真和 或电子邮件 该模板包括一个带有问题 答案的两列表格 如果行数足够多 表格会在pdf中跨页分页 并且分页符通常发生在单元格的中间
  • TCPDF UTF-8 符号未显示

    我使用最新的 TCPDF 版本 5 9 但在编码方面遇到一些奇怪的问题 我需要立陶宛语语言符号 例如 但只能得到其中的一小部分 其他的还是这样 所以我该怎么做 我使用默认的 times 字体 它带有 TCPDF 下载 任何帮助 将不胜感激
  • 使用 apache PDF-Box 插入 PDF 附件的缩略图

    我有一个代码可以将文件附加到 PDF 文件 PDDocument doc new PDDocument PDPage page new PDPage doc addPage page read attachment file File fi
  • .NET“默认行终止符”?

    有什么方法可以弄清楚 NET 使用什么作为其 默认行终止符 例如 StringBuilder AppendLine String 的文档表示 附加指定字符串的副本 后跟默认行终止符 NET 中的几个与文本相关的类引用相同的概念 有什么方法可
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • 对于只触及我的工作表的 Google 表格脚本,收到“此应用程序未经验证”

    我正在编写一个 Google Sheets 脚本 我只想访问与 gs 文件关联的同一电子表格中的数据 似乎我应该有权在自己的电子表格中运行脚本 但是每当我运行一个函数时 我都会得到一个This app isn t verified信息 我该
  • libgdx 贴花动态文本

    我正在 Libgdx 中开发 3D 2 5D 应用程序 我发现贴花对于此目的非常有用 在我的应用程序中应该有包含动态文本的图层 现在我想知道通过贴花绘制文本的最佳方法是什么 目前我的实现是基于将 BitmapFont 绘制到 FBO 然后在
  • Google 政策更新后不允许仅使用用户名和密码,如何使用 python 发送电子邮件?

    我正在尝试学习如何使用 python 发送电子邮件 我读过的所有网络教程都解释了如何使用 Gmail 进行操作 但是 从 2022 年 5 月 30 日起 尽管每个人都可以自由地使用自己的帐户做任何他想做的事情 Google 制定了一项新政
  • 如何使用 Google 文档附加脚本查看旧版本的代码

    我制作了一个可在 05 21 运行的附加组件 从那时到现在的某个时刻 它破裂了 旧代码不再出现在修订历史中 只能追溯到 05 22 我测试过version 1 并且它有效 这意味着它使用了正确的代码 我可以运行这个工作版本 但我不知道如何重
  • 使用 Hive 计算文本变量的单词频率

    我有一个变量 每一行都是一个句子 例子 Row1 Hey how are you Rwo2 Hey Who is there 我希望输出是按单词分组的计数 Example Hey 2 How 1 are 1 我正在使用 split a bi
  • 如何减少导航图标和工具栏标题之间​​的差距?

    我的问题是导航抽屉图标和工具栏标题之间 有多余的空间 示例图像如下 工具栏的xml视图是
  • gmail 不断阻止 PHPmailer 登录

    我将在接下来的 8 小时内部署一个网站 而 Gmail 刚刚停止接受 PHPmailer 登录我的帐户 起初 它在测试过程中工作了几个小时 然后 它就停止工作了 我已经允许所有允许不太安全的应用程序从 gmail 登录 但它仍然不允许 ph

随机推荐