如何从Shiny

时间:2018-11-13 21:16:08

标签: r shiny officer

我正在开发一个Shiny应用程序,该应用程序读取用户上传的Word文档。然后,上传的文档将显示该文档中所有元素及其格式的表格。我希望它也显示上传的Word文档中的所有图片。包含多个图像的文档不是问题-用户只能上传带有一个图像的文档。

为此,我正在使用officer软件包。它具有一个称为media_extract的功能,您可以在其中执行我想要的操作。问题是,尽管文档说此功能可用于从.doc或.ppt文件中提取图像,但我只能使它适用于后者。这是因为media_extract将图像文件路径作为参数,但是我无法为Word文档生成文件路径。通过使用两个officer函数之一来生成文件路径,具体取决于文件类型:docx_summarypptx_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中完成此操作,那么我很乐意以其他方式进行操作。谢谢。

0 个答案:

没有答案