运行pdftools处理PDF时R会话致命终止,求排查解决方法
解决R处理大量PDF时崩溃的问题
R端优化方案
- 分批处理PDF:一次性加载1400个PDF会造成内存过载,改成批量分段处理,每批处理后写入文件并释放内存:
library(pdftools) # 设置每批处理数量,可根据机器内存调整 batch_size <- 50 files <- list.files(ignore.case = TRUE, pattern = "pdf$") total_batches <- ceiling(length(files)/batch_size) # 分批处理并保存结果 for(i in 1:total_batches){ start_idx <- (i-1)*batch_size + 1 end_idx <- min(i*batch_size, length(files)) batch_files <- files[start_idx:end_idx] batch_text <- lapply(batch_files, pdf_text) # 将当前批次结果存入RDS文件 saveRDS(batch_text, paste0("pdf_batch_", i, ".rds")) # 清空变量并强制垃圾回收 rm(batch_text, batch_files) gc() } # 合并所有批次结果 all_text <- list() for(i in 1:total_batches){ batch_data <- readRDS(paste0("pdf_batch_", i, ".rds")) all_text <- c(all_text, batch_data) rm(batch_data) gc() } - 定位异常PDF:个别损坏或格式异常的PDF会触发崩溃,逐个排查找到问题文件:
for(file in files){ tryCatch({ text <- pdf_text(file) cat("处理成功:", file, "\n") }, error = function(e){ cat("处理失败:", file, "\n") print(e) }) } - 调整内存分配:根据机器内存情况,在R中手动提升内存上限:
memory.limit(size = 16384) # 分配16G内存,数值可按需修改
Python替代方案
如果R端优化后仍有问题,可使用Python处理,内存管理更灵活:
处理可复制文本的PDF
import os import pdfplumber from tqdm import tqdm pdf_dir = "./" # PDF所在目录 output_dir = "./pdf_text_output/" os.makedirs(output_dir, exist_ok=True) files = [f for f in os.listdir(pdf_dir) if f.lower().endswith(".pdf")] for file in tqdm(files): try: with pdfplumber.open(os.path.join(pdf_dir, file)) as pdf: text = "\n".join([page.extract_text() for page in pdf.pages]) # 将文本保存为文件 with open(os.path.join(output_dir, f"{os.path.splitext(file)[0]}.txt"), "w", encoding="utf-8") as f: f.write(text) except Exception as e: print(f"失败 {file}: {str(e)}")
处理扫描版PDF(需OCR)
import os from pdf2image import convert_from_path import pytesseract from tqdm import tqdm pdf_dir = "./" output_dir = "./ocr_text_output/" os.makedirs(output_dir, exist_ok=True) files = [f for f in os.listdir(pdf_dir) if f.lower().endswith(".pdf")] for file in tqdm(files): try: pages = convert_from_path(os.path.join(pdf_dir, file)) text = "" for page in pages: # 语言参数根据需求调整,如"eng"表示英文,"chi_sim"表示简体中文 text += pytesseract.image_to_string(page, lang="chi_sim") with open(os.path.join(output_dir, f"{os.path.splitext(file)[0]}.txt"), "w", encoding="utf-8") as f: f.write(text) except Exception as e: print(f"失败 {file}: {str(e)}")
内容的提问来源于stack exchange,提问作者Jane_Coding
相关产品推荐
相关产品推荐

