【问题标题】:R officer package: Add slide numbers that reflect current slide positionR 官员包:添加反映当前幻灯片位置的幻灯片编号
【发布时间】:2018-11-01 15:17:55
【问题描述】:

我是 Reporters 和 Office 软件包的狂热用户,目前正尝试过渡到 Office 以进行 Powerpoint 工作流程。我正在使用包含幻灯片编号占位符的幻灯片模板。

使用 Reporters 时,我可以使用 doc <-addPageNumber( doc ) 添加幻灯片编号,并且页码反映了每张幻灯片在卡片组中的当前位置。我正在寻找 Office 中的相同功能,并在移动幻灯片时寻找幻灯片编号以适当更新。

当我使用ph_with_text(doc, type = "sldNum", str = "slide 1") 时,我需要提供一个带有静态数字或文本的字符串,并且它不会根据幻灯片在卡片组中出现的位置进行更新。例如,如果我知道我的幻灯片将是幻灯片 2,我可以输入 str = "2",但即使我将该幻灯片移动到演示文稿中的幻灯片 3 位置,幻灯片编号也会显示为 2。

我尝试使用str = ""ph_empty(type= "sldNum") 将字符串留空,但这些导致字符串“幻灯片编号”出现在幻灯片上。

任何正确方向的帮助或指示将不胜感激!

【问题讨论】:

    标签: r powerpoint officer


    【解决方案1】:

    遇到了与官员类似的问题并查看了源代码,我想出了以下解决方案

    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

    【讨论】:

      【解决方案2】:

      在完成演示后,我已经成功地使用带有 for 循环的 0.3.4 官员添加了页码。

      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'))
      }
      

      【讨论】:

      • 感谢发帖!这可以在页面上放置数字,但是仍然存在一个问题,即当我在生成的演示文稿中更改幻灯片顺序时,幻灯片编号不会像我在演示文稿中添加幻灯片编号那样更新以反映新位置我完全在 Powerpoint 中创建的。
      【解决方案3】:

      我来这里是为了寻找比我更优雅的解决方案,但我想我至少会提供这个,因为它在技术上确实解决了您/我们的问题,只是不太优雅。

      它可以更轻松地在幻灯片中移动而无需担心幻灯片编号,但它也有点笨拙,即使您没有幻灯片编号插槽,您也必须小心增加它(如以我的“标题”幻灯片为例)。

      另一种方法是为自己编写一个简单的增量运算符,例如 this question

      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"))
      

      【讨论】:

        【解决方案4】:

        我添加了自己的代码来查找基于András's answer 的 GUID:

        get.guid = function(doc, xml.file){
        
          xml.file.path = doc$slideLayouts$.__enclos_env__$private$collection[[xml.file]]$file_name()
        
          layout.xml = read_xml(xml.file.path)
        
          layout.xml %>% 
            xml_find_first("//a:fld[@type=\"slidenum\"]") %>%
            xml_attr("id") 
        
        }
        
        ph_with_text_fld <- function( x, str, type = "title", index = 1, slide_layout_name){
        
          stopifnot( type %in% c("ctrTitle", "subTitle", "dt", "ftr", "sldNum", "title", "body") )
        
          slide <- x$slide$get_slide(x$cursor)
        
          xml.file = slide$get_metadata()$layout_file %>% basename 
          guid = get.guid(x, xml.file)
        
          sh_pr_df <- slide$get_xfrm(type = type, index = index)
          sh_pr_df$str <- str
          sh_pr_df$guid <- guid
          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, guid, ...) {
        
          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, "\" 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)
        }
        

        【讨论】:

          猜你喜欢
          • 2022-01-24
          • 1970-01-01
          • 1970-01-01
          • 2018-01-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-10
          • 1970-01-01
          相关资源
          最近更新 更多