我想在shinyapps.io的应用程序中显示来自网络的一些PDF。遗憾的是,由于混合内容安全措施(pdf通过http提供),因此使用带有URL的iframe的标准方法不是一种选择。我认为可能的选择是从网址下载pdf,然后将其显示在本地文件的iframe中,但我无法使用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
错误。
我认为这可能是关于shine / shinyapps.io如何处理临时文件的一个问题,但是无法弄明白。感谢。
答案 0 :(得分:3)
您需要在当前目录的子文件夹中以二进制模式下载PDF,然后调用addResourcePath
以允许闪亮的服务:
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)
})
})