如何使用 Apps 脚本访问 Google Drive 上受密码保护的 PDF 文件

How to access a password protected PDF file on Google Drive using Apps Script

我每个月都会通过电子邮件收到一份账单,该账单是受密码保护的 PDF 文件。该文件始终具有相同的密码。我最终尝试使用 Google Apps Scripts(和 Drive API)从 Gmail 中获取文件,使用 OCR 将其保存到我的云端硬盘,然后将其保存到我可以使用的单独文档中来自的文本并在我的脚本中进一步使用它。

我在这里简化了我的用例,只是试图将文件保存到驱动器并通过脚本访问它,但我无法以编程方式访问它,因为似乎没有办法传递密码.

for (var x in threads) {      
  var messages = threads[x].getMessages();
  for (var y in messages) {
  var from = messages[y].getFrom().slice(messages[y].getFrom().indexOf('<')+1, messages[y].getFrom().indexOf('>'));          
  if (from == 'EMAIL-GOES-HERE') {
    var attachment = messages[y].getAttachments()[0];
    var blob = attachment.getAs(MimeType.PDF);
    var resource = {title: blob.getName(), mimeType: blob.getContentType()};
    var file = Drive.Files.insert(resource, blob);
    var doc = DocumentApp.openById(file.id);
    ...

我希望能够通过传递已知密码来访问该文件;但是,由于我无法发送密码,因此收到错误消息:"The document is inaccessible. Please try again later."

  • 您想使用 Google Apps 脚本用密码解密受保护的 PDF 文件。
  • 您可以使用外部API。

如果我的理解是正确的,这个答案怎么样?

问题:

遗憾的是,在目前阶段,Google Apps Script 没有现成的方法来打开受密码保护的PDF。我评论了这个。

解决方法:

在这里,作为几种解决方法之一,我想建议使用外部 API 进行解密。因为通过 Google Apps Script 分析加密文件会导致更高的处理成本。所以我想建议使用PDF to DECRYPT API of ConvertAPI。在这种情况下,此变通办法的处理成本远低于仅使用 Google Apps 脚本的变通办法。

准备:

例如,当您尝试此操作时,您也可以使用 "Free Package" 进行测试。当您在 ConvertAPI 尝试使用 "Free Package" 时,请在 "Free Package" 注册并取回您的密钥。

示例脚本:

在你运行脚本之前,请设置secretkeypass的变量。

function myFunction() {
  var obj = {
    secretkey: "###",  // Your secret key.
    pass: "###", // Password of the protected PDF file.
    blob: blob, // blob of var blob = attachment.getAs(MimeType.PDF);
  }
  var blob = decrypting(obj);

  DriveApp.createFile(blob);
}

function decrypting(obj) {
  var url = "https://v2.convertapi.com/convert/pdf/to/decrypt?Secret=" + obj.secretkey;
  var options = {
    method: "post",
    payload: {File: obj.blob, PdfOwnerPassword: obj.pass},
  }
  var res = UrlFetchApp.fetch(url, options);
  res = JSON.parse(res.getContentText());
  var blob = res.Files.map(function(e) {return Utilities.newBlob(Utilities.base64Decode(e.FileData), MimeType.PDF, e.FileName)});
  return blob[0];
}

注:

  • 当您 运行 myFunction() 设置变量后,未受保护的 PDF 将创建到根文件夹。
  • 当您将此脚本用于您的脚本时,作为一种方法,请修改如下。

    for (var x in threads) {
      var messages = threads[x].getMessages();
      for (var y in messages) {
      var from = messages[y].getFrom().slice(messages[y].getFrom().indexOf('<')+1, messages[y].getFrom().indexOf('>'));          
      if (from == 'EMAIL-GOES-HERE') {
        var attachment = messages[y].getAttachments()[0];
        var blob = attachment.getAs(MimeType.PDF);
    
        // Added
        var obj = {
          secretkey: "###",  // Your secret key.
          pass: "###", // Password of the protected PDF file.
          blob: blob, // blob of var blob = attachment.getAs(MimeType.PDF);
        }
        blob = decrypting(obj);
        // Added
    
        var resource = {title: blob.getName(), mimeType: blob.getContentType()};
        var file = Drive.Files.insert(resource, blob);
        var doc = DocumentApp.openById(file.id);
        ...
    

参考文献: