如何在Shiny应用内嵌展示PDF并实现无需用户输入.pdf后缀的功能
解决方案
核心修改点
- 针对内嵌PDF触发外部程序的问题:改用
embed标签强制调用浏览器内置PDF渲染器,同时确保所有PDF文件存放在shiny应用根目录的www文件夹下,这是shiny默认的静态资源托管目录,只有放在该目录下的文件可被前端直接访问。 - 针对自动补全.pdf后缀的问题:服务端对用户输入做标准化处理,先自动移除用户可能误输入的
.pdf后缀,再统一拼接后缀,同时增加文件存在校验,匹配不到文件时给用户明确提示。
完整可运行代码
library(shiny) library(shinydashboard) ui <- dashboardPage( dashboardHeader(title = "PDF阅读器"), dashboardSidebar(disable = TRUE), # 隐藏不需要的侧边栏 dashboardBody( textInput( inputId = "select_pdf", label = "PDF文件查询", placeholder = "请输入PDF文件名(无需输入.pdf后缀)" ), uiOutput("pdf_viewer") ) ) server <- function(input, output) { output$pdf_viewer <- renderUI({ input_name <- trimws(input$select_pdf) # 输入为空时返回提示 if (nchar(input_name) == 0) { return(tags$p("请输入要查询的PDF文件名")) } # 移除用户可能输入的.pdf后缀(不区分大小写),再统一拼接 file_name <- paste0(sub("\\.pdf$", "", input_name, ignore.case = TRUE), ".pdf") # 校验www目录下是否存在对应文件 if (!file.exists(file.path("www", file_name))) { return(tags$p("*未找到对应PDF文件,请检查文件名是否正确*")) } # 用embed标签内嵌PDF,避免触发外部程序 tags$embed( style = "height: 600px; width: 100%", src = file_name, type = "application/pdf" ) }) } shinyApp(ui, server)
使用说明
- 所有需要展示的PDF文件请统一放在shiny应用代码同目录的
www文件夹下(如果没有该文件夹请手动新建) - 输入文件名时不需要加
.pdf后缀,即使误加了后缀程序也会自动处理
内容的提问来源于stack exchange,提问作者user16188393
相关产品推荐
相关产品推荐

