├── .codeclimate.yml ├── .gitignore ├── Gemfile ├── LICENSE.txt ├── README.md ├── Rakefile ├── lib ├── powerpoint.rb └── powerpoint │ ├── compression.rb │ ├── presentation.rb │ ├── slide │ ├── intro.rb │ ├── pictorial.rb │ ├── picture_description.rb │ ├── text_picture_split.rb │ └── textual.rb │ ├── util.rb │ ├── version.rb │ └── views │ ├── app.xml.erb │ ├── content_type.xml.erb │ ├── intro_slide.xml.erb │ ├── pictorial_rel.xml.erb │ ├── pictorial_slide.xml.erb │ ├── picture_description_rels.xml.erb │ ├── picture_description_slide.xml.erb │ ├── presentation.xml.erb │ ├── presentation.xml.rel.erb │ ├── text_picture_split_rel.xml.erb │ ├── text_picture_split_slide.xml.erb │ ├── textual_rel.xml.erb │ └── textual_slide.xml.erb ├── powerpoint.gemspec ├── samples ├── images │ ├── sample_gif.gif │ ├── sample_jpg.jpg │ └── sample_png.png └── pptx │ └── sample.pptx ├── spec └── test_spec.rb └── template ├── _rels └── .rels ├── docProps └── core.xml └── ppt ├── _rels └── .keep ├── media └── .keep ├── presProps.xml ├── slideLayouts ├── _rels │ ├── slideLayout1.xml.rels │ ├── slideLayout10.xml.rels │ ├── slideLayout11.xml.rels │ ├── slideLayout2.xml.rels │ ├── slideLayout3.xml.rels │ ├── slideLayout4.xml.rels │ ├── slideLayout5.xml.rels │ ├── slideLayout6.xml.rels │ ├── slideLayout7.xml.rels │ ├── slideLayout8.xml.rels │ └── slideLayout9.xml.rels ├── slideLayout1.xml ├── slideLayout10.xml ├── slideLayout11.xml ├── slideLayout2.xml ├── slideLayout3.xml ├── slideLayout4.xml ├── slideLayout5.xml ├── slideLayout6.xml ├── slideLayout7.xml ├── slideLayout8.xml └── slideLayout9.xml ├── slideMasters ├── _rels │ └── slideMaster1.xml.rels └── slideMaster1.xml ├── slides └── _rels │ └── .keep ├── tableStyles.xml ├── theme └── theme1.xml └── viewProps.xml /.codeclimate.yml: -------------------------------------------------------------------------------- 1 | --- 2 | engines: 3 | rubocop: 4 | enabled: true 5 | ratings: 6 | paths: 7 | - powerpoint/** 8 | exclude_paths: 9 | - spec/**/* 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.gem 2 | *.rbc 3 | .bundle 4 | .config 5 | .yardoc 6 | Gemfile.lock 7 | InstalledFiles 8 | _yardoc 9 | coverage 10 | doc/ 11 | lib/bundler/man 12 | pkg 13 | rdoc 14 | spec/reports 15 | test/tmp 16 | test/version_tmp 17 | tmp 18 | .pryrc -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | # Specify your gem's dependencies in powerpoint.gemspec 4 | gemspec -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2013 TODO: Write your name 2 | 3 | MIT License 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining 6 | a copy of this software and associated documentation files (the 7 | "Software"), to deal in the Software without restriction, including 8 | without limitation the rights to use, copy, modify, merge, publish, 9 | distribute, sublicense, and/or sell copies of the Software, and to 10 | permit persons to whom the Software is furnished to do so, subject to 11 | the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be 14 | included in all copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 20 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 21 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 22 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![version](https://badge.fury.io/rb/powerpoint.svg)](https://badge.fury.io/rb/powerpointk) 2 | [![downloads](https://ruby-gem-downloads-badge.herokuapp.com/powerpoint?type=total&total_label=downloads)](https://ruby-gem-downloads-badge.herokuapp.com/powerpoint?type=total&total_label=downloads) 3 | 4 | # 'powerpoint' gem -- for creating PowerPoint Slides in Ruby. 5 | 6 | 'powerpoint' is a Ruby gem that can generate PowerPoint files(pptx). 7 | 8 | ## Installation 9 | 10 | 'powerpoint' can be used from the command line or as part of a Ruby web framework. To install the gem using terminal, run the following command: 11 | 12 | gem install powerpoint 13 | 14 | To use it in Rails, add this line to your Gemfile: 15 | 16 | gem "powerpoint" 17 | 18 | 19 | ## Basic Usage 20 | 21 | 'powerpoint' gem can generate a PowerPoint presentaion based on a standard template: 22 | 23 | ```ruby 24 | require 'powerpoint' 25 | 26 | @deck = Powerpoint::Presentation.new 27 | 28 | # Creating an introduction slide: 29 | title = 'Bicycle Of the Mind' 30 | subtitle = 'created by Steve Jobs' 31 | @deck.add_intro title, subtitle 32 | 33 | # Creating a text-only slide: 34 | # Title must be a string. 35 | # Content must be an array of strings that will be displayed as bullet items. 36 | title = 'Why Mac?' 37 | content = ['Its cool!', 'Its light.'] 38 | @deck.add_textual_slide title, content 39 | 40 | # Creating an image Slide: 41 | # It will contain a title as string. 42 | # and an embeded image 43 | title = 'Everyone loves Macs:' 44 | image_path = 'samples/images/sample_gif.gif' 45 | @deck.add_pictorial_slide title, image_path 46 | 47 | # Specifying coordinates and image size for an embeded image. 48 | # x and y values define the position of the image on the slide. 49 | # cx and cy define the width and height of the image. 50 | # x, y, cx, cy are in points. Each pixel is 12700 points. 51 | # coordinates parameter is optional. 52 | coords = {x: 124200, y: 3356451, cx: 2895600, cy: 1013460} 53 | @deck.add_pictorial_slide title, image_path, coords 54 | 55 | # Saving the pptx file to the current directory. 56 | @deck.save('test.pptx') 57 | ``` 58 | 59 | ## Compatibility 60 | 61 | 'powerpoint' gem has been tested with LibreOffice (4.2.1.1) and Apache OpenOffice (4.0.1) on Mac OS X Mavericks, Microsoft PowerPoint 2010 on Windows 7 and Google Docs (latest version as of March 2014). 62 | 63 | ## Contributing 64 | 65 | Contributions are welcomed. You can fork a repository, add your code changes to the forked branch, ensure all existing unit tests pass, create new unit tests cover your new changes and finally create a pull request. 66 | 67 | After forking and then cloning the repository locally, install Bundler and then use it to install the development gem dependecies: 68 | 69 | gem install bundler 70 | bundle install 71 | 72 | Once this is complete, you should be able to run the test suite: 73 | 74 | rake 75 | 76 | 77 | ## Bug Reporting 78 | 79 | Please use the [Issues](https://github.com/pythonicrubyist/powerpoint/issues) page to report bugs or suggest new enhancements. 80 | 81 | ## License 82 | 83 | Powerpoint has been published under [MIT License](https://github.com/pythonicrubyist/powerpoint/blob/master/LICENSE.txt) 84 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | require "bundler/gem_tasks" 2 | require 'rspec/core/rake_task' 3 | 4 | RSpec::Core::RakeTask.new('spec') 5 | 6 | # If you want to make this the default task 7 | task :default => :spec -------------------------------------------------------------------------------- /lib/powerpoint.rb: -------------------------------------------------------------------------------- 1 | require "powerpoint/version" 2 | require 'powerpoint/util' 3 | require 'powerpoint/slide/intro' 4 | require 'powerpoint/slide/textual' 5 | require 'powerpoint/slide/pictorial' 6 | require 'powerpoint/slide/text_picture_split' 7 | require 'powerpoint/slide/picture_description' 8 | require 'powerpoint/compression' 9 | require 'powerpoint/presentation' 10 | 11 | module Powerpoint 12 | ROOT_PATH = File.expand_path("../..", __FILE__) 13 | TEMPLATE_PATH = "#{ROOT_PATH}/template/" 14 | VIEW_PATH = "#{ROOT_PATH}/lib/powerpoint/views/" 15 | end 16 | -------------------------------------------------------------------------------- /lib/powerpoint/compression.rb: -------------------------------------------------------------------------------- 1 | module Powerpoint 2 | def self.decompress_pptx(in_path, out_path) 3 | Zip::File.open(in_path) do |zip_file| 4 | zip_file.each do |f| 5 | f_path = File.join(out_path, f.name) 6 | FileUtils.mkdir_p(File.dirname(f_path)) 7 | zip_file.extract(f, f_path) unless File.exist?(f_path) 8 | end 9 | end 10 | end 11 | 12 | def self.compress_pptx(in_path, out_path) 13 | Zip::File.open(out_path, Zip::File::CREATE) do |zip_file| 14 | Dir.glob("#{in_path}/**/*", ::File::FNM_DOTMATCH).each do |path| 15 | zip_path = path.gsub("#{in_path}/","") 16 | next if zip_path == "." || zip_path == ".." || zip_path.match(/DS_Store/) 17 | begin 18 | zip_file.add(zip_path, path) 19 | rescue Zip::ZipEntryExistsError 20 | raise "#{out_path} already exists!" 21 | end 22 | end 23 | end 24 | end 25 | end 26 | -------------------------------------------------------------------------------- /lib/powerpoint/presentation.rb: -------------------------------------------------------------------------------- 1 | require 'zip/filesystem' 2 | require 'fileutils' 3 | require 'tmpdir' 4 | 5 | module Powerpoint 6 | class Presentation 7 | include Powerpoint::Util 8 | 9 | attr_reader :slides 10 | 11 | def initialize 12 | @slides = [] 13 | end 14 | 15 | def add_intro(title, subtitile = nil) 16 | existing_intro_slide = @slides.select {|s| s.class == Powerpoint::Slide::Intro}[0] 17 | slide = Powerpoint::Slide::Intro.new(presentation: self, title: title, subtitile: subtitile) 18 | if existing_intro_slide 19 | @slides[@slides.index(existing_intro_slide)] = slide 20 | else 21 | @slides.insert 0, slide 22 | end 23 | end 24 | 25 | def add_textual_slide(title, content = []) 26 | @slides << Powerpoint::Slide::Textual.new(presentation: self, title: title, content: content) 27 | end 28 | 29 | def add_pictorial_slide(title, image_path, coords = {}) 30 | @slides << Powerpoint::Slide::Pictorial.new(presentation: self, title: title, image_path: image_path, coords: coords) 31 | end 32 | 33 | def add_text_picture_slide(title, image_path, content = []) 34 | @slides << Powerpoint::Slide::TextPicSplit.new(presentation: self, title: title, image_path: image_path, content: content) 35 | end 36 | 37 | def add_picture_description_slide(title, image_path, content = []) 38 | @slides << Powerpoint::Slide::DescriptionPic.new(presentation: self, title: title, image_path: image_path, content: content) 39 | end 40 | 41 | def save(path) 42 | Dir.mktmpdir do |dir| 43 | extract_path = "#{dir}/extract_#{Time.now.strftime("%Y-%m-%d-%H%M%S")}" 44 | 45 | # Copy template to temp path 46 | FileUtils.copy_entry(TEMPLATE_PATH, extract_path) 47 | 48 | # Remove keep files 49 | Dir.glob("#{extract_path}/**/.keep").each do |keep_file| 50 | FileUtils.rm_rf(keep_file) 51 | end 52 | 53 | # Render/save generic stuff 54 | render_view('content_type.xml.erb', "#{extract_path}/[Content_Types].xml") 55 | render_view('presentation.xml.rel.erb', "#{extract_path}/ppt/_rels/presentation.xml.rels") 56 | render_view('presentation.xml.erb', "#{extract_path}/ppt/presentation.xml") 57 | render_view('app.xml.erb', "#{extract_path}/docProps/app.xml") 58 | 59 | # Save slides 60 | slides.each_with_index do |slide, index| 61 | slide.save(extract_path, index + 1) 62 | end 63 | 64 | # Create .pptx file 65 | File.delete(path) if File.exist?(path) 66 | Powerpoint.compress_pptx(extract_path, path) 67 | end 68 | 69 | path 70 | end 71 | 72 | def file_types 73 | slides.map {|slide| slide.file_type if slide.respond_to? :file_type }.compact.uniq 74 | end 75 | end 76 | end 77 | -------------------------------------------------------------------------------- /lib/powerpoint/slide/intro.rb: -------------------------------------------------------------------------------- 1 | require 'fileutils' 2 | require 'erb' 3 | 4 | module Powerpoint 5 | module Slide 6 | class Intro 7 | include Powerpoint::Util 8 | 9 | attr_reader :title, :subtitile 10 | 11 | def initialize(options={}) 12 | require_arguments [:title, :subtitile], options 13 | options.each {|k, v| instance_variable_set("@#{k}", v)} 14 | end 15 | 16 | def save(extract_path, index) 17 | save_rel_xml(extract_path, index) 18 | save_slide_xml(extract_path, index) 19 | end 20 | 21 | def file_type 22 | nil 23 | end 24 | 25 | def save_rel_xml(extract_path, index) 26 | render_view('textual_rel.xml.erb', "#{extract_path}/ppt/slides/_rels/slide#{index}.xml.rels", index: index) 27 | end 28 | private :save_rel_xml 29 | 30 | def save_slide_xml(extract_path, index) 31 | render_view('intro_slide.xml.erb', "#{extract_path}/ppt/slides/slide#{index}.xml") 32 | end 33 | private :save_slide_xml 34 | end 35 | end 36 | end 37 | -------------------------------------------------------------------------------- /lib/powerpoint/slide/pictorial.rb: -------------------------------------------------------------------------------- 1 | require 'zip/filesystem' 2 | require 'fileutils' 3 | require 'fastimage' 4 | require 'erb' 5 | 6 | module Powerpoint 7 | module Slide 8 | class Pictorial 9 | include Powerpoint::Util 10 | 11 | attr_reader :image_name, :title, :coords, :image_path 12 | 13 | def initialize(options={}) 14 | require_arguments [:presentation, :title, :image_path], options 15 | options.each {|k, v| instance_variable_set("@#{k}", v)} 16 | @coords = default_coords unless @coords.any? 17 | @image_name = File.basename(@image_path) 18 | end 19 | 20 | def save(extract_path, index) 21 | copy_media(extract_path, @image_path) 22 | save_rel_xml(extract_path, index) 23 | save_slide_xml(extract_path, index) 24 | end 25 | 26 | def file_type 27 | File.extname(image_name).gsub('.', '') 28 | end 29 | 30 | def default_coords 31 | slide_width = pixle_to_pt(720) 32 | default_width = pixle_to_pt(550) 33 | 34 | return {} unless dimensions = FastImage.size(image_path) 35 | image_width, image_height = dimensions.map {|d| pixle_to_pt(d)} 36 | new_width = default_width < image_width ? default_width : image_width 37 | ratio = new_width / image_width.to_f 38 | new_height = (image_height.to_f * ratio).round 39 | {x: (slide_width / 2) - (new_width/2), y: pixle_to_pt(120), cx: new_width, cy: new_height} 40 | end 41 | private :default_coords 42 | 43 | def save_rel_xml(extract_path, index) 44 | render_view('pictorial_rel.xml.erb', "#{extract_path}/ppt/slides/_rels/slide#{index}.xml.rels", index: index) 45 | end 46 | private :save_rel_xml 47 | 48 | def save_slide_xml(extract_path, index) 49 | render_view('pictorial_slide.xml.erb', "#{extract_path}/ppt/slides/slide#{index}.xml") 50 | end 51 | private :save_slide_xml 52 | end 53 | end 54 | end 55 | -------------------------------------------------------------------------------- /lib/powerpoint/slide/picture_description.rb: -------------------------------------------------------------------------------- 1 | require 'zip/filesystem' 2 | require 'fileutils' 3 | require 'fastimage' 4 | require 'erb' 5 | 6 | module Powerpoint 7 | module Slide 8 | class DescriptionPic 9 | include Powerpoint::Util 10 | 11 | attr_reader :title, :content, :image_name, :image_path, :coords 12 | 13 | def initialize(options={}) 14 | require_arguments [:presentation, :title, :image_path, :content], options 15 | options.each {|k, v| instance_variable_set("@#{k}", v)} 16 | @coords = default_coords 17 | @image_name = File.basename(@image_path) 18 | end 19 | 20 | def save(extract_path, index) 21 | copy_media(extract_path, @image_path) 22 | save_rel_xml(extract_path, index) 23 | save_slide_xml(extract_path, index) 24 | end 25 | 26 | def file_type 27 | File.extname(image_name).gsub('.', '') 28 | end 29 | 30 | def default_coords 31 | slide_width = pixle_to_pt(720) 32 | default_width = pixle_to_pt(550) 33 | default_height = pixle_to_pt(300) 34 | 35 | return {} unless dimensions = FastImage.size(image_path) 36 | image_width, image_height = dimensions.map {|d| pixle_to_pt(d)} 37 | 38 | capped_width = [default_width, image_width].min 39 | w_ratio = capped_width / image_width.to_f 40 | 41 | capped_height = [default_height, image_height].min 42 | h_ratio = capped_height / image_height.to_f 43 | 44 | ratio = [w_ratio, h_ratio].min 45 | 46 | new_width = (image_width.to_f * ratio).round 47 | new_height = (image_height.to_f * ratio).round 48 | {x: (slide_width / 2) - (new_width/2), y: pixle_to_pt(60), cx: new_width, cy: new_height} 49 | end 50 | private :default_coords 51 | 52 | def save_rel_xml(extract_path, index) 53 | render_view('picture_description_rels.xml.erb', "#{extract_path}/ppt/slides/_rels/slide#{index}.xml.rels", index: index) 54 | end 55 | private :save_rel_xml 56 | 57 | def save_slide_xml(extract_path, index) 58 | render_view('picture_description_slide.xml.erb', "#{extract_path}/ppt/slides/slide#{index}.xml") 59 | end 60 | private :save_slide_xml 61 | end 62 | end 63 | end 64 | -------------------------------------------------------------------------------- /lib/powerpoint/slide/text_picture_split.rb: -------------------------------------------------------------------------------- 1 | require 'zip/filesystem' 2 | require 'fileutils' 3 | require 'fastimage' 4 | require 'erb' 5 | 6 | module Powerpoint 7 | module Slide 8 | class TextPicSplit 9 | include Powerpoint::Util 10 | 11 | attr_reader :title, :content, :image_name, :image_path, :coords 12 | 13 | def initialize(options={}) 14 | require_arguments [:presentation, :title, :image_path, :content], options 15 | options.each {|k, v| instance_variable_set("@#{k}", v)} 16 | @coords = default_coords 17 | @image_name = File.basename(@image_path) 18 | end 19 | 20 | def save(extract_path, index) 21 | copy_media(extract_path, @image_path) 22 | save_rel_xml(extract_path, index) 23 | save_slide_xml(extract_path, index) 24 | end 25 | 26 | def file_type 27 | File.extname(image_name).gsub('.', '') 28 | end 29 | 30 | def default_coords 31 | start_x = pixle_to_pt(360) 32 | default_width = pixle_to_pt(300) 33 | 34 | return {} unless dimensions = FastImage.size(image_path) 35 | image_width, image_height = dimensions.map {|d| pixle_to_pt(d)} 36 | new_width = default_width < image_width ? default_width : image_width 37 | ratio = new_width / image_width.to_f 38 | new_height = (image_height.to_f * ratio).round 39 | {x: start_x, y: pixle_to_pt(120), cx: new_width, cy: new_height} 40 | end 41 | private :default_coords 42 | 43 | def save_rel_xml(extract_path, index) 44 | render_view('text_picture_split_rel.xml.erb', "#{extract_path}/ppt/slides/_rels/slide#{index}.xml.rels", index: index) 45 | end 46 | private :save_rel_xml 47 | 48 | def save_slide_xml(extract_path, index) 49 | render_view('text_picture_split_slide.xml.erb', "#{extract_path}/ppt/slides/slide#{index}.xml") 50 | end 51 | private :save_slide_xml 52 | end 53 | end 54 | 55 | 56 | end 57 | -------------------------------------------------------------------------------- /lib/powerpoint/slide/textual.rb: -------------------------------------------------------------------------------- 1 | require 'fileutils' 2 | require 'erb' 3 | 4 | module Powerpoint 5 | module Slide 6 | class Textual 7 | include Powerpoint::Util 8 | 9 | attr_reader :title, :content 10 | 11 | def initialize(options={}) 12 | require_arguments [:title, :content], options 13 | options.each {|k, v| instance_variable_set("@#{k}", v)} 14 | end 15 | 16 | def save(extract_path, index) 17 | save_rel_xml(extract_path, index) 18 | save_slide_xml(extract_path, index) 19 | end 20 | 21 | def save_rel_xml(extract_path, index) 22 | render_view('textual_rel.xml.erb', "#{extract_path}/ppt/slides/_rels/slide#{index}.xml.rels", index: index) 23 | end 24 | private :save_rel_xml 25 | 26 | def save_slide_xml(extract_path, index) 27 | render_view('textual_slide.xml.erb', "#{extract_path}/ppt/slides/slide#{index}.xml") 28 | end 29 | private :save_slide_xml 30 | end 31 | end 32 | end 33 | -------------------------------------------------------------------------------- /lib/powerpoint/util.rb: -------------------------------------------------------------------------------- 1 | module Powerpoint 2 | module Util 3 | 4 | def pixle_to_pt(px) 5 | px * 12700 6 | end 7 | 8 | def render_view(template_name, path, variables = {}) 9 | view_contents = read_template(template_name) 10 | renderer = ERB.new(view_contents) 11 | b = merge_variables(binding, variables) 12 | data = renderer.result(b) 13 | 14 | File.open(path, 'w') { |f| f << data } 15 | end 16 | 17 | def read_template(filename) 18 | File.read("#{Powerpoint::VIEW_PATH}/#{filename}") 19 | end 20 | 21 | def require_arguments(required_argements, argements) 22 | raise ArgumentError unless required_argements.all? {|required_key| argements.keys.include? required_key} 23 | end 24 | 25 | def copy_media(extract_path, image_path) 26 | image_name = File.basename(image_path) 27 | dest_path = "#{extract_path}/ppt/media/#{image_name}" 28 | FileUtils.copy_file(image_path, dest_path) unless File.exist?(dest_path) 29 | end 30 | 31 | def merge_variables(b, variables) 32 | return b if variables.empty? 33 | variables.each do |k,v| 34 | b.local_variable_set(k, v) 35 | end 36 | b 37 | end 38 | end 39 | end 40 | -------------------------------------------------------------------------------- /lib/powerpoint/version.rb: -------------------------------------------------------------------------------- 1 | module Powerpoint 2 | VERSION = "1.8" 3 | end 4 | -------------------------------------------------------------------------------- /lib/powerpoint/views/app.xml.erb: -------------------------------------------------------------------------------- 1 | 2 | 4 | 0 5 | 43 6 | Microsoft Macintosh PowerPoint 7 | On-screen Show (4:3) 8 | 15 9 | <%= slides.length %> 10 | 0 11 | 0 12 | 0 13 | false 14 | 15 | 16 | 17 | Fonts Used 18 | 19 | 20 | 2 21 | 22 | 23 | Theme 24 | 25 | 26 | 1 27 | 28 | 29 | Slide Titles 30 | 31 | 32 | <%= slides.length %> 33 | 34 | 35 | 36 | 37 | 38 | Arial 39 | Calibri 40 | Office Theme 41 | <% slides.each do |slide| %> 42 | <%= slide.title %> 43 | <% end %> 44 | 45 | 46 | 47 | false 48 | false 49 | false 50 | 15.0000 51 | -------------------------------------------------------------------------------- /lib/powerpoint/views/content_type.xml.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | <% file_types.each do |type| %> 6 | 7 | <% end %> 8 | 9 | 10 | <% slides.each_with_index do |slide, index| %> 11 | 12 | <% end %> 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /lib/powerpoint/views/intro_slide.xml.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | <%= title %> 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | <%= subtitile %> 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /lib/powerpoint/views/pictorial_rel.xml.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /lib/powerpoint/views/pictorial_slide.xml.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | <%= title %> 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | <% if coords.any? %> 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | <% else %> 74 | 75 | <% end %> 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /lib/powerpoint/views/picture_description_rels.xml.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /lib/powerpoint/views/picture_description_slide.xml.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | <%= title %> 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | <% if coords.any? %> 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | <% else %> 74 | 75 | <% end %> 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | <% content.each_with_index do |c, index| %> 92 | 93 | 94 | 95 | <%= c %> 96 | 97 | <% if content.length == (index + 1) %> 98 | 99 | <% end %> 100 | 101 | <% end %> 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | -------------------------------------------------------------------------------- /lib/powerpoint/views/presentation.xml.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | <% slides.each_with_index do |slide, index| %> 8 | 9 | <% end %> 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | -------------------------------------------------------------------------------- /lib/powerpoint/views/presentation.xml.rel.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | <% slides.each_with_index do |slide, index| %> 9 | <% id = 5 + (index+1) %> 10 | 11 | <% end %> 12 | -------------------------------------------------------------------------------- /lib/powerpoint/views/text_picture_split_rel.xml.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /lib/powerpoint/views/text_picture_split_slide.xml.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | <%= title %> 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | <% content.each_with_index do |c, index| %> 56 | 57 | 58 | 59 | <%= c %> 60 | 61 | <% if content.length == (index + 1) %> 62 | 63 | <% end %> 64 | 65 | <% end %> 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | <% if coords.any? %> 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | <% else %> 101 | 102 | <% end %> 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | -------------------------------------------------------------------------------- /lib/powerpoint/views/textual_rel.xml.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /lib/powerpoint/views/textual_slide.xml.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | <%= title %> 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | <% content.each_with_index do |c, index| %> 56 | 57 | 58 | 59 | <%= c %> 60 | 61 | <% if content.length == (index + 1) %> 62 | 63 | <% end %> 64 | 65 | <% end %> 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /powerpoint.gemspec: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | lib = File.expand_path('../lib', __FILE__) 3 | $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) 4 | require 'powerpoint/version' 5 | 6 | Gem::Specification.new do |spec| 7 | spec.name = "powerpoint" 8 | spec.version = Powerpoint::VERSION 9 | spec.authors = ["pythonicrubyist"] 10 | spec.email = ["pythonicrubyist@gmail.com"] 11 | spec.description = %q{A Ruby gem that can create a PowerPoint presentation.} 12 | spec.summary = %q{powerpoint is a Ruby gem that can create a PowerPoint presentation based on a standard pptx template.} 13 | spec.homepage = "https://github.com/pythonicrubyist/powerpoint" 14 | spec.license = "MIT" 15 | 16 | spec.files = `git ls-files`.split($/) 17 | spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } 18 | spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) 19 | spec.require_paths = ["lib"] 20 | 21 | spec.required_ruby_version = '>= 1.9.2' 22 | 23 | spec.add_development_dependency "bundler", "~> 1.3" 24 | spec.add_development_dependency "rake" 25 | spec.add_development_dependency 'rspec', '~> 2.13.0' 26 | spec.add_development_dependency 'pry' 27 | 28 | 29 | spec.add_dependency 'rubyzip', '~> 1' 30 | spec.add_dependency 'fastimage', '~> 1' 31 | end 32 | -------------------------------------------------------------------------------- /samples/images/sample_gif.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythonicrubyist/powerpoint/3622186613b5bd09d076ddf550d3083f143b3a47/samples/images/sample_gif.gif -------------------------------------------------------------------------------- /samples/images/sample_jpg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythonicrubyist/powerpoint/3622186613b5bd09d076ddf550d3083f143b3a47/samples/images/sample_jpg.jpg -------------------------------------------------------------------------------- /samples/images/sample_png.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythonicrubyist/powerpoint/3622186613b5bd09d076ddf550d3083f143b3a47/samples/images/sample_png.png -------------------------------------------------------------------------------- /samples/pptx/sample.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythonicrubyist/powerpoint/3622186613b5bd09d076ddf550d3083f143b3a47/samples/pptx/sample.pptx -------------------------------------------------------------------------------- /spec/test_spec.rb: -------------------------------------------------------------------------------- 1 | require 'powerpoint' 2 | 3 | describe 'Powerpoint parsing a sample PPTX file' do 4 | before(:all) do 5 | @deck = Powerpoint::Presentation.new 6 | @deck.add_intro 'Bicycle Of the Mind', 'created by Steve Jobs' 7 | @deck.add_textual_slide 'Why Mac?', ['Its cool!', 'Its light!'] 8 | @deck.add_textual_slide 'Why Iphone?', ['Its fast!', 'Its cheap!'] 9 | @deck.add_pictorial_slide 'JPG Logo', 'samples/images/sample_png.png' 10 | @deck.add_text_picture_slide('Text Pic Split', 'samples/images/sample_png.png', content = ['Here is a string', 'here is another']) 11 | @deck.add_pictorial_slide 'PNG Logo', 'samples/images/sample_png.png' 12 | @deck.add_picture_description_slide('Pic Desc', 'samples/images/sample_png.png', content = ['Here is a string', 'here is another']) 13 | @deck.add_picture_description_slide('JPG Logo', 'samples/images/sample_jpg.jpg', content = ['descriptions']) 14 | @deck.add_pictorial_slide 'GIF Logo', 'samples/images/sample_gif.gif', {x: 124200, y: 3356451, cx: 2895600, cy: 1013460} 15 | @deck.add_textual_slide 'Why Android?', ['Its great!', 'Its sweet!'] 16 | @deck.save 'samples/pptx/sample.pptx' # Examine the PPTX file 17 | end 18 | 19 | it 'Create a PPTX file successfully.' do 20 | #@deck.should_not be_nil 21 | end 22 | end 23 | -------------------------------------------------------------------------------- /template/_rels/.rels: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /template/docProps/core.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Powerpoint 4 | Nobody 5 | 1 6 | 2015-07-15T00:51:18Z 7 | -------------------------------------------------------------------------------- /template/ppt/_rels/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythonicrubyist/powerpoint/3622186613b5bd09d076ddf550d3083f143b3a47/template/ppt/_rels/.keep -------------------------------------------------------------------------------- /template/ppt/media/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythonicrubyist/powerpoint/3622186613b5bd09d076ddf550d3083f143b3a47/template/ppt/media/.keep -------------------------------------------------------------------------------- /template/ppt/presProps.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /template/ppt/slideLayouts/_rels/slideLayout1.xml.rels: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /template/ppt/slideLayouts/_rels/slideLayout10.xml.rels: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /template/ppt/slideLayouts/_rels/slideLayout11.xml.rels: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /template/ppt/slideLayouts/_rels/slideLayout2.xml.rels: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /template/ppt/slideLayouts/_rels/slideLayout3.xml.rels: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /template/ppt/slideLayouts/_rels/slideLayout4.xml.rels: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /template/ppt/slideLayouts/_rels/slideLayout5.xml.rels: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /template/ppt/slideLayouts/_rels/slideLayout6.xml.rels: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /template/ppt/slideLayouts/_rels/slideLayout7.xml.rels: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /template/ppt/slideLayouts/_rels/slideLayout8.xml.rels: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /template/ppt/slideLayouts/_rels/slideLayout9.xml.rels: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /template/ppt/slideLayouts/slideLayout1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | Click to edit Master title style 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | Click to edit Master subtitle style 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 7/14/15 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | ‹#› 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | -------------------------------------------------------------------------------- /template/ppt/slideLayouts/slideLayout10.xml: -------------------------------------------------------------------------------- 1 | 2 | Click to edit Master title styleClick to edit Master text stylesSecond levelThird levelFourth levelFifth level7/14/15‹#› -------------------------------------------------------------------------------- /template/ppt/slideLayouts/slideLayout11.xml: -------------------------------------------------------------------------------- 1 | 2 | Click to edit Master title styleClick to edit Master text stylesSecond levelThird levelFourth levelFifth level7/14/15‹#› -------------------------------------------------------------------------------- /template/ppt/slideLayouts/slideLayout2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | Click to edit Master title style 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | Click to edit Master text styles 60 | 61 | 62 | 63 | 64 | 65 | 66 | Second level 67 | 68 | 69 | 70 | 71 | 72 | 73 | Third level 74 | 75 | 76 | 77 | 78 | 79 | 80 | Fourth level 81 | 82 | 83 | 84 | 85 | 86 | 87 | Fifth level 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 7/14/15 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | ‹#› 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | -------------------------------------------------------------------------------- /template/ppt/slideLayouts/slideLayout3.xml: -------------------------------------------------------------------------------- 1 | 2 | Click to edit Master title styleClick to edit Master text styles7/14/15‹#› -------------------------------------------------------------------------------- /template/ppt/slideLayouts/slideLayout4.xml: -------------------------------------------------------------------------------- 1 | 2 | Click to edit Master title styleClick to edit Master text stylesSecond levelThird levelFourth levelFifth levelClick to edit Master text stylesSecond levelThird levelFourth levelFifth level7/14/15‹#› -------------------------------------------------------------------------------- /template/ppt/slideLayouts/slideLayout5.xml: -------------------------------------------------------------------------------- 1 | 2 | Click to edit Master title styleClick to edit Master text stylesClick to edit Master text stylesSecond levelThird levelFourth levelFifth levelClick to edit Master text stylesClick to edit Master text stylesSecond levelThird levelFourth levelFifth level7/14/15‹#› -------------------------------------------------------------------------------- /template/ppt/slideLayouts/slideLayout6.xml: -------------------------------------------------------------------------------- 1 | 2 | Click to edit Master title style7/14/15‹#› -------------------------------------------------------------------------------- /template/ppt/slideLayouts/slideLayout7.xml: -------------------------------------------------------------------------------- 1 | 2 | 7/14/15‹#› -------------------------------------------------------------------------------- /template/ppt/slideLayouts/slideLayout8.xml: -------------------------------------------------------------------------------- 1 | 2 | Click to edit Master title styleClick to edit Master text stylesSecond levelThird levelFourth levelFifth levelClick to edit Master text styles7/14/15‹#› -------------------------------------------------------------------------------- /template/ppt/slideLayouts/slideLayout9.xml: -------------------------------------------------------------------------------- 1 | 2 | Click to edit Master title styleClick to edit Master text styles7/14/15‹#› -------------------------------------------------------------------------------- /template/ppt/slideMasters/_rels/slideMaster1.xml.rels: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /template/ppt/slideMasters/slideMaster1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | Click to edit Master title style 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | Click to edit Master text styles 85 | 86 | 87 | 88 | 89 | 90 | 91 | Second level 92 | 93 | 94 | 95 | 96 | 97 | 98 | Third level 99 | 100 | 101 | 102 | 103 | 104 | 105 | Fourth level 106 | 107 | 108 | 109 | 110 | 111 | 112 | Fifth level 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 7/14/15 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | ‹#› 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | 505 | -------------------------------------------------------------------------------- /template/ppt/slides/_rels/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythonicrubyist/powerpoint/3622186613b5bd09d076ddf550d3083f143b3a47/template/ppt/slides/_rels/.keep -------------------------------------------------------------------------------- /template/ppt/tableStyles.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /template/ppt/theme/theme1.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /template/ppt/viewProps.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | --------------------------------------------------------------------------------