使用pdftools批量加载PDF至R时触发‘Invalid Font Weight’错误
问题分析与解决方案
问题核心
使用R爬取CaixaBank研究报告的PDF文件后,单独读取任意单个PDF无异常,但批量加载为文本时触发「PDF error: Invalid Font Weight」错误。
错误根源
批量处理代码中存在关键逻辑错误:
- 获取文件列表后,错误执行了
strsplit(pdf_files_caixa, "\\s+"),将原本的字符向量拆分为嵌套列表,导致后续循环或sapply向pdf_text传递字符向量而非单个文件路径,这才是批量报错的直接原因(并非PDF字体本身问题,否则单个读取也会失败)。
修正方案
步骤1:修正文件列表获取代码
删除多余的strsplit操作,直接保留list.files的原生结果,同时修正正则匹配避免误判:
# 加载依赖包 library(tidyverse) library(pdftools) # 目标文件夹路径 directory_caixa <- "C:/TFM/caixa" # 获取文件夹内所有PDF的完整路径(转义.避免匹配任意字符) pdf_files_caixa <- list.files(directory_caixa, pattern = "\\.pdf$", full.names = TRUE)
步骤2:带错误捕获的批量读取方式
即使修正文件列表,个别PDF仍可能存在字体异常,添加错误捕获可避免批量操作中断,同时记录问题文件:
方式一:循环读取(保留全部记录)
text_caixa <- list() for (i in seq_along(pdf_files_caixa)) { file_path <- pdf_files_caixa[i] tryCatch({ # 读取PDF文本 text <- pdftools::pdf_text(file_path) text_caixa[[i]] <- text cat(paste0("读取成功: ", basename(file_path), "\n")) }, error = function(e) { # 捕获错误并标记 cat(paste0("读取失败 ", basename(file_path), ": ", e$message, "\n")) text_caixa[[i]] <- NA }) }
方式二:生成数据框(自动过滤失败记录)
# 创建包含文件路径和文本的数据框 text_caixa <- tibble( Document = pdf_files_caixa, text = sapply(pdf_files_caixa, function(x) { tryCatch({ paste0(pdf_text(x), collapse = ' ') }, error = function(e) { warning(paste0("读取失败: ", basename(x), " - ", e$message)) NA_character_ }) }) ) # 过滤读取失败的记录 text_caixa_clean <- text_caixa %>% filter(!is.na(text))
补充说明
- 单个读取正常的原因:单独读取时传递的是单个文件路径,即使某文件有字体问题也仅影响当前操作;批量处理时因路径格式错误,
pdf_text批量处理时遇到异常会直接中断整个流程。 - 若确有PDF存在字体损坏,可尝试用
pdftools::pdf_convert转成图片后再OCR提取文本,这是备选方案,优先修正路径格式问题。
内容的提问来源于stack exchange,提问作者DPedro
相关产品推荐
相关产品推荐

