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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 03:22:04