library(officer)
# Package `magrittr` makes officer usage easier.
library(magrittr)
##
## Attaching package: 'magrittr'
## The following object is masked from 'package:tidyr':
##
## extract
Use the function read_pptx
to create an r object representing a PowerPoint document. Initial PowerPoint file can be specified with argument path
. If none is provided, this file will be an empty document located in the package directory. Formats and available slide layouts will be those available in the template file. Content of original document is also preserved (but can be manipulated, i.e. delete a slide).
my_pres <- read_pptx()
Next thing to do is to add a new slide, use function add_slide
. It requires 3 arguments:
my_pres <- my_pres %>%
add_slide(layout = "Title and Content", master = "Office Theme")
layout
and master
values must match values from the initial document. Layout names and master layout names are not available in a tidy view within PowerPoint, but theses can be read easily with function layout_summary
.
layout_summary(my_pres)
## layout master
## 1 Title Slide Office Theme
## 2 Title and Content Office Theme
## 3 Section Header Office Theme
## 4 Two Content Office Theme
## 5 Comparison Office Theme
## 6 Title Only Office Theme
## 7 Blank Office Theme
officer
uses a PowerPoint file as initial document. This is the original PowerPoint document where all slides layouts, shapes (placeholders) and styles come from. Major points to be aware of are:
Use function ph_with_text
to add text into a new shape. The type of the shape is defined in the slide layout associated to the current slide, for example, using type = "title"
will create a title shape in the slide.
my_pres <- my_pres %>%
ph_with_text(type = "title", str = "A title") %>%
ph_with_text(type = "ftr", str = "A footer") %>%
ph_with_text(type = "dt", str = format(Sys.Date())) %>%
ph_with_text(type = "sldNum", str = "slide 1") %>%
ph_with_text(str = "Hello world", type = "body")
Function
layout_properties
provides details about available shapes of a slide layout:
layout_properties ( x = my_pres, layout = "Two Content", master = "Office Theme" ) %>% head()
## master_name name type id ph_label offx
## 14 Office Theme Two Content title 2 Title 1 0.500000
## 15 Office Theme Two Content body 3 Content Placeholder 2 0.500000
## 16 Office Theme Two Content body 4 Content Placeholder 3 5.083333
## 17 Office Theme Two Content dt 5 Date Placeholder 4 0.500000
## 18 Office Theme Two Content ftr 6 Footer Placeholder 5 3.416667
## 19 Office Theme Two Content sldNum 7 Slide Number Placeholder 6 7.166667
## offy cx cy
## 14 0.3003478 9.000000 1.2500000
## 15 1.7500000 4.416667 4.9496533
## 16 1.7500000 4.416667 4.9496533
## 17 6.9513889 2.333333 0.3993056
## 18 6.9513889 3.166667 0.3993056
## 19 6.9513889 2.333333 0.3993056
File can be generated using function print
and argument target
:
print(my_pres, target = "assets/pptx/first_example.pptx") %>%
invisible()
Download file first_example.pptx - view with office web viewer
There are 3 functions to let you manipulate slides: add_slide, remove_slide and on_slide.
A slide can be added with function add_slide
.
my_pres <- read_pptx() %>%
add_slide(layout = "Two Content", master = "Office Theme") %>%
add_slide(layout = "Title and Content", master = "Office Theme") %>%
add_slide(layout = "Title Only", master = "Office Theme")
length(my_pres)
## [1] 3
A Slide can be removed with function remove_slide
.
my_pres <- my_pres %>% remove_slide(index = 1)
length(my_pres)
## [1] 2
Selected slide can be set with function on_slide
.
my_pres <- my_pres %>% on_slide(index = 1)
Use function ph_with_text
to add text into a new shape. Argument type
specify which placeholder of the associated layout is to be added (index
is to be used when a type
is not unique in the slide layout).
doc <- read_pptx() %>%
add_slide(layout = "Two Content", master = "Office Theme") %>%
ph_with_text(type = "body", str = "A first text", index = 1) %>%
ph_with_text(type = "body", str = "A second text", index = 2) %>%
ph_with_text(type = "title", str = "A title") %>%
ph_with_text(type = "ftr", str = "Slide footer") %>%
ph_with_text(type = "dt", str = format(Sys.Date()))
print(doc, target = "assets/pptx/ph_with_text.pptx") %>%
invisible()
Download file ph_with_text.pptx - view with office web viewer
Again, use layout_properties
to see what are available placeholders in the slide layout.
Use function ph_with_img
to add an image into a placeholder. As for all ph_with_*
functions, argument type
specifies the placeholder of the associated layout to be added as a new shape (index
is to be used when an type
is not unique in the slide layout).
img.file <- file.path( Sys.getenv("R_HOME"), "doc", "html", "logo.jpg" )
doc <- read_pptx()
doc <- doc %>%
add_slide(layout = "Two Content", master = "Office Theme") %>%
ph_with_text(type = "body", str = "body (index 1) is text", index = 1) %>%
ph_with_img(type = "body", index = 2, src = img.file, height = 1.06, width = 1.39 )
print(doc, target = "assets/pptx/ph_with_img.pptx") %>%
invisible()
Download file ph_with_img.pptx - view with office web viewer
To add an image into a new shape at arbitrary coordinates, use function ph_with_img_at
. Arguments left
and top
are specifying the top left coordinate of the new shape and arguments width
and height
are specifying the dimensions of the new shape.
img.file <- file.path( Sys.getenv("R_HOME"), "doc", "html", "logo.jpg" )
doc <- read_pptx() %>%
add_slide(layout = "Title and Content", master = "Office Theme") %>%
ph_with_text(type = "title", str = "A image") %>%
ph_with_img_at(src = img.file, left = 3, top = 4,
height = 1.06, width = 1.39, rot = 45 )
print(doc, target = "assets/pptx/ph_with_img_at.pptx") %>%
invisible()
Download file ph_with_img_at.pptx - view with office web viewer
Use function ph_with_table
to add a table into a placeholder.
doc <- read_pptx()
doc <- doc %>%
add_slide(layout = "Title and Content", master = "Office Theme") %>%
ph_with_table(type = "body", value = head(mtcars) )
print(doc, target = "assets/pptx/ph_with_table.pptx") %>%
invisible()
Download file ph_with_table.pptx - view with office web viewer
To add a table into a new shape at arbitrary coordinates, use function ph_with_table_at
.
doc <- read_pptx()
doc <- doc %>%
add_slide(layout = "Title and Content", master = "Office Theme") %>%
ph_with_table_at(value = head(mtcars), left = 1, top = 3,
height = 7, width = 7 )
print(doc, target = "assets/pptx/ph_with_table_at.pptx") %>%
invisible()
Download file ph_with_table_at.pptx - view with office web viewer
Use slide_summary
to easily identify shapes in the slide that can be removed.
slide_summary(doc)
## # A tibble: 1 x 8
## type id ph_label offx offy cx cy
## <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
## 1 body 2 NA NA NA NA
## # ... with 1 more variables: text <chr>
In the following example, shape corresponding to type "body"
will be removed from the current slide:
doc <- ph_remove(x = doc, type = "body")
ph_empty
(ph_empty_at
) will add a new empty placeholder in the current slide. When using ph_with_text
, added text automatically inherits from the layout placeholder, ph_empty
gives more control on format of added text and paragraphs.
my_pres <- read_pptx() %>%
add_slide(layout = "Title and Content", master = "Office Theme") %>%
ph_empty(type = "body")
As there is not paragraph yet in the new shape, function ph_add_par
will be used to add a new paragraph. Then ph_add_text
will be used to add text into that new paragraph.
text_prop <- fp_text(color = "red", font.size = 20)
my_pres <- my_pres %>%
ph_add_par() %>%
ph_add_text(str = "This is a red text!", style = text_prop ) %>%
ph_add_par(level = 2) %>%
ph_add_text(str = "Level 2") %>%
ph_add_par(level = 3) %>%
ph_add_text(str = "Level 3")
print(my_pres, target = "assets/pptx/ph_add_text_1.pptx") %>%
invisible()
Download file ph_add_text_1.pptx - view with office web viewer
The following code produce a presentation made of one text shape containing text “A first text”.
my_pres <- read_pptx() %>%
add_slide(layout = "Title and Content", master = "Office Theme") %>%
ph_with_text(type = "body", str = "A first text")
There is a paragraph in the new shape, ph_add_par
will be used to add a new paragraph and ph_add_text
has to be used to add text into the last paragraph of the shape.
text_blue_prop <- update(text_prop, color = "blue" )
my_pres <- my_pres %>%
ph_add_text(str = "A small red text!", style = text_prop ) %>%
ph_add_text(str = "Blue text first... ", pos = "before", style = text_blue_prop ) %>%
ph_add_par(level = 2) %>%
ph_add_text(str = "additionnal paragraph")
print(my_pres, target = "assets/pptx/ph_add_text_2.pptx") %>%
invisible()
Download file ph_add_text_2.pptx - view with office web viewer
ph_hyperlink
add an hyperlink to an existing placeholder in the current slide. Argument href
should contain a valid URL (i.e. starting with http(s)
).
doc <- read_pptx() %>%
add_slide(layout = "Title and Content", master = "Office Theme") %>%
ph_with_text(type = "body", str = "Blah blah blah") %>%
ph_hyperlink(type = "body", href = "https://cran.r-project.org") %>%
add_slide(layout = "Title and Content", master = "Office Theme") %>%
ph_with_text(type = "body", str = "placeholder target")
print(doc, target = "assets/pptx/ph_hyperlink.pptx") %>%
invisible()
Download file ph_hyperlink.pptx - view with office web viewer
ph_slidelink
add an internal link into an existing placeholder. Argument slide_index
should contain the index of the target slide.
doc <- read_pptx() %>%
add_slide(layout = "Title and Content", master = "Office Theme") %>%
ph_with_text(type = "body", str = "Blah blah blah") %>%
add_slide(layout = "Title and Content", master = "Office Theme") %>%
ph_with_text(type = "body", str = "placeholder target") %>%
on_slide(index = 1 ) %>%
ph_slidelink(type = "body", slide_index = 2)
print(doc, target = "assets/pptx/ph_slidelink.pptx") %>%
invisible()
Download file ph_slidelink.pptx - view with office web viewer
Function ph_add_text
has an optional argument href
, if used, the chunk of text will be an hyperlink.
my_pres <- read_pptx() %>%
add_slide(layout = "Title and Content", master = "Office Theme") %>%
ph_with_text(type = "body", str = "An ") %>%
ph_add_text(str = "hyperlink", href = "https://cran.r-project.org" )
print(my_pres, target = "assets/pptx/ph_add_text_3.pptx") %>%
invisible()
Download file ph_add_text_3.pptx - view with office web viewer