R-在Shiny下载并显示PDF



我试图在shinyapps.io上的应用程序中从网络周围显示一些PDF。不幸的是,由于混合符号保障措施(通过HTTP提供了PDF(,因此无法选择与URL一起使用iFrame的标准方法。我认为可能的选择是从URL下载PDF,然后从本地文件中显示它们,但我无法与tempfile()一起使用。

示例应用程序:

ui <- fluidPage(
  sidebarLayout(
      sidebarPanel(
        textInput("url", "add a url"),
        actionButton("button","hit the button"),
        h5("use case - embed a pdf user guide in the app - embed as a local pdf or from web URL")
      ), 
      mainPanel(
        tabsetPanel(
          tabPanel("PDF", 
                   htmlOutput("pdf")
                   )
          )
        )
      )
)
server <- function(input, output, session) {
  observeEvent(input$button, {
    temp <- tempfile(fileext = ".pdf")
    download.file(input$url, temp)
    output$pdf <- renderUI({
      tags$iframe(src=temp)
    })
  })
}
shinyApp(ui, server)

示例PDF:http://www.pdf995.com/samples/pdf.pdf

当我在浏览器中打开它时,我会在浏览器控制台中出现错误: Not allowed to load local resource: file:///C:/Users/.../Local/Temp/Rtmp8subWX/file19403a2a2fc8.pdf,在面板中没有iframe为。

类似的尝试上传到shinyapps.io也失败了,显示了PDF查看器中的404 Not Found错误。

我认为这可能是闪亮/shinyapps.io处理临时文件的问题,但不能完全弄清楚。谢谢。

您需要在当前目录的子文件夹中以二进制模式下载pdf,然后致电addResourcePath以允许Shininy使用:

  observeEvent(input$button, {
    pdf_folder <- "pdf_folder"
    if(!file.exists(pdf_folder))
      dir.create("pdf_folder")
    temp <- tempfile(fileext = ".pdf", tmpdir = "pdf_folder")
    download.file(input$url, temp, mode = "wb")
    addResourcePath("pdf_folder",pdf_folder)
    output$pdf <- renderUI({
      tags$iframe(src=temp)
    })
  })