2017-05-02 6 views
2

Ich versuche, einige PDFs aus dem Internet in einer App auf glnnapps.io zu zeigen. Leider ist die standardmäßige Verwendung eines Iframes mit der URL aufgrund der Sicherheitsvorkehrungen für gemischte Inhalte (die PDF-Dateien werden über HTTP bereitgestellt) nicht möglich. Ich denke, dass eine mögliche Option darin besteht, die pdfs von der URL herunterzuladen und sie dann in einem iframe aus der lokalen Datei anzuzeigen, aber ich kann das nicht mit tempfile() arbeiten.Download und Anzeige von PDF in Shiny

Eine Probe App:

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) 

Beispiel pdf: http://www.pdf995.com/samples/pdf.pdf

Als ich das ich im Browser öffne einen Fehler in der Browser-Konsole erhalten: Not allowed to load local resource: file:///C:/Users/.../Local/Temp/Rtmp8subWX/file19403a2a2fc8.pdf und nichts in der Platte, wo der iframe ist .

Ein ähnlicher Versuch, der auf shinyapps.io hochgeladen wurde, ist ebenfalls fehlgeschlagen und zeigt einen 404 Not Found Fehler im PDF-Viewer.

Ich denke, das kann ein Problem sein, wie glänzend/glnnapps.io mit temporären Dateien umgehen, aber es nicht ganz herausfinden kann. Vielen Dank.

Antwort

3

Sie benötigen die PDF im Binär-Modus in einem Unterordner Ihres aktuellen Verzeichnisses herunterladen, dann addResourcePath nennen glänzend, damit sie dienen:

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) 
    }) 
    })