【问题标题】:Using Google Apps Script, how can I download each presentation slide as a pdf?使用 Google Apps 脚本,如何将每张演示文稿幻灯片下载为 pdf 格式?
【发布时间】:2019-10-17 15:26:15
【问题描述】:

我对此有点陌生,因此对于任何与 newb 相关的烦恼,我提前道歉。

我要做的是创建一个包含各种图像的谷歌演示文稿,然后将每张幻灯片下载为单独的 pdf。我在下载为 pdf 部分时遇到了麻烦。演示文稿正在正确构建。我尝试了几种不同的方法,但还没有找到可行的解决方案。我试过的最简单的是:

var newFolder=rootFolder.createFolder(sourceSpreadsheet.getName() + ' - Functionals').setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);  
var deck = SlidesApp.create(NAME);  // name determined separately
var presentationID = deck.getId();

...

var blob = DriveApp.getFileById(presentationID).getBlob();
newFolder.createFile(blob);

这确实创建了一个 pdf,但看起来它只是一个空白页。我不确定它是否需要单独在每张幻灯片上运行,而不是在整个演示文稿上运行。不过,我找不到任何可以表明这种情况的东西。

我尝试的第二件事是基于我为电子表格找到的类似解决方案。我真的不明白更改 URL 是如何将其下载为 pdf 的,这可能与它的问题有关,这会导致 404。

var presentation = SlidesApp.openById(presentationID);
var url = presentation.getUrl();
url = url.replace(/edit$/,'');
var url_ext = 'export?exportFormat=pdf&format=pdf' + '&muteHttpExceptions=true' //export as pdf
var response = UrlFetchApp.fetch(url + url_ext, {
                                   headers: {
                                   'Authorization': 'Bearer ' +  token
                                   }
                                   });

【问题讨论】:

    标签: javascript pdf google-apps-script google-slides


    【解决方案1】:

    我使用第二种方法来创建 Google 表格的 pdf。

    以下功能可用于创建幻灯片的 pdf。这使用了 REST API,因此您需要根据您希望格式化 pdf 的方式使用参数构造 URL。

    您的格式化网址需要如下所示:https://docs.google.com/presentation/d/****presentationId****/export?exportFormat=pdf&format=pdf

    您可以在此函数中找到其他用于格式化 pdf 的可选参数。

    function exportPDF(fileId) {
      var ss = SpreadsheetApp.openById(fileId);  
      // Base URL
      var url = "https://docs.google.com/spreadsheets/d/SS_ID/export?".replace("SS_ID", ss.getId());
      /* Specify PDF export parameters
      From: https://code.google.com/p/google-apps-script-issues/issues/detail?id=3579
            https://stackoverflow.com/questions/46088042/margins-parameters-for-spreadsheet-export
      */
    
      var url_ext = 'exportFormat=pdf&format=pdf'        // export as pdf / csv / xls / xlsx
      + '&size=letter'                       // paper size legal / letter / A4
      + '&portrait=true'                    // orientation, false for landscape
      + '&fitw=true&source=labnol'                          // fit to page width, false for actual size
      + '&top_margin=0.25'              //All four margins must be set!
      +'&bottom_margin=0.25'           //All four margins must be set!
      +'&left_margin=0.25'             //All four margins must be set!
      +'&right_margin=0.25'            //All four margins must be set!
      + '&sheetnames=false&printtitle=false' // hide optional headers and footers
      + '&pagenumbers=false&gridlines=false' // hide page numbers and gridlines
      + '&fzr=true'                         // do not repeat row headers (frozen rows) on each page
      + '&gid=';                             // the sheet's Id
    
      var token = ScriptApp.getOAuthToken();
      var sheet = ss.getSheets()[0]; //get first sheet
    
      // Converts to PDF
      var response = UrlFetchApp.fetch(url + url_ext + sheet.getSheetId(), {
          headers: {
            'Authorization': 'Bearer ' +  token
          }
        });
    
      //convert the response to a blob and store in our array
      var blob = response.getBlob().setName(sheet.getName() + '.pdf');
      var folderId = '**********your folder id here*******************';
      var folder = DriveApp.getFolderById(folderId);
      return folder.createFile(blob).getId();
    }
    

    【讨论】:

    • 感谢您的帮助!不幸的是,即使更新了 URL,我仍然遇到 404 错误。我不确定为什么。我包括了除了 &fzr=true 之外的所有可选参数,因为演示文稿没有行标题。我记录了 url,当我粘贴到浏览器中时,它给了我一个找不到页面的错误,但是如果我删除所有额外的参数,它会按我的预期打开幻灯片。我不确定浏览器是否会接受参数,所以也许这是预期的?
    • 如果有帮助,这就是它专门记录为 url + url_ext + id:docs.google.com/presentation/d/…
    【解决方案2】:

    将演示文稿中的所有幻灯片转换为单独的 pdf 文件

    function convertingSlideImagesToPDF() {
      var fldr=DriveApp.getFolderById("FolderID");
      var ss=SlidesApp.openById("PresentationID");
      var slds=ss.getSlides();
      var n=0;
      for(var i=0;i<slds.length;i++) {
        var sldImgA=slds[i].getImages();
        if(sldImgA) { 
          for(var j=0;j<sldImgA.length;j++) {
            var imgName=sldImgA[j].getTitle();
            var base64=Utilities.base64Encode(sldImgA[j].getBlob().getBytes());
            var html='<img src="data:image/jpg;base64,'+base64+'">';
            var blob=null;
            blob=Utilities.newBlob(html, MimeType.HTML).setName('Image' + n++ + ".pdf");
            blob=blob.getAs(MimeType.PDF);
            var file=fldr.createFile(blob);  
          }
        }
      }
    }
    

    Helpful Reference

    【讨论】:

    • 非常感谢。我试过了,奇怪的是,我在 var sldImgA=slds[i].getImages() 行上有一个找不到页面的错误,我不完全确定它指的是哪个页面。我在此之前调整了实际的幻灯片,所以我认为它可能不是它所指的幻灯片,但如果不是,那会是什么?
    • 我添加了一张没有任何图像的幻灯片,它没有引起任何问题。你所有的图片都是jpg吗?
    • 再试一次。我在现在使用之前检查了是否定义了 sldImgA。
    • 还是没有运气。看起来错误实际上发生在实际声明变量的新 if 语句之上。这是一个“找不到页面”错误,在幻灯片放映中引用幻灯片似乎是一个奇怪的错误,对吧?
    • 如果您可以设置示例电子表格并在其中加载脚本。我给你调试一下。不幸的是,您还必须共享幻灯片演示文稿或至少一个展示相同问题的幻灯片。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多