我正在开发一个 Shiny 应用程序,它可以读取用户上传的 Word 文档。然后,上传的文档会显示文档中所有元素及其格式的表格。我希望它还显示上传的 Word 文档中的任何图片。包含多张图片的文档不是问题 - 用户只会上传带有一张图片的文档。
为此,我正在使用该officer
软件包。它有一个函数叫做media_extract
你可以做我想做的事。问题是,虽然文档说此功能可用于从 .doc 或 .ppt 文件中提取图像,但我只能让它为后者工作。这是因为media_extract
将图像文件路径作为参数,但我无法为 Word 文档生成文件路径。officer
文件路径是根据文件类型使用两个函数之一生成的:docx_summary
或pptx_summary
. 这些也是我用来生成在我的应用程序中呈现的表格的函数。pptx_summary
创建一个包含一列的表,media_path
其中显示图像元素的文件路径,而docx_summary
不生成这样的列。如果没有该列及其包含的路径,我不知道如何使用此功能从 Word 文档中提取图像。
为方便起见,这是我的两个 Shiny 应用程序的代码:一个用于阅读 powerpoint,另一个用于 Word 文档。如果您上传包含图像的 PowerPoint 文件和 Word 文件,您将看到每个应用程序中生成的表格有何不同。我的 powerpoint 应用程序还呈现图像,向您展示这是如何完成的。显然,该功能不在我的应用程序中......
PowerPoint阅读器应用程序:
library(officer)
library(DT)
library(shiny)
ui<- fluidPage(
titlePanel("Document Scanner"),
sidebarLayout(
sidebarPanel(
fileInput("uploadedfile", "Upload a file", multiple=FALSE,
accept=c(".ppt", ".pptx", ".docx"))
),
mainPanel(
tags$h3(tags$b("Document Summary")),
br(),
DT::dataTableOutput("display_table"),
br(),
imageOutput("myImage")
)
)
)
server<-function(input,output) {
#creating reactive value for uploaded file
x<-reactive({
uploadedfileDF<- input$uploadedfile
uploadedfileDataPath<- uploadedfileDF$datapath
read_pptx(uploadedfileDataPath)
})
#rendering formatting table
output$display_table<-DT::renderDataTable({
req(input$uploadedfile)
DT::datatable(pptx_summary(x()))
})
#rendering images from powerpoint
output$myImage<-renderImage({
readFile<-x()
fileSummaryDF<-pptx_summary(readFile)
#Getting path to image (this is basically straight from the documentation
#for media_extract)
fileSummaryDF_filtered<- fileSummaryDF[fileSummaryDF$content_type %in% "image", ]
media_file <- fileSummaryDF_filtered$media_file
png_file <- tempfile(fileext = ".png")
media_extract(readFile, path = media_file, target = png_file)
list(src = png_file,
alt="Test Picture")
})
}
shinyApp(ui, server)
文字阅读器应用程序:
library(officer)
library(DT)
library(shiny)
ui<- fluidPage(
titlePanel("Word Doc Scanner"),
sidebarLayout(
sidebarPanel(
fileInput("uploadedfile", "Upload a file", multiple=FALSE,
accept=c(".doc", ".docx"))
),
mainPanel(
tags$h3(tags$b("Document Summary")),
br(),
DT::dataTableOutput("display_table"),
imageOutput("image1")
)
)
)
server<-function(input,output) {
# creating reactive content from uploaded file
x<-reactive({
print(input$uploadedfile)
uploadedfileDF<- input$uploadedfile
uploadedfileDataPath<- uploadedfileDF$datapath
docDF<-read_docx(path=uploadedfileDataPath)
summaryDF<-docx_summary(docDF)
})
#rendering formatting table
output$display_table<-DT::renderDataTable({
req(input$uploadedfile)
DT::datatable(x())
})
#how to render image without a image path anywhere in table?
}
shinyApp(ui, server)
如果无法做到这一点,officer
那么我很乐意以不同的方式做到这一点。谢谢你。