merge_pptx = function(a, b, filename) {
# go through the slides of b
for (index in 1:length(source$slide$get_metadata())) {
# We need a new filename in the target's slide directory
new_slidename <- target$slide$get_new_slidename()
xml_file <- file.path(target$package_dir, "ppt/slides", new_slidename)
# Copy XML from source to new filename
orgFilename = source$slide$get_metadata()[index, "filename"]
newFilepath = paste(target$package_dir, newFilename, sep="/")
file.copy(orgFilename, xml_file)
# Not sure yet, what exactly this does
slide_info <- target$slideLayouts$get_metadata()[1,] # Use first best layout at the moment
layout_obj <- target$slideLayouts$collection_get(slide_info$filename)
layout_obj$write_template(xml_file)
# update presentation elements
target$presentation$add_slide(target = file.path("slides", new_slidename))
target$content_type$add_slide(partname = file.path("/ppt/slides", new_slidename))
# Add the slide to the collection
target$slide$add_slide(xml_file, target$slideLayouts$get_xfrm_data())
target$cursor <- target$slide$length()
}
print(target, target=filename)
}
source = read_pptx("One.pptx")
target = read_pptx("Two.pptx")
merge_pptx(source, target, "Combined.pptx")
2条答案
按热度按时间x0fgdtte1#
我相信目前在R中还没有这样的函数或包,所以我将向您推荐几个可能的解决方案。
1:我相信你可以使用
read_pptx()
来读取deck1和deck2文件。然后,循环deck2的幻灯片索引,并使用这些值将add_slide()
转换为deck1。我认为在officer中有一个名为pptx_summary()
的函数,它将pptx R对象转换为tibble,但我不确定你是否可以将tibble转换回pptx R对象。2:你可以将pptx文件转换成pdf文件,然后使用
pdftools
来连接它们。xn1cxnb42#
当通过R自动创建PowerPoint幻灯片时(例如通过使用R markdown的PowerPoint导出),将它们与预先制作好的固定幻灯片(例如用精致的视觉效果进行解释)合并可能是必要的。由于到目前为止似乎没有单行解决方案,这里是一个3年前的问题的不完整答案。
查看一下
OfficeR
的源代码可以发现,该包在后台使用一个数据结构和一个临时文件夹,该文件夹包含压缩到XLSX文件中的XML文件。因此,复制幻灯片需要:以更新结构,并最终复制XML文件和其他资源。下面是一个非常粗略的草案,说明如何基于
OfficeR
类合并两个PowerPoint文件。请注意,这只是一个草稿。它还没有考虑到不同的幻灯片布局,甚至没有谈到不同的母版。嵌入文件(图像)还没有复制。
此函数的大部分灵感来自
dir_slide
类中的add_slide()
函数,请参见https://github.com/davidgohel/officer/blob/master/R/ppt_class_dir_collection.R