R офицерский пакет: добавить номера слайдов, которые отражают текущее положение слайдов - PullRequest
0 голосов
/ 22 мая 2018

Я заядлый пользователь пакетов Reporter и Officer и в настоящее время пытаюсь перейти к Officer для рабочего процесса Powerpoint.Я использую шаблон слайда, который включает заполнители номера слайда в мастере.

При использовании Reporter я могу добавить номера слайдов, используя doc <-addPageNumber( doc ), и номера страниц отражают текущую позицию каждого слайда в колоде.Я ищу ту же функциональность в Officer и ищу номера слайдов, чтобы они соответствующим образом обновлялись при перемещении слайдов.

Когда я использую ph_with_text(doc, type = "sldNum", str = "slide 1"), мне необходимо предоставить строку со статическим числом или текстом, и она не обновляется в зависимости от того, где слайд появляется в колоде.Например, если я знаю, что моим слайдом будет слайд 2, я могу ввести str = "2", но тогда номер слайда будет читаться как 2, даже если я переместу этот слайд в позицию слайда 3 в презентации.

Я попытался оставить строку пустой с str = "" или с ph_empty(type= "sldNum"), но в результате на слайде появилась строка «Номер слайда».

Буду признателен за любую помощь или указатели в правильном направлении!

Ответы [ 3 ]

0 голосов
/ 08 мая 2019

После того, как я закончил с презентацией, я успешно добавил номера страниц с использованием сотрудника 0.3.4 с циклом for.

library(officer)
library(magrittr)

my_pres <- read_pptx()  %>% 
  add_slide('Title Only', 'Office Theme') %>%
  ph_with(value = 'Slide 2 Title', location = ph_location_type(type = "title")) %>%
  add_slide('Title Only', 'Office Theme') %>%
  ph_with(value = 'Slide 3 Title', location = ph_location_type(type = 'title')) 

# add slide numbers starting on slide 2

n_slides <- length(my_pres)
for (i_slide in 2:n_slides) {
  my_pres <- my_pres %>%
    on_slide(index = i_slide) %>%
    ph_with(value = i_slide, location = ph_location_type('sldNum'))
}
0 голосов
/ 11 июля 2019

Я пришел сюда в поисках более элегантного решения, чем у меня, но я подумал, что по крайней мере предложу это, потому что оно технически решает вашу / нашу проблему, просто неуверенно.

Это облегчает перемещениевокруг слайдов, не беспокоясь о номерах слайдов, но это также приводит к небольшому смещению, и вы должны быть осторожны, увеличивая его, даже если у вас нет слота с номерами слайдов (как в случае моего слайда «Заголовок»).

Альтернативой является написание простого оператора приращения а-ля на этот вопрос .

presentation_name_here <- officer::read_pptx("Presentations/Template.pptx")

slide_number <- 1

# Title slide -----------------------------------------------------------
presentation_name_here <- presentation_name_here %>%
  add_slide(layout = "Title Slide", master = "Office Theme") %>%
  ph_with(value = "Title", location = ph_location_label(ph_label = "Title")) %>%
slide_number <- slide_number + 1

# Executive summary -----------------------------------------------------
presentation_name_here <- presentation_name_here %>%
  add_slide(layout = "Title and Content", master = "Office Theme") %>%
  ph_with(value = "Executive summary", location = ph_location_label(ph_label = "Title")) %>%
  ph_with(value = slide_number, location = ph_location_label(ph_label = "Slide Number")) %>%
slide_number <- slide_number + 1

# Dashboard ---------------------------------------------------------------
presentation_name_here <- presentation_name_here %>%
  add_slide(layout = "Title and Content", master = "Office Theme") %>%
  ph_with(value = "Dashboard", location = ph_location_label(ph_label = "Title")) %>%
  ph_with(value = slide_number, location = ph_location_label(ph_label = "Slide Number"))
0 голосов
/ 05 февраля 2019

Столкнувшись с похожей проблемой с офицером и просмотрев исходный код, я нашел следующее решение

ph_with_text_fld(doc, type = "sldNum", str = "2")

Код этой функции следующий:

library(htmltools)
library(xml2)

ph_with_text_fld <- function( x, str, type = "title", index = 1 ){

  stopifnot( type %in% c("ctrTitle", "subTitle", "dt", "ftr", "sldNum", "title", "body") )

  slide <- x$slide$get_slide(x$cursor)
  sh_pr_df <- slide$get_xfrm(type = type, index = index)
  sh_pr_df$str <- str
  xml_elt <- do.call(pml_shape_str_fld, sh_pr_df)
  node <- as_xml_document(xml_elt)

  xml_add_child(xml_find_first(slide$get(), "//p:spTree"), node)

  slide$fortify_id()
  x
}

pml_shape_str_fld <- function(str, ph, offx, offy, cx, cy, ...) {

  sp_pr <- sprintf("<p:spPr><a:xfrm><a:off x=\"%.0f\" y=\"%.0f\"/><a:ext cx=\"%.0f\" cy=\"%.0f\"/></a:xfrm></p:spPr>", offx, offy, cx, cy)
  # sp_pr <- "<p:spPr/>"
  nv_sp_pr <- "<p:nvSpPr><p:cNvPr id=\"\" name=\"\"/><p:cNvSpPr><a:spLocks noGrp=\"1\"/></p:cNvSpPr><p:nvPr>%s</p:nvPr></p:nvSpPr>"
  nv_sp_pr <- sprintf( nv_sp_pr, ifelse(!is.na(ph), ph, "") )
  paste0( pml_with_ns("p:sp"),
          nv_sp_pr, sp_pr,
          "<p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id=\"{GUID FROM THE MASTER TEMPLATE}\" type=\"slidenum\"><a:rPr/><a:t>",
          htmlEscape(str),
          "</a:t></a:fld></a:p></p:txBody></p:sp>"
  )
}

pml_with_ns <- function(x){
  base_ns <- "xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\""
  sprintf("<%s %s>", x, base_ns)
}

Важной частью является

<a:fld id=\"{GUID FROM THE MASTER TEMPLATE}\" type=\"slidenum\">

, где GUID ИЗ ШАБЛОНА МАСТЕРА необходимо заменить на GUID из схемы Slidemaster для этого поля

...