在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
相关产品推荐
相关产品推荐

