如何使用shinyjs从闪亮的应用程序物理打印png?

Posted

技术标签:

【中文标题】如何使用shinyjs从闪亮的应用程序物理打印png?【英文标题】:How to physically print a png from a shiny app with shinyjs? 【发布时间】:2019-12-05 06:53:04 【问题描述】:

我正在尝试从闪亮的应用程序中物理打印图像,我已经阅读过: RShiny print current page

但是,它会打印所有窗口内容,我喜欢将图形发送到打印机。

我希望使用闪亮的 JS 工具可以打印闪亮的图像。

我该如何解决这个问题?

【问题讨论】:

作为一种解决方法,您可以使用下载处理程序,用户不会单击“保存”而是“打开”png,然后他们可以从标准图像查看器打印它。比直接打印多点击两下。 我想知道,您是要打印嵌入到闪亮应用程序中的常规图像,还是要打印在服务器上渲染并显示在 UI 中的图? 【参考方案1】:

有趣的问题。假设我们要打印一张普通的图像,嵌入在带有tags$img 的闪亮应用程序中。我尝试分两步接近它。

    我们如何通过在 javascript 中单击按钮来打印图像。 我们如何才能将这种方法带入闪亮。

第一个问题在 SO here 上得到回答。 我选择尝试投票最多的答案。

使用 shinyjs,我们可以将 javascript 函数引入闪亮。

useShinyjs(),  # Set up shinyjs
shinyjs::extendShinyjs(text = paste0("shinyjs.img_print = function()",
                                     "popup = window.open();",
                                     "popup.document.write('",tags$img(src = img_url),"');",
                                     "popup.focus();",
                                     "popup.print(); "))

使用observeEvent,我们可以通过点击一个动作按钮来触发一个动作。

observeEvent(input$print, 
  shinyjs::js$img_print()
)

将所有内容放在一个简单的闪亮应用中:

library("shiny")
library("shinyjs")
library("V8")

img_url <-"https://images.unsplash.com/photo-1563169372-eb64c121f9dc?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1561&q=80"

shinyApp(

  ui = fluidPage(

    useShinyjs(),  # Set up shinyjs
    shinyjs::extendShinyjs(text = paste0("shinyjs.img_print = function()",
                                         "popup = window.open();",
                                         "popup.document.write('",tags$img(src = img_url),"');",
                                         "popup.focus();",
                                         "popup.print(); ")),
    tags$img(src = img_url, 
             alt = "Image 1",
             height = 400,
             width = 300),
    actionButton("print", "Print image")


  ), # closes fluidPage


  # Server ------
  server = function(input, output, session)

    observeEvent(input$print, 
      shinyjs::js$img_print()
    )


   # Closes server
) # Closes ShinyApp

如果要打印在服务器上呈现的图形,则可能需要首先创建图形的临时图像文件,然后应用上述方法。

【讨论】:

以上是关于如何使用shinyjs从闪亮的应用程序物理打印png?的主要内容,如果未能解决你的问题,请参考以下文章

使用 ShinyJS 初始化隐藏元素

如何使用闪亮的JS单击一个阴谋模式栏按钮?

在闪亮的 R 中自动调整 textAreaInput 的大小

在绘图加载时禁用闪亮按钮

shinyjs 不会隐藏使用 renderUI 创建的按钮

闪亮 - 如何禁用dashboardHeader