Как извлечь изображения из загруженного текстового документа в Shiny - PullRequest
0 голосов
/ 14 ноября 2018

Я работаю над приложением 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, тогда я с радостью сделаю это по-другому. Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...