slideshareのスライドをPDFでダウンロードしてEvernoteに入れてあとで閲覧する、っていうフローで読むことがあります。ところが、たまにSAVEできないスライドがあってそれができなくて困ったりします。

そういう場合は諦めてWebで読めば問題ないと言えば問題ないのですが、Evernoteに突っ込めないっていうのが気持ち悪いと感じてしまいます。 かといって1スライドごとにスクリーンショットを撮ってスライド化するのもバカみたいだし。

幸い僕はプログラマーなのでslideshareのスライドをPDF化するスクリプトを作り、さらにSinatraでWebアプリケーション化しました。

※規約を読んで問題ないんじゃないかと判断してこのようなコードを書いていますが、英語の理解力が足りなくてそう思い込んでいる可能性もあるので間違ってたらどうしよう。

まずはRubyスクリプト

全体像はGistに。 download slideshare slide as PDF

ざっくり言うと、スライドのURLからスライド1枚ごとの画像のURLを抽出して保存。それをprawnというgemでPDF化します。

以下、一部解説します。

各スライドを画像としてダウンロード

 1# 対象のスライド(@nippondanjiさんの偉大なスライドをリスペクト!)
 2url = "http://www.slideshare.net/nippondanji/db-engineerstudyanim"
 3
 4# ..略..
 5
 6# スライドページのHTMLをパースして、、
 7doc = Nokogiri::HTML.parse(html,nil,charset)
 8
 9# スライドの一覧が載っているXMLのURLを作る
10item = doc.xpath('/html/head/meta[@name="thumbnail"]').first
11thumbnail_url = item.attributes["content"].value
12xml_url = thumbnail_url.gsub(/phpapp(\d+)?(.+)$/,'phpapp\1').gsub(/ss_thumbnails\//,'') + ".xml"
13xml = open(xml_url) do |f|
14  f.read
15end
16
17# XMLをパースしてスライドの枚数をカウント
18xml_doc = Nokogiri::XML(xml)
19slide_count = xml_doc.xpath("/Show/Slide").count
20
21# 一時ディレクトリで
22Dir.mktmpdir do |dir|
23  Dir.chdir(dir) do
24
25    slide_count.times do |i|
26      # 各スライドの画像が置いてあるURLを作成しダウンロード
27      path = "http://image.slidesharecdn.com/#{slide_name}/95/slide-#{i+1}-1024.jpg"
28      puts "downloading #{path} ..."
29      filename = File.basename(path)
30      open(filename, 'wb') do |out|
31        open(path) do |data|
32          out.write(data.read)
33        end
34      end
35    end
36
37    # ..略..
38  end
39end

保存した画像をPDFに変換

 1Dir.mktmpdir do |dir|
 2  Dir.chdir(dir) do
 3
 4    # ..画像をダウンロード..
 5
 6    # ダウンロードした画像名を番号順にして保持
 7    images = Dir.glob("slide-*.jpg")
 8    images = images.sort_by{|str| str[/\d+/].to_i}
 9
10    puts "generating #{pdf_file.path} ..."
11
12    # prawnを使ってPDFを生成
13    Prawn::Document.generate(
14      pdf_file.path, # 出力ファイル名
15      page_size:[1024,768], # 1枚のサイズは1024x768
16      margin:0
17    ) do
18      images.each do |img|
19        # imgというファイルパスを画像としてページに追加、という意味
20        image(
21          img,
22          fit:[1024,768]
23        )
24        start_new_page # 新しいページに移る
25      end
26    end
27  end
28end

Webアプリケーション版

Sinatra on Herokuで超シンプルなアプリケーションを作りました。

pi-chan/slideshare-downloader

slideshare-downloader

フォームにslideshareの該当スライドのURLを入れてボタンを押すだけ!超カンタンです。動かないパターンがある気がするのでその場合は教えて欲しいです。