如何使用 r 中的 media_extract 从 word 和 powerpoint 中提取图像?

Posted

技术标签:

【中文标题】如何使用 r 中的 media_extract 从 word 和 powerpoint 中提取图像?【英文标题】:How to extract images from word and powerpoint using media_extract in r? 【发布时间】:2021-11-30 04:17:45 【问题描述】:

我正在 rmarkdown 中工作以生成一份报告,该报告提取并显示从 word 和 powerpoint 中提取的图像。

为此,我使用了officer包。它有一个名为 media_extract 的函数,可以“从 rdocx 或 rpptx 对象中提取文件”。

我有两个问题:

    找到图像后如何查看或使用它。 在word中,如何定位没有media_path列的图像。

我已经能够使用此函数在 pptx 中定位图像:pptx_summary 函数创建一个带有 media_path 列的数据框,该列显示图像元素的文件路径。然后将 media_path 用作 media_extract 函数中的参数来定位图像。请参阅下面的包文档中的示例代码:

example_pptx <- system.file(package = "officer",
  "doc_examples/example.pptx")
doc <- read_pptx(example_pptx)
content <- pptx_summary(doc)
image_row <- content[content$content_type %in% "image", ]
media_file <- image_row$media_file
png_file <- tempfile(fileext = ".png")
media_extract(doc, path = media_file, target = png_file)

但是,当我运行 media_extract 时,它返回“TRUE”,这是示例输出,但我不确定如何将图像添加到我的报告中。我尝试将 media_extract 分配为一个值,例如

image <- media_extract(doc, path = media_file, target = png_file)

但这会返回 'FALSE'。

如何将图片作为图片包含在我的报告中?

我遇到的第二个问题是如何在 word 中定位图像。 media_extract 的文档说它可以用来从 .docx 和 .pptx 中提取图像,我只设法让它为后者工作。我无法为 .docx 创建文件路径。

文件路径是使用任一生成的; docx_summarypptx_summary,取决于文件类型,它们创建文件的数据框摘要。 pptx_summary 包含一列 media_path,它显示图像的文件路径。 docx_summary 数据框不包含此列。另一个*** post 提出了一个使用word/media/ 子目录的解决方案,似乎可行,但我不确定这意味着什么或如何使用它?

如何使用word/media/ subdir 作为媒体路径从word doc 中提取图片?

【问题讨论】:

您需要将png_file值更改为您选择的路径,例如png_file &lt;- "your_file.png",然后添加markdown图像代码![your_file.png]()。如果操作按预期进行,则 media_extract 的结果是布尔值 TRUE。 @DavidGohel 请作为答案发布。 【参考方案1】:

media_extract() 是一种将媒体复制到您想要的位置的功能。我们可以使用 R Markdown 显示提取的图像,至少有 3 种方法:

knitr::include_graphics() 常规降价 magick::image_read()

如下图所示:

---
title: "media_extract usage"
output: html_document
---

```r setup, include=FALSE
knitr::opts_chunk$set(echo = TRUE)
library(officer)
library(flextable)
example_pptx <- system.file(package = "officer",
  "doc_examples/example.pptx")
doc <- read_pptx(example_pptx)
content <- pptx_summary(doc)
image_row <- content[content$content_type %in% "image", ]
media_file <- image_row$media_file
png_file <- tempfile(fileext = ".png")
media_extract(doc, path = media_file, target = png_file)
```

## include_graphics

```r out.
knitr::include_graphics(png_file)
```

## markdown

You can't use `tempfile()` here - path is better when defined as relative.
Let's write it to "./file.png". 

```r results='hide'
media_extract(doc, path = media_file, target = "file.png")
```

![](file.png)style="width:200px;"

## magick

```r out.
magick::image_read(png_file)
```

【讨论】:

谢谢!这很有帮助【参考方案2】:

我一直在研究第二期,找到了答案,所以想分享一下!

我从 docx 中提取图像的困难是由于摘要数据框中没有 media_file 列(使用 docx_summary 生成),该列用于定位所需的图像。此列存在于为 pptx pptx_summary 生成的数据框中,并用于包文档中的示例代码。

在没有此列的情况下,您需要使用文档子目录(当 docx 为 XML 格式时的文件路径)来定位图像,如下所示:media_path &lt;- "/word/media/image3.png"

如果你想看看这个结构是什么样的,你可以右键单击你的文档>7-Zip>提取文件.. 将创建一个包含文档内容的文件夹,否则只需更改图像编号以选择所需的图像. 注意:有时图像的名称不符合 image.png 格式,因此您可能需要提取文件以找到所需图像的名称。

将 media_extract 与 docx 结合使用的示例。

#extracting image from word doc using officer package 

report <- read_docx("/Users/user.name/Documents/mydoc.docx")

png_file <- tempfile(fileext = ".png")

media_file <- "/word/media/image3.png"

media_extract(report, path = media_file, target = png_file)

【讨论】:

以上是关于如何使用 r 中的 media_extract 从 word 和 powerpoint 中提取图像?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 R 中的 rvest 通过以下方式从 Wikipedia 获取“类别”?

如何绘制从使用 R 中的“caret”包创建的随机森林中选择的树

如何使用 R 中的纬度/经度边界从 netCDF 文件中获取子集

如何从r中的.ini文件中提取数据?

如何使用 selectInput 从 R 中的数据框中选择特定列?

从SPSS导入时如何从R中的数据框中删除空格