You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过点击actionButton/downloadButton将shinydashboard当前标签页导出为PDF

实现方案

可以实现该需求,以下是基于你提供的示例代码修改后的可运行版本,通过shinyjs调用浏览器打印能力,配合自定义CSS实现自动适配当前激活标签页的PDF导出:

首先提前安装依赖包:

install.packages(c("shiny", "shinydashboard", "DT", "shinyjs"))

完整应用代码:

# app.R ##
library(shiny)
library(shinydashboard)
library(DT)
library(shinyjs)

dbHeader <- dashboardHeader(
  title = "fr"
)

ui <- dashboardPage(
  dbHeader,
  dashboardSidebar(),
  dashboardBody(
    useShinyjs(),
    # 自定义打印样式:隐藏非激活标签页、侧边栏、头部,仅展示当前激活的标签页内容
    tags$style(HTML("
      @media print {
        .main-sidebar, .main-header, .nav-tabs {
          display: none !important;
        }
        .tab-content > .tab-pane:not(.active) {
          display: none !important;
        }
        .content-wrapper, .right-side, .main-footer {
          margin-left: 0 !important;
          min-height: 100% !important;
        }
      }
    ")),
    tags$hr(),
    actionButton("generate", "Generate PDF"),
    
    tabsetPanel(
      id ="tabA",
      type = "tabs",
      tabPanel("Front",icon = icon("accusoft"),
               plotOutput("ir")
               ),
      tabPanel("Data", icon = icon("table"),
               dataTableOutput("iris")
      )
    )
  )
)

server <- function(input, output) {
  output$ir<-renderPlot(
    plot(iris)
  )
  output$iris<-renderDataTable(
    iris
  )
  
  # 监听按钮点击,触发打印
  observeEvent(input$generate, {
    # 可通过input$tabA获取当前激活的标签页名称,按需调整打印逻辑
    # print(input$tabA)
    runjs("window.print();")
  })
}

shinyApp(ui = ui, server = server)

核心逻辑说明

  • 自定义了打印媒体查询的CSS规则,打印时会自动隐藏侧边栏、头部、未激活的标签页,仅输出当前用户停留的标签页内容
  • 点击按钮后调用window.print()触发浏览器原生打印功能,选择「保存为PDF」即可导出对应内容,也可通过浏览器设置默认直接下载PDF无需弹窗确认
  • 如果需要更高的PDF样式可控性,可以替换为pagedown包的chrome_print功能,实现无界面自动生成PDF并触发下载

内容的提问来源于stack exchange,提问作者firmo23

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 22:15:04