以闪亮的方式显示来自本地驱动器的 pdf

Posted

技术标签:

【中文标题】以闪亮的方式显示来自本地驱动器的 pdf【英文标题】:displaying a pdf from a local drive in shiny 【发布时间】:2013-10-28 11:54:56 【问题描述】:

我对 r 和闪亮仍然很陌生,而且我对原本应该是简单逻辑的东西感到困惑。我正在尝试在 imageOutput 小部件中显示 pdf 文件,但没有运气。有人可以引导我朝着正确的方向前进吗?

示例 ui.R

shinyUI(pageWithSidebar(
mainPanel(
  selectInput("sel_ed",
              label = "View outputs for Ecodistrict:", 
              choices = c(244,245,247,249), 
              selected = NULL,
              multiple = FALSE),

  imageOutput("imp_pdf",,)
))

示例服务器.R

shinyServer(function(input, output, session) 

importance <- function(inputSpecies)
img_dir <- pdf(paste(inputSpecies,"\\models\\MATL\\MATRF_Importance",sep=""))


output$imp_pdf <- renderImage(importance(input$sel_ed)) 

)

我得到的大多数错误都与预期的字符向量参数或原子向量有关。我知道闪亮的设计或多或少是为了渲染和显示图像或绘图,但必须有一种方法来显示已经在本地驱动器上的 pdf。

【问题讨论】:

可能不相关,但您可以使用/ 作为路径而不是 \\ 即使在 Windows 中 我认为目前没有现成的组件。当然,您可以在网页中显示 pdf。如果它可以在 webapge 中完成,那么闪亮可以适应它。见github.com/mozilla/pdf.js 【参考方案1】:

F*** N.'s 答案的补充。

有两件重要的事情:

    确保从 Rstudio 创建一个 R Shiny Web 应用程序。确保您作为“运行应用程序”运行。否则无法访问“www”文件夹中的文件!

    确保在 Web 应用程序目录中创建一个“www”文件夹。

【讨论】:

您也可以从命令行运行它,例如,runApp('maintask',host = "0.0.0.0") 如果您希望它在外部可见。而且我相信任何 R Shiny 应用程序都是 R Shiny Web 应用程序。【参考方案2】:

在包含您的 server.R 和 ui.R 脚本的原始目录中创建一个名为 www 的文件夹。将 PDF 放在 www/ 文件夹中,然后使用类似于以下代码的内容:

在 server.R 中:

shinyServer(function(input, output) 

  observeEvent(input$generate, 
    output$pdfview <- renderUI(
      tags$iframe(style="height:600px; width:100%", src="foo.pdf")
    )
  )
)

在ui.R中:

shinyUI(fluidPage(

  titlePanel("Display a PDF"),

  sidebarLayout(
    sidebarPanel(
      actionButton("generate", "Generate PDF")
    ),

    mainPanel(
      uiOutput("pdfview")
    )
  )
))

【讨论】:

简单有效的答案,+1!一条评论:如果文件是静态的(不根据用户输入更改),您可以直接在 UI 部分添加tags$iframe(),无需使用renderUI()uiOutput()【参考方案3】:

要在 Shiny ui 中嵌入 PDF 查看器(Web 浏览器的默认 PDF 查看器,例如 mozilla 上的 pdf.js),您可以使用 iframe,其中 src 将作为 PDF 的路径。

这是在界面中包含 iframe 的 2 种不同方法:

在 Ui 中你可以直接添加一个iframe 带有绝对 src 属性的标签,如下所示:

tags$iframe(style="height:600px; width:100%", src="http://localhost/ressources/pdf/R-Intro.pdf"))

或者从服务器的 ui 中获取一个 URL,将输入的 URL 写入iframe 标签,然后在 ui 中的 htmlOutput 中返回 HTML 代码:

界面:textInput("pdfurl", "PDF URL") htmlOutput('pdfviewer')

服务器:

output$pdfviewer <- renderText(
    return(paste('<iframe style="height:600px; width:100%" src="', input$pdfurl, '"></iframe>', sep = ""))
)

请注意,出于安全原因,当使用 HTTP(S) 协议(Shiny 应用程序的情况)加载页面时,您不能使用它们的“file:”URL 来框定本地文件。如果您想显示本地 pdf,您应该使用http(s): URL 访问它们,因此您必须将它们保存在您的 www 目录(本地 Web 服务器)中并使用它们的 http(s): URL 访问文件(该 URL 将是像http://localhost/.../mypdf.pdf) 之类的东西,就像我的示例的第二个 iframe 一样。 (那你不能直接使用fileInput,你得格式化)

UI.R:

library(shiny)

row <- function(...) 
  tags$div(class="row", ...)


col <- function(width, ...) 
  tags$div(class=paste0("span", width), ...)


shinyUI(bootstrapPage(

  headerPanel("PDF VIEWER"),

  mainPanel(

    tags$div(
      class = "container",

      row(
        col(3, textInput("pdfurl", "PDF URL"))
      ),
      row(
        col(6, htmlOutput('pdfviewer')),
        col(6, tags$iframe(style="height:600px; width:100%", src="http://localhost/ressources/pdf/R-Intro.pdf"))
      )
    )
  )
))

服务器.R:

shinyServer(function(input, output, session) 

  output$pdfviewer <- renderText(
      return(paste('<iframe style="height:600px; width:100%" src="', input$pdfurl, '"></iframe>', sep = ""))
  )

)

带有 PDF 查看器的网页:

希望对您有所帮助。

【讨论】:

一个仅供参考:根据我使用此方法的经验,您需要在浏览器中打开 Shiny 应用程序才能真正看到 PDF。它不会显示在 RStudio 窗口中。 有没有办法保护www 文件夹?或在不使用www 的情况下预览 PDF 我希望能够以iframe 类型的方式预览图片/pdf,而不会产生任何人都可以访问的不安全 URL 链接

以上是关于以闪亮的方式显示来自本地驱动器的 pdf的主要内容,如果未能解决你的问题,请参考以下文章

如何让 dockerize 闪亮的应用程序从本地驱动器加载数据(在主机上)

AS3-从本地驱动器以闪存形式加载和显示图像

隐藏的工作表会导致Google表格的导出工作表作为PDF网址的输出损坏

从共享驱动器加载的 Word 文档的本地副本无法使用 VBA 另存为 PDF 方法。不保存文档

闪亮的 Rmarkdown 超链接到本地​​ PDF

pdf文件不大但打印时非常大,打印很慢,如何解决