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

如何让pdftools跳过错误继续执行?R脚本PDF转文本优化求助

解决方案:带错误处理的PDF批量转文本脚本

核心改进点

  • 用tryCatch捕获单页/文档级错误,避免进程整体终止
  • 逐页处理PDF,支持跳过错误页面继续后续内容
  • 维护错误日志,执行结束后汇总未处理的文件/页面
  • 同时覆盖原生文本PDF和扫描PDF的错误处理

修改后的完整代码

# 加载依赖包
library(pdftools)
library(tesseract)

# 下载并初始化OCR引擎
tesseract_download("eng")
tess_lang <- tesseract("eng")

# 配置路径
pdf_folder <- "folder"  # 替换为你的PDF文件夹路径

# 获取所有PDF文件路径
pdf_files <- list.files(pdf_folder, pattern = "\\.pdf$", full.names = TRUE)

# 初始化错误日志:存储出错的文件和页面信息
error_log <- data.frame(
  文件路径 = character(),
  错误类型 = character(),
  页面编号 = integer(),
  错误信息 = character(),
  stringsAsFactors = FALSE
)

# 批量处理PDF文件
for (pdf_file in pdf_files) {
  cat("正在处理:", pdf_file, "\n")
  txt_filename <- sub("\\.pdf$", ".txt", pdf_file)
  total_pages <- tryCatch(
    pdf_info(pdf_file)$pages,
    error = function(e) {
      # 记录无法读取的整个文件
      error_log <<- rbind(error_log, data.frame(
        文件路径 = pdf_file,
        错误类型 = "文件读取失败",
        页面编号 = NA,
        错误信息 = e$message,
        stringsAsFactors = FALSE
      ))
      return(0)
    }
  )
  
  if (total_pages == 0) next  # 跳过无法读取的文件
  
  # 逐页处理PDF内容
  page_contents <- c()
  for (page_num in 1:total_pages) {
    # 尝试读取原生文本
    page_text <- tryCatch(
      pdf_text(pdf_file, pages = page_num),
      error = function(e) {
        # 记录页面读取错误
        error_log <<- rbind(error_log, data.frame(
          文件路径 = pdf_file,
          错误类型 = "页面文本读取失败",
          页面编号 = page_num,
          错误信息 = e$message,
          stringsAsFactors = FALSE
        ))
        return(NA)
      }
    )
    
    if (!is.na(page_text) && nzchar(page_text)) {
      page_contents <- c(page_contents, page_text)
    } else {
      # 原生文本读取失败或无内容,尝试OCR
      ocr_result <- tryCatch(
        ocr(pdf_file, pages = page_num, engine = tess_lang),
        error = function(e) {
          error_log <<- rbind(error_log, data.frame(
            文件路径 = pdf_file,
            错误类型 = "页面OCR失败",
            页面编号 = page_num,
            错误信息 = e$message,
            stringsAsFactors = FALSE
          ))
          return(NA)
        }
      )
      if (!is.na(ocr_result)) {
        page_contents <- c(page_contents, ocr_result)
      }
    }
  }
  
  # 写入成功处理的内容
  if (length(page_contents) > 0) {
    writeLines(page_contents, txt_filename)
    cat("处理完成:", txt_filename, "\n")
  } else {
    error_log <<- rbind(error_log, data.frame(
      文件路径 = pdf_file,
      错误类型 = "全页处理失败",
      页面编号 = NA,
      错误信息 = "所有页面均无法读取或OCR",
      stringsAsFactors = FALSE
    ))
    cat("所有页面处理失败:", pdf_file, "\n")
  }
}

# 输出错误汇总
cat("\n=== 错误汇总 ===\n")
if (nrow(error_log) == 0) {
  cat("所有文件处理成功,无错误\n")
} else {
  print(error_log, row.names = FALSE)
  # 可选:将错误日志保存到文件
  write.csv(error_log, file = "pdf_conversion_errors.csv", row.names = FALSE, fileEncoding = "UTF-8")
  cat("错误日志已保存到:pdf_conversion_errors.csv\n")
}

关键功能说明

  1. 逐页错误隔离:不再一次性读取整个PDF,逐页调用pdf_text和ocr,某页出错仅跳过该页,不影响其他页面和后续文件。
  2. 多级错误捕获:
    • 捕获文件级错误(如文件损坏、无法打开),直接跳过整个文件
    • 捕获单页文本读取错误,自动尝试OCR
    • 捕获OCR错误,记录后跳过该页
  3. 错误日志记录:详细记录出错的文件路径、错误类型、页面编号和具体错误信息,执行结束后汇总显示并可保存为CSV文件。
  4. 容错逻辑:原生文本读取失败时自动降级到OCR,确保尽可能多的内容被提取。

使用注意事项

  • 确保pdftools和tesseract包为最新版本,避免已知bug
  • 对于加密PDF,需先解密后再处理(可使用pdf_decrypt函数)
  • 大文件处理时,可根据需要添加进度提示或分批处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 01:30:58