Как извлечь изображения из загруженного текстового документа в Shiny
Я работаю над приложением Shiny, которое читает документы Word, загруженные пользователями. Загруженный документ затем отображает таблицу всех элементов в документе и их форматирование. Я хочу, чтобы он также показывал любые картинки из загруженного документа Word. Документы, содержащие несколько изображений, не являются проблемой - пользователи будут загружать документы только с одним изображением.
Для этого я использую officer
пакет. Имеет функцию под названием media_extract
где вы можете делать именно то, что я хочу. Проблема в том, что, хотя в документации сказано, что эту функцию можно использовать для извлечения изображений из файлов.doc или.ppt, я могу заставить ее работать только для последних. Это потому что media_extract
принимает путь к файлу изображения в качестве аргумента, но я не могу сгенерировать путь к файлу для документов Word. Путь к файлу генерируется с помощью одного из двух officer
функции в зависимости от типа файла: docx_summary
или же pptx_summary
, Это также функции, которые я использую для генерации таблиц, отображаемых в моем приложении. pptx_summary
создает таблицу с media_path
столбец, в котором отображается путь к файлу для элементов изображения, а docx_summary
не генерирует такой столбец. В отсутствие этого столбца и пути к нему я не знаю, как извлечь изображения из документов Word с помощью этой функции.
Для вашего удобства, вот мой код для двух приложений Shiny: одно для чтения powerpoints, а другое для word docs. Если вы загрузите файл 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
тогда я счастлив сделать это по-другому. Спасибо.