0

我正在开发一个 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)

文字阅读器应用程序:

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那么我很乐意以不同的方式做到这一点。谢谢你。

4

0 回答 0