【问题标题】:Export a presentation to pdf with one slide and its notes per page将演示文稿导出为 pdf,每页一张幻灯片及其注释
【发布时间】:2020-02-04 10:59:08
【问题描述】:

我想将演示文稿导出为 pdf,每页一张幻灯片及其注释。

我知道如何使用 Drive API 将演示文稿导出为 PDF,但我不知道如何指定我也想查看笔记,因为在这个阶段它只是一个文件。

但可以通过 UI 执行此操作,因此必须有一种方法...

您是否真的必须创建一个新文档,其中幻灯片的图像位于每页的上半部分,其注释位于下半部分,然后将其导出为 pdf?

【问题讨论】:

  • 为了更多人的帮助,你应该说你正在使用“Google Slides API”的问题和问题的细节。直到我注意到下面的标签,我才知道。如果您使用 API,您应该显示您用于反馈的示例代码。谢谢。

标签: google-apps-script google-slides-api google-slides


【解决方案1】:

阅读您的问题,我理解您的目标是使用这种格式的幻灯片制作 PDF:首先,您需要幻灯片本身;在其底部,您需要其相关的演讲者笔记。如果我的理解是正确的,您可以使用以下功能来达到您的意图:

function fromSlideToPDF(slideID) {
  var docID = DocumentApp.create("Brief Doc").getId();
  var docBody = DocumentApp.openById(docID).getBody();
  var slides = SlidesApp.openById(slideID).getSlides();
  var requestAuth = {
    headers: {
      Authorization: 'Bearer ' + ScriptApp.getOAuthToken()
    }
  }

  for (var i = 0; i < slides.length; i++) {
    var requestURL = "https://slides.googleapis.com/v1/presentations/" +
      slideID + "/pages/" + slides[i].getObjectId() + "/thumbnail";
    var response = UrlFetchApp.fetch(requestURL, requestAuth);
    var thumbnailURL = JSON.parse(response.getContentText());
    var thumbnailBlob = UrlFetchApp.fetch(thumbnailURL.contentUrl, requestAuth)
      .getBlob();

    docBody.appendImage(thumbnailBlob).setWidth(611).setHeight(344);
    docBody.appendParagraph(slides[i].getNotesPage().getSpeakerNotesShape()
      .getText().asRenderedString())
    docBody.appendPageBreak();
  }

  DocumentApp.openById(docID).saveAndClose();
  fromDocToPDF(docID);
  DriveApp.getFileById(docID).setTrashed(true);
}

function fromDocToPDF(docID) {
  var doc = DriveApp.getFileById(docID);
  var PDF = doc.getAs("application/pdf");
  var folderID = doc.getParents().next().getId();
  var request = {
    title: "PDF of " + doc.getOwner().getName(),
    parents: [{
      "id": folderID
    }],
  }
  Drive.Files.insert(request, PDF);
}

为了清楚起见,我将描述该代码的方法。主要功能是fromSlideToPDF(),它从谷歌幻灯片转换为PDF,只请求演示文稿的ID。它将首先使用.create() 创建一个虚拟文档并使用.getBody() 获取其正文,然后使用.openById().getSlides() 阅读原始演示文稿的幻灯片。然后它将迭代每张幻灯片并请求将其缩略图包含到虚拟文档中。在每个缩略图下,脚本也会添加其链接的演讲者备注。迭代完成后,该函数会将更改保存在具有.saveAndClose()的虚拟Doc中。

然后将调用第二个函数将虚拟 Doc 转换为最终的 PDF。为此,它将使用.getAs() 将文档作为PDF 读取,并将其第一个父文件夹(请注意,单个文件可以托管在不同的文件夹中)使用.getParents().next()。然后该脚本将使用.getId() 提取父文件夹ID。最后,第二个函数将构建并执行文件上传请求,如 here 所述。

第二个函数将虚拟文档转换为同一文件夹中的PDF文件后,第一个函数将删除带有.setTrashed()的虚拟文件。

最后我想提一下,我正在使用两种不同的高级服务,DriveSlides,来执行来自 Apps Script 的 API 请求。有关如何在脚本编辑器上激活这些服务的说明,请参阅链接文档。

请将此作为您问题的可能解决方案之一,如有任何疑问或要求进一步澄清,请随时给我回信。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-29
    相关资源
    最近更新 更多