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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 23:20:37