我正在开发一个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)
Word阅读器应用程序:
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
中完成此操作,那么我很乐意以其他方式进行操作。谢谢。