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

运行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 10:53:21