【问题标题】:How to download Google Slides as images?如何将 Google 幻灯片下载为图片?
【发布时间】:2015-10-18 04:35:28
【问题描述】:

我非常喜欢将 Google 幻灯片用作云托管的轻量级插画替代品(这也恰好是协作和免费的!)。我在这里写了一些关于我的过程的想法:

https://medium.com/@tomcritchlow/how-to-use-google-slides-as-a-free-cloud-hosted-illustrator-replacement-f472e6c3a881

我想要在我的工作流程中做的是一次将演示文稿中的所有幻灯片下载为图像? Google 幻灯片 UI 只允许您一次将每张幻灯片下载为 PNG 一张?

这是否可能以某种方式使用附加组件或应用程序脚本?不知道从哪里开始...谢谢!

【问题讨论】:

  • 感谢帖子中的提示,幻灯片大小可以调整为基于像素的。不确定我在下面建议的方法是否可以通过该解决方案得到增强,以降低 DPI。

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


【解决方案1】:

以下内容对我有用:

设置

Resources > Developer Console Project > View Developers Console 下,启用 Slides APIDrive API

执行

替换 start() 函数中从幻灯片 URL 获取的 ID,然后运行它,例如:

https://docs.google.com/presentation/d/<id>/edit

该功能会将 PNG 保存到您的云端硬盘。这可以扩展为将它们全部分组到特定文件夹等中。

function downloadPresentation(id) {
  var slideIds = getSlideIds(id); 

  for (var i = 0, slideId; slideId = slideIds[i]; i++) {
    downloadSlide('Slide ' + (i + 1), id, slideId);
  }
}

function downloadSlide(name, presentationId, slideId) {
  var url = 'https://docs.google.com/presentation/d/' + presentationId +
    '/export/png?id=' + presentationId + '&pageid=' + slideId; 
  var options = {
    headers: {
      Authorization: 'Bearer ' + ScriptApp.getOAuthToken()
    }
  };
  var response = UrlFetchApp.fetch(url, options);
  var image = response.getAs(MimeType.PNG);
  image.setName(name);
  DriveApp.createFile(image);
}

function getSlideIds(presentationId) {
  var url = 'https://slides.googleapis.com/v1/presentations/' + presentationId;
  var options = {
    headers: {
      Authorization: 'Bearer ' + ScriptApp.getOAuthToken()
    }
  };
  var response = UrlFetchApp.fetch(url, options);

  var slideData = JSON.parse(response);
  return slideData.slides.map(function(slide) {
    return slide.objectId;
  });
}

function start() {
  downloadPresentation('Slides document id')
}

【讨论】:

  • 工作,谢谢。请注意,对于 Google Apps 脚本的新手,您应该打开幻灯片演示文稿 > 工具 > 脚本编辑器 > 将上述代码复制粘贴到 Code.gs 中。然后,按照上述@Bardy 的步骤为这个特定的幻灯片文档启用幻灯片和驱动器 API。最后,运行代码。文件将保存在您的云端硬盘根文件夹中
  • 老实说,花了一点时间才弄明白,但这很有效。谢谢。
【解决方案2】:

获取幻灯片图像的最佳方法是使用presentations.pages.getThumbnail 端点:

https://developers.google.com/slides/reference/rest/v1/presentations.pages/getThumbnail

以下 Apps 脚本代码使用 SlidesApp 迭代幻灯片,使用 Slides Advanced Service 生成缩略图,UrlFetchApp 获取生成的缩略图,并使用 DriveApp 将其保存到云端硬盘:

function exportSlideImages(presentationId) {
  var presentation = SlidesApp.openById(presentationId);
  presentation.getSlides().forEach(function(slide, i) {
    // slide = presentation.getSlides()[];
    var thumbnail = Slides.Presentations.Pages.getThumbnail(presentationId, slide.getObjectId(), {
      'thumbnailProperties.thumbnailSize': 'LARGE'
    });
    var response = UrlFetchApp.fetch(thumbnail.contentUrl);
    var blob = response.getBlob();
    blob.setName('slide' + (i + 1) + '.png');
    var file = DriveApp.createFile(blob);
    Logger.log('Created file "%s" for slide number %s', file.getName(), i + 1);
  });
}

【讨论】:

  • 此 API 需要授权。我想获取公共幻灯片的缩略图。有没有办法在没有授权的情况下获取预览缩略图?
【解决方案3】:

我最终选择了一种技术含量略低的方式。这确实有 PDF 导出附带的压缩伪影,但对我来说已经足够接近原始质量了。

我为 Google 幻灯片中的图像添加了注释,以便最终使用 marvelapp.com 中的图像。所以我将 Google 幻灯片导出为 PDF。

然后发出命令行(需要安装ghostscript)。我实际上需要在这里做 1200 DPI。这是为了获得我在原始图像中的细节水平,这些图像是我放到谷歌幻灯片上的。

gs -sDEVICE=pngalpha -o file-%03d.png -r1200 demo.pdf

由于我的幻灯片是由我刚刚拖到谷歌幻灯片上的图片组成的,我发出以下命令来裁剪连接到图像边框的白色区域(需要安装 ImageMagick)

mogrify -trim *.png

最后,我将图像大小调整回图像的原始大小。 0.5 的锐化级别似乎不会导致明显的伪影,1.0 太强了。

convert -resize 1794x971 -sharpen 0x0.5 *.png

您可以将这些组合成一个操作。由于某种原因,在如此高 DPI 下的实际转换过程对我来说直接通过 gs 比使用 ImageMagick 快得多。

【讨论】:

【解决方案4】:

