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

在R语言中将多份PDF转为对应文本文件或数据表的技术求助

解决PDF转文本(先转PNG再OCR)的问题

原代码的问题

  • 多余的嵌套循环for (j in i):遍历文件名的每个字符完全没必要,会重复处理同一个PDF多次
  • 变量名拼写错误:pngfile_1应该是pngfile_i
  • 重复转换PDF:每次循环都调用pdf_convert,会反复生成相同的PNG文件
  • 文本保存方式错误:capture.output不适合直接保存OCR结果,应该用writeLines或cat

方案1:生成对应每个PDF的单独文本文件

修正后的代码会完成这些操作:遍历每个PDF、转成对应页数的PNG、合并所有页面的OCR文本、保存为同名txt文件,还可以选择删除临时PNG。

# 加载所需包
library(pdftools)
library(tesseract)

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

# 逐个处理PDF
for (pdf_path in pdf_files) {
  # 将PDF转换为PNG,返回所有生成的PNG文件路径
  png_paths <- pdf_convert(pdf_path, dpi = 600)
  
  # 初始化空变量存储整份PDF的文本
  full_text <- ""
  
  # 遍历每个PNG,提取文本并合并
  for (png_path in png_paths) {
    page_text <- ocr(png_path)
    full_text <- paste0(full_text, page_text, "\n\n") # 每页之间加空行分隔
  }
  
  # 生成txt文件名(把原PDF的后缀替换成txt)
  txt_path <- gsub("\\.pdf$", ".txt", pdf_path)
  
  # 保存合并后的文本
  writeLines(full_text, con = txt_path)
  
  # 可选:删除临时生成的PNG文件
  file.remove(png_paths)
  
  # 打印进度提示
  cat("处理完成:", pdf_path, "→", txt_path, "\n")
}

方案2:生成包含PDF标题和对应文本的数据表

如果不需要单独的文本文件,想要统一的数据表,用下面的代码:

# 加载所需包
library(pdftools)
library(tesseract)
library(dplyr)

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

# 初始化空列表存储结果
result_list <- list()

# 逐个处理PDF
for (pdf_path in pdf_files) {
  # 提取PDF文件名作为标题(不含路径)
  pdf_title <- basename(pdf_path)
  
  # 转换PDF为PNG
  png_paths <- pdf_convert(pdf_path, dpi = 600)
  
  # 合并所有页面的OCR文本
  full_text <- sapply(png_paths, ocr) %>% paste(collapse = "\n\n")
  
  # 将结果加入列表
  result_list[[pdf_title]] <- full_text
  
  # 删除临时PNG文件
  file.remove(png_paths)
  
  cat("处理完成:", pdf_title, "\n")
}

# 把列表转换成数据框
pdf_text_df <- data.frame(
  pdf_title = names(result_list),
  full_text = unlist(result_list),
  stringsAsFactors = FALSE
)

# 可选:把数据框保存成CSV文件
write.csv(pdf_text_df, "pdf_text_data.csv", row.names = FALSE)

额外提示

  • 先安装需要的包:install.packages(c("pdftools", "tesseract", "dplyr"))
  • 如果是中文PDF,要先安装中文训练数据:tesseract_download("chi_sim"),然后OCR时指定引擎:ocr(png_path, engine = tesseract("chi_sim"))
  • 识别效果不好的话,可以调整dpi参数(比如改成300或更高)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 18:57:11