如何下载Google幻灯片作为图片?

时间:2015-07-27 20:17:10

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

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

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

我在工作流程中尝试做的是立即将演示文稿中的所有幻灯片下载为图像? Google幻灯片用户界面只允许您一次下载每张幻灯片作为一张PNG吗?

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

7 个答案:

答案 0 :(得分:6)

以下对我有用:

设置

资源>下开发者控制台项目>查看开发人员控制台,同时启用幻灯片API 云端硬盘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')
}

答案 1 :(得分:1)

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

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

以下Apps脚本代码使用SlidesApp来迭代幻灯片,幻灯片高级服务生成缩略图图像,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);
  });
}

答案 2 :(得分:1)

我最终采用了一种略低技术的方式。这确实存在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

您可以将这些组合成一个操作。出于某种原因,直接通过gs实现这种高DPI的转换过程比使用ImageMagick快得多。

答案 3 :(得分:1)

对于在那里寻找答案的其他人,我只是从我的JavaScript控制台中找到了官方的导出URL,当从文件菜单下单击“下载-> JPG”时,我在控制台中看到了下载该URL的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_0”)插入上述URL中的“ TheSlideID”,然后vwala!

答案 4 :(得分:0)

我制作了https://github.com/Nashev/CreatePNGSequenceForSlides插件,可以在几乎没有GUI的情况下为每张幻灯片调用https://developers.google.com/slides/reference/rest/v1/presentations.pages/getThumbnail

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

enter image description here

答案 5 :(得分:0)

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

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 :(得分:0)

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

我想以 png 或 jpg 文件的形式获取谷歌幻灯片演示的所有幻灯片,然后将它们保存在谷歌驱动器中。实际上我希望它们在我的本地计算机中。但我想如果我能做到这一点,那么以后我会下载使用。

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

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

这是my Google Slide。你可以复制它。从工具>脚本编辑器打开应用程序脚本。然后运行“generateScreenshots”功能。这个函数不是我自己做的,是从here那里得到的。仅修改为将图像保存到特定文件夹名称“Test_Image”中。您可以在谷歌驱动器中创建自己的文件夹,然后在应用程序脚本中使用文件夹 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;
}