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

如何用R的pdftools和stringr提取多PDF首页作者名及解决循环报错

从多PDF提取作者名:报错解析与解决方案

报错含义解析

你遇到的arguments imply differing number of rows: 50, 60, 11错误,本质是合并数据框时行不匹配:

  • 原代码中pdf_text()会把PDF所有页面的文本按页拆分,strsplit("\n")又把每页文本拆成多行,最终document_text是包含所有行的列表
  • 循环里每个PDF生成的document数据框行数等于该PDF的总行数,不同PDF总行数不同,用rbind合并时,列对应的行数无法对齐,因此触发报错

需求适配的修正代码

你的核心需求是提取每个PDF第一页中带指定前缀的作者行,以下是修正后的代码(假设作者名前缀为"作者:",可根据实际情况修改):

# 加载必要包
library(pdftools)

# 获取文件夹内所有PDF文件名
pdf_files <- list.files("folder", pattern = "\\.pdf$", full.names = TRUE)
pdf_titles <- gsub("\\.pdf$", "", basename(pdf_files))

# 初始化结果列表,避免循环中反复rbind的效率问题
result_list <- list()

for (i in seq_along(pdf_files)) {
  print(i)
  # 提取PDF第一页文本,拆分成行
  first_page_lines <- strsplit(pdf_text(pdf_files[i])[1], "\n")[[1]]
  # 筛选带指定前缀的行(这里替换成你的实际前缀)
  author_line <- first_page_lines[grepl("^作者:", first_page_lines)]
  # 处理无匹配的情况(避免空值)
  if (length(author_line) == 0) author_line <- NA_character_
  
  # 将当前PDF的标题和作者行存入列表
  result_list[[i]] <- data.frame(
    "pdf title" = pdf_titles[i],
    "text" = author_line,
    stringsAsFactors = FALSE
  )
}

# 合并所有结果为一个数据框
text_df <- do.call(rbind, result_list)

实现需求的关键要点

  • 只取第一页:pdf_text()返回的向量中,每个元素对应一页文本,[1]即可提取第一页
  • 精准筛选作者行:用grepl()匹配作者名的固定前缀,确保只提取目标行
  • 避免行不匹配:每个PDF只生成一行数据(即使无匹配也用NA填充),保证合并时行数一致
  • 效率优化:先将结果存入列表,最后一次性合并,比循环中反复rbind更高效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 06:54:55