对于其他正在寻找答案的人,我刚刚从我的 JavaScript 控制台中找到了官方导出 URL,当单击文件菜单下的“下载 -> JPG”时,我在控制台中看到的 URL 用于下载图片是(例如): https://docs.google.com/presentation/d/1xRtKNtBaaiGzZx3sUz2k3OUdW0hbPmm8HsRVz222SnA/export/jpeg?id=1xRtKNtBaaiGzZx3sUz2k3OUdW0hbPmm8HsRVz222SnA&pageid=g6eb73d655b_0_0

这是真的:

https://docs.google.com/presentation/d/YourPublicSlideshowID/export/jpeg?id=YourPublicSlideshowID&pageid=TheSlideID

“TheSlideID”可以通过以下操作找到:转到您的 Google 幻灯片文件,转到与第一张不同的幻灯片,然后复制 URL,它应该是这样的:

https://docs.google.com/presentation/d/1xRtKNtBaaiGzZx3sUz2k3OUdW0hbPmm8HsRVz222SnA/edit#slide=id.g6eb73d655b_0_0

例如。注意,在“edit”关键字之后,是“#slide=id.g6eb73d655b_0_0”,提取SlideId(插入到其他URL)非常简单:只需替换文本“#slide=id”。使用“”(如果您以编程方式或手动执行),然后将其余部分(在本例中为“g6eb73d655b_0_0”)插入上述 URL 中的“TheSlideID”,然后 vwala!

【讨论】:

    【解决方案5】:

    https://aijayvishnu.medium.com/how-to-download-google-slide-presentations-published-to-the-web-3c1564bd92c1 的这个书签 sn-p 会将所有幻灯片放在一页上。 它真的很容易使用,创建一个书签并单击它。 (文章中的更多信息)

    javascript: 
    var atag = "punch-viewer-content",
        btag = "-caption",
        ctag = "aria-setsize",
        dtag = "aria-posinset",
        msvg = document.getElementsByTagName("svg"),
        node = document.querySelectorAll('[class$="' + btag + '"]')[0],
        view = document.getElementsByClassName(atag)[0],
        size = node.getAttribute(ctag),
        data = "", 
        func = () => { 
          data += msvg[0].outerHTML;
          if((i = node.getAttribute(dtag))==size) document.write(data); 
          else view.click(), setTimeout(func,10) 
        };func()
    

    【讨论】:

      【解决方案6】:

      我搜索了几个地方,找到了一些将谷歌幻灯片下载为图片的答案,但它们看起来很复杂,或者比我预期的要花费更多的时间。

      我想将谷歌幻灯片演示文稿的所有幻灯片作为 png 或 jpg 文件,然后将它们保存在谷歌驱动器中。实际上我希望它们在我的本地计算机中。不过我觉得如果我能做到的话,以后我会下载使用的。

      那么如何快速轻松地做到这一点呢? 我找到了这个link。但这里没有简单的答案。

      使用此脚本将谷歌幻灯片转换为图片的优势: 如果您想将它们下载到您的 PC 中,您可以下载该文件夹。如果您想与其他人共享单个图像,您也可以这样做。 最重要的是,如果您想将演示文稿共享为图像文件,只需共享文件夹即可。

      这里是my Google Slide。你可以复制它。从工具>脚本编辑器打开应用程序脚本。然后运行“generateScreenshots”函数。这个函数不是我自己做的,是从here得到的。仅修改为将图像保存到名称为“Test_Image”的特定文件夹中。您可以在 google drive 中创建自己的文件夹,然后在应用程序脚本中使用文件夹 ID 并更新此行:

      var folder = DriveApp.getFolderById("Folder ID");//Replace Folder ID with your own folder
      

      完整的代码在这里。

      function generateScreenshots() {
        // open Google Slide and then copy Google Slide ID (presentation ID)
        var presentationId ="1ZXT1YemGiNcFxiN61hwew_SEsEDC4cl_V-j0V_hkj6w";
        var presentation = SlidesApp.openById(presentationId);
        var baseUrl =
          "https://slides.googleapis.com/v1/presentations/{presentationId}/pages/{pageObjectId}/thumbnail";
        var parameters = {
          method: "GET",
          headers: { Authorization: "Bearer " + ScriptApp.getOAuthToken() },
          contentType: "application/json",
          muteHttpExceptions: true
        };
      
        // Log URL of the main thumbnail of the deck
        Logger.log(Drive.Files.get(presentationId).thumbnailLink);
      
        // For storing the screenshot image URLs
        var screenshots = [];
      
        var slides = presentation.getSlides().forEach(function(slide, index) {
          var url = baseUrl
            .replace("{presentationId}", presentationId)
            .replace("{pageObjectId}", slide.getObjectId());
          var response = JSON.parse(UrlFetchApp.fetch(url, parameters));
      
          // Upload Googel Slide image to a  Google Drive Folder
          var blob = UrlFetchApp.fetch(response.contentUrl).getBlob();
          var folder = DriveApp.getFolderById("Your Folder ID");//Replace Folder ID with your own folder
          folder.createFile(blob).setName("Image " + (index + 1) + ".png");
      
          screenshots.push(response.contentUrl);
        });
      
        return screenshots;
      }

      【讨论】:

        【解决方案7】:

        我已经制作了https://github.com/Nashev/CreatePNGSequenceForSlides 插件,以便为每张带有少量 GUI 的幻灯片调用 https://developers.google.com/slides/reference/rest/v1/presentations.pages/getThumbnail

        它可以与大型演示文稿一起使用,以克服 Google 对脚本执行时间和“getThumbnail”调用次数的限制。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-23
          • 1970-01-01
          • 2010-11-04
          相关资源
          最近更新 更多