如何用pdftools的pdf_data筛选含指定区域字符串的PDF页面
筛选PDF中含指定区域目标字符串的页面(R语言实现)
背景回顾
使用pdftools包导入PDF后,会得到一个列表,每个元素对应PDF的一页(以tibble格式存储,包含文本及其x/y坐标等信息)。对于批量导入的多PDF列表allpdfs,需要筛选出右上角区域(坐标范围x>360 & x<580 & y>26 & y<35)包含字符串Limites acceptables的页面——这些页面是包含目标表格的有效页,需剔除各PDF开头数量不定的文本页。
解决方案
1. 依赖包加载
确保已加载所需工具包:
library(pdftools) library(tidyverse) # 包含dplyr、stringr、purrr,简化操作
2. 定义判断函数
先写一个函数,用于判断单页是否符合筛选条件:
# 判断单页是否包含指定区域的目标字符串 has_target <- function(page_df) { page_df %>% # 筛选指定坐标范围内的文本 filter(x > 360, x < 580, y > 26, y < 35) %>% pull(text) %>% # 检查是否存在目标字符串 str_detect("Limites acceptables") %>% any() }
3. 单个PDF的页面筛选
针对单个PDF的页面列表mypdf,筛选符合条件的页面:
target_pages_single <- mypdf %>% keep(has_target)
4. 多PDF批量筛选
针对批量导入的多PDF列表allpdfs(每个元素对应一个PDF的页面列表),用map批量处理每个PDF:
# 批量筛选所有PDF中的目标页面 target_pages_all <- allpdfs %>% map(~ keep(.x, has_target))
5. Base R替代方案(无需tidyverse)
如果不想依赖tidyverse,可以用纯Base R实现:
# 纯Base R的判断函数 has_target_base <- function(page_df) { # 提取指定坐标范围内的文本 target_text <- page_df$text[page_df$x > 360 & page_df$x < 580 & page_df$y > 26 & page_df$y < 35] # 检查是否包含目标字符串 any(grepl("Limites acceptables", target_text)) } # 批量处理多PDF target_pages_all_base <- lapply(allpdfs, function(pdf_pages) { # 过滤出符合条件的页面 Filter(has_target_base, pdf_pages) })
说明
- 核心逻辑:先通过坐标范围缩小文本搜索范围,再检查是否存在目标字符串,避免全局搜索误判。
keep(purrr)和Filter(Base R)的作用一致:保留列表中符合条件的元素(即符合要求的PDF页面)。
内容的提问来源于stack exchange,提问作者denis
相关产品推荐
相关产品推荐

