如何用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
相关产品推荐
相关产品推荐

