【问题标题】:How can I convert each google slide into a PDF and JPG?如何将每张谷歌幻灯片转换为 PDF 和 JPG?
【发布时间】:2021-05-17 01:28:25
【问题描述】:

Google Apps 脚本

  • 我想为 Google 幻灯片文件的每张幻灯片创建 PDF 文件(带有文字和图表的普通幻灯片)
  • 我回顾了过去的问题,发现了一种解决方案,它可以生成 PDF 文件,但将幻灯片作为图像(我需要能够搜索这些 pdf 中的单词)
  • 应用了另一种解决方案来转换电子表格 -> PDF,但它也不适用于我的情况。

This was my reference

function autoFlyerGenerator() {

  const name_file = "FILE_NAME";
  
  // Template file in Google slide
  const ppt_file = DriveApp.getFileById(##SLIDE_ID##);
  // Temporal folder to store a temporal slide file
  const temp_folder = DriveApp.getFolderById(##TEMP_FOLDER_ID##);
  // PDF folder
  const pdf_folder = DriveApp.getFolderById(##PDF_FOLDER_ID##);

  // My current spreadsheet
  const ss = SpreadsheetApp.getActive();
  const values_ss = ss.getDataRange().getValues();

  const temp_ppt = ppt_file.makeCopy(temp_folder).setName(name_file);
  const open_temp_ppt = SlidesApp.openById(temp_ppt.getId());
  const slides = open_temp_ppt.getSlides();

  // First for-loop iterate over all rows (without the header)
  // Second for-loop iterate over all columns
  for (var index = 0; index < ss.getLastRow()-1; index++){
    for (var col = 0; col < ss.getLastColumn(); col++){
      slides[index].replaceAllText(values_ss[0][col], values_ss[index+1][col])
    }
  }

  open_temp_ppt.saveAndClose();

  // This code block create a single PDF of the slide
  const pdfContentBlob = temp_ppt.getBlob();
  pdf_folder.createFile(pdfContentBlob).setName(name_file);
}

更新

  • 我忘了提到 Google 幻灯片文件的页面设置大小与默认大小不同。
  • 这个问题的第一个答案解决了生成pdf文件的问题,但是没有考虑幻灯片的大小。

【问题讨论】:

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


    【解决方案1】:

    我相信你的目标如下。

    • 您希望将 Google 幻灯片的每一页导出为每个 PDF 文件。
    • 您希望使用 Google Apps 脚本实现此目的。

    这样的话,下面的流程呢?

    1. 从源 Google 幻灯片中检索所有幻灯片。
    2. 创建临时 Google 幻灯片。
    3. 将每个页面导出为 PDF 文件。
    4. 删除临时 Google 幻灯片。

    当这个流程反映到脚本时,它变成如下。

    示例脚本:

    请将以下脚本复制并粘贴到 Google 幻灯片的脚本编辑器中,然后运行函数myFunction。这样,脚本就运行了。

    function myFunction() {
      const folderId = "###"; // Please set the folder ID you want to put the exported PDF files.
    
      // 1. Retrieve all slides from the source Google Slides.
      const slide = SlidesApp.getActivePresentation();
      const srcSlides = slide.getSlides();
    
      // 2. Create a temporal Google Slides.
      let temp = SlidesApp.create("temp");
      const id = temp.getId();
      const file = DriveApp.getFileById(id);
      const folder = DriveApp.getFolderById(folderId);
    
      // 3. Export each page as a PDF file.
      srcSlides.forEach((s, i) => {
        temp.appendSlide(s);
        temp.getSlides()[0].remove();
        temp.saveAndClose();
        folder.createFile(file.getBlob().setName(`page_${i + 1}.pdf`));
        temp = SlidesApp.openById(id);
      });
    
      // 4. Remove the temporal Google Slides.
      file.setTrashed(true);
    }
    
    • 在这种情况下,每个 PDF 文件的文件名类似于page_1.pdfpage_2.pdf

    注意:

    • 从您的标题中,如果您想将每张幻灯片导出为每个 JPEG 文件而不是 PDF 文件,您还可以使用以下示例脚本。在这种情况下,将使用 Slides API。所以,在你运行脚本之前,please enable Slides API at Advanced Google services.

        function myFunction() {
          const folderId = "###"; // Please set the folder ID you want to put the exported PDF files.
      
          // 1. Retrieve all slides from the source Google Slides.
          const slide = SlidesApp.getActivePresentation();
          const id = slide.getId();
          const srcSlides = slide.getSlides();
      
          // 2. Export each page as a JPEG file.
          const folder = DriveApp.getFolderById(folderId);
          srcSlides.forEach((s, i) => {
            const url = Slides.Presentations.Pages.getThumbnail(id, s.getObjectId(), {"thumbnailProperties.mimeType": "PNG"}).contentUrl;
            const blob = UrlFetchApp.fetch(url).getAs(MimeType.JPEG);
            folder.createFile(blob.setName(`page_${i + 1}.jpg`));
          });
        }
      
      • 在这种情况下,每个 JPEG 文件的文件名类似于page_1.jpgpage_2.jpg

    参考资料:

    补充:

    来自以下 OP 的回复,

    我的幻灯片文件的页面设置与默认设置不同,因此在应用您的代码时,生成的 PDF 文件最终会使用默认大小,从而导致文件失真。我该如何解决?

    其实,这是我的错。我的意思是我原来的 Google 幻灯片文件有不同的页面设置(比如说 14 x 18 厘米)。您的代码有效,但生成的 PDF 文件具有幻灯片的默认页面设置。

    从上面的回复看来,页面大小不是默认的。在这种情况下,我想建议使用原始 Google 幻灯片的页面大小。示例脚本如下。

    示例脚本:

    function myFunction2() {
      const folderId = "###"; // Please set the folder ID you want to put the exported PDF files.
    
      // 1. Retrieve all slides from the source Google Slides.
      const slide = SlidesApp.getActivePresentation();
      const srcId = slide.getId();
      const srcSlides = slide.getSlides();
    
      // 2. Create a temporal Google Slides.
      const file = DriveApp.getFileById(srcId).makeCopy("temp");
      const id = file.getId();
      let temp = SlidesApp.openById(id);
      temp.getSlides().forEach((e, i) => {
        if (i != 0) e.remove();
      });
      const folder = DriveApp.getFolderById(folderId);
    
      // 3. Export each page as a PDF file.
      srcSlides.forEach((s, i) => {
        temp.appendSlide(s);
        temp.getSlides()[0].remove();
        temp.saveAndClose();
        folder.createFile(file.getBlob().setName(`page_${i + 1}.pdf`));
        temp = SlidesApp.openById(id);
      });
    
      // 4. Remove the temporal Google Slides.
      file.setTrashed(true);
    }
    

    【讨论】:

    • 我的幻灯片文件的页面设置与默认设置不同,因此在应用您的代码时,生成的 PDF 文件最终会使用默认大小,从而导致文件失真。我该如何解决这个问题?
    • @JonathanDiaz 感谢您的回复。我带来的不便表示歉意。从您的回复和更新的问题中,我可以理解您最初的问题。但不幸的是,关于你的第二个问题,我无法理解。特别是,我无法理解giving distorted files。我为我糟糕的英语水平道歉。那么,您能否提供用于复制您的问题的示例 Google 幻灯片?借此,我想确认一下。
    • 其实是我的错。我的意思是我原来的 Google 幻灯片文件有不同的页面设置(比如说 14 x 18 厘米)。您的代码有效,但生成的 PDF 文件具有幻灯片的默认页面设置。 This is my file
    • @JonathanDiaz 感谢您回复并提供 Google 幻灯片示例。根据您的附加信息,我可以正确理解您当前的问题。所以我又添加了一个示例脚本。你能确认一下吗?如果这不是您期望的结果,我深表歉意。
    • @JonathanDiaz 感谢您的回复和测试。我很高兴你的问题得到了解决。也谢谢你。
    猜你喜欢
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-26
    • 2021-03-26
    • 2017-02-03
    • 1970-01-01
    相关资源
    最近更新 更多