如何让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") }
关键功能说明
- 逐页错误隔离:不再一次性读取整个PDF,逐页调用
pdf_text和ocr,某页出错仅跳过该页,不影响其他页面和后续文件。 - 多级错误捕获:
- 捕获文件级错误(如文件损坏、无法打开),直接跳过整个文件
- 捕获单页文本读取错误,自动尝试OCR
- 捕获OCR错误,记录后跳过该页
- 错误日志记录:详细记录出错的文件路径、错误类型、页面编号和具体错误信息,执行结束后汇总显示并可保存为CSV文件。
- 容错逻辑:原生文本读取失败时自动降级到OCR,确保尽可能多的内容被提取。
使用注意事项
- 确保
pdftools和tesseract包为最新版本,避免已知bug - 对于加密PDF,需先解密后再处理(可使用
pdf_decrypt函数) - 大文件处理时,可根据需要添加进度提示或分批处理
内容的提问来源于stack exchange,提问作者onlyjust17
相关产品推荐
相关产品推荐

