capture
capture copied to clipboard
Save pdf/take screenshot of a big page.
Hi, is there a way to save a pdf of a page with multiple rows that requires scrolling and doesn't fit all at once on screen? Example app below: When I press the "save PDF" button only a part of the app get screenshotted.
library(shiny)
library(bslib)
library(dplyr)
library(echarts4r)
library(DT)
library(capture)
# Generate sample data
set.seed(123)
data <- expand.grid(
year = 2018:2022,
region = c("North", "South", "East", "West"),
product = c("A", "B", "C")
)
data$sales <- round(runif(nrow(data), 1000, 10000))
data$profit <- round(data$sales * runif(nrow(data), 0.1, 0.3))
ui <- page_sidebar(
title = "Sales Dashboard",
sidebar = sidebar(
selectInput("year", "Select Year", choices = unique(data$year), selected = max(data$year)),
selectInput("region", "Select Region", choices = c("All", unique(data$region)), selected = "All")
),
page_fluid(
layout_columns(
card(
card_header("Total Sales by Region"),
echarts4rOutput("sales_by_region")
),
card(
card_header("Product Sales Distribution"),
echarts4rOutput("product_sales_pie")
)
),
layout_columns(
card(
card_header("Sales Trend"),
echarts4rOutput("sales_trend")
),
card(
card_header("Top Products"),
DTOutput("top_products_table")
)
),
card(
card_header("Sales vs Profit Scatter"),
echarts4rOutput("sales_profit_scatter")
),
layout_columns(
card(
capture_pdf(
selector = "body",
filename = "all-page.pdf",
icon("camera"), "Save in pdf"
)
),
)
)
)
server <- function(input, output, session) {
filtered_data <- reactive({
df <- data %>% filter(year == input$year)
if (input$region != "All") {
df <- df %>% filter(region == input$region)
}
df
})
output$sales_by_region <- renderEcharts4r({
filtered_data() %>%
group_by(region) %>%
summarise(total_sales = sum(sales)) %>%
e_charts(region) %>%
e_bar(total_sales) %>%
e_title("Total Sales by Region")
})
output$product_sales_pie <- renderEcharts4r({
filtered_data() %>%
group_by(product) %>%
summarise(total_sales = sum(sales)) %>%
e_charts(product) %>%
e_pie(total_sales) %>%
e_title("Product Sales Distribution")
})
output$sales_trend <- renderEcharts4r({
data %>%
group_by(year) %>%
summarise(total_sales = sum(sales)) %>%
e_charts(year) %>%
e_line(total_sales) %>%
e_title("Sales Trend Over Years")
})
output$top_products_table <- renderDT({
filtered_data() %>%
group_by(product) %>%
summarise(total_sales = sum(sales)) %>%
arrange(desc(total_sales)) %>%
datatable(options = list(pageLength = 5))
})
output$sales_profit_scatter <- renderEcharts4r({
filtered_data() %>%
e_charts(sales) %>%
e_scatter(profit, sales) %>%
e_title("Sales vs Profit") %>%
e_x_axis(name = "Sales") %>%
e_y_axis(name = "Profit")
})
}
shinyApp(ui, server)