如何在R Shiny应用中展示pdf_ocr_text的控制台状态信息
在Shiny中展示pdf_ocr_text的实时处理状态
当使用pdftools包的pdf_ocr_text()函数(示例:text1 <- pdf_ocr_text("0.pdf", dpi = 300))时,R控制台会输出每页转换的状态:
Converting page 1 to 0_1.png... done! Converting page 2 to 0_2.png... done! Converting page 3 to 0_3.png... done! Converting page 4 to 0_4.png... done!
但在Shiny应用中调用该函数时,用户无法看到这些实时状态,导致长时间处理过程中无反馈。下面是实现实时展示状态的修改方案:
核心思路
pdf_ocr_text()的状态信息通过R的message()输出,我们可以用withCallingHandlers()捕获这些消息,将其存储到响应式变量中,再实时渲染到UI界面。同时,处理过程中禁用按钮防止重复点击,处理完成后恢复可用。
修改后的完整代码
library(tidyverse) library(shiny) library(pdftools) library(tesseract) library(tidytext) library(reactable) library(shinyFeedback) library(shinyjs) library(shinyalert) ui <- shinyUI(fluidPage( useShinyjs(), useShinyalert(), shinyFeedback::useShinyFeedback(), sidebarLayout( sidebarPanel( titlePanel("Demo"), fileInput("file_import", "上传PDF文件", multiple = T, accept = ".pdf"), disabled(actionButton("ocr_button","开始OCR", class = "btn-danger", icon=icon("fa-sharp fa-solid fa-triangle-exclamation", lib = "font-awesome"))), # 新增状态展示区域,适合控制台风格文本 h4("处理状态"), verbatimTextOutput("process_status"), textOutput("sometext"), tableOutput("files") ), mainPanel( uiOutput("pdfview"), reactableOutput("test") ) ) )) server <- function(input, output, session) { ### 显示PDF ######################################################## x = reactiveVal(1) # 响应式变量存储实时处理状态 process_status <- reactiveVal("") observeEvent(input$file_import,{ enable("ocr_button") file.rename(input$file_import$datapath[x()], "0.pdf") file.copy("0.pdf","www", overwrite = T) output$pdfview <- renderUI({ tags$iframe(style="height:1200px; width:100%", src="0.pdf") }) }) observeEvent(input$ocr_button, { # 点击后禁用按钮,避免重复触发 disable("ocr_button") # 重置状态信息 process_status("开始处理PDF...\n") ### OCR处理及状态捕获 ########################################################### text_result <- withCallingHandlers({ pdf_ocr_text("0.pdf", dpi = 300) }, message = function(m) { # 捕获每条转换消息,追加到状态中 current_status <- paste0(process_status(), m$message) process_status(current_status) # 屏蔽原始消息输出到控制台(可选,保留则删除此行) invokeRestart("muffleMessage") }) # 处理完成后更新状态 process_status(paste0(process_status(), "\nOCR处理完成!")) # 恢复按钮可用 enable("ocr_button") ###################################################################### output$sometext = renderText({ text_result }) }) # 渲染处理状态到UI output$process_status <- renderPrint({ cat(process_status()) }) } shinyApp(ui, server)
关键修改点
- 在UI中新增
verbatimTextOutput("process_status"),用于展示控制台风格的状态文本 - 定义响应式变量
process_status存储实时状态信息 - 使用
withCallingHandlers()捕获pdf_ocr_text()输出的message,实时更新状态变量 - 处理前后禁用/启用按钮,避免重复操作
- 用
renderPrint()配合cat()输出多行状态文本,保持格式一致
内容的提问来源于stack exchange,提问作者Subaru Spirit
相关产品推荐
相关产品推荐

