让我们考虑一下这个PDF,在R中导入如下:
library(pdftools)
library(tidyverse)
mylink <- "https://www.probioqual.com/12_PDF/02_EEQ/Modele_Rapport_EEQ.pdf"
mypdf <- pdf_data(mylink)
pdf_data
函数生成一个由35页组成的大列表(每页一个tibble,每页包括n行和6列,其中x和y坐标)。
现在让我们考虑一个文件中的许多 PDF,使用以下方式导入:
mypdfs_list <- list.files(pattern = '*.pdf')
allpdfs <- lapply(mypdfs_list, pdf_data)
在
allpdfs
中,我只想选择右上角框中包含“Limites Accepteds”字符串的页面,例如如 pdf 第 5 页上以黄色突出显示的内容:
注意:选择这个特定的字符串是我发现仅选择包含感兴趣的表格的页面的方法。事实上,每个 pdf 的第一页文本(每个 pdf 的数量可能有所不同)我不感兴趣,所以我想丢弃它们;例如,在上面的 pdf 中,我想丢弃前 4 页文本(但在另一个 pdf 中,例如必须删除前 3 页或前 5 页)。
使用
pdftools::pdf_data
,“Limites Acceptables”字符串始终位于坐标x>360 & x<580 & y>26 & y<35
区域内。
问题:是否可以使用函数(
map
、lapply
或其他,包括例如filter
或其他)在导入的pdf的所有列表中仅选择这些页面(从而丢弃第一个文本页面) ?
当然对任何其他方法持开放态度!
谢谢
您的编程方法是合理的,但由于源代码构造的性质,需要稍微调整,在这里可见。
Rtools 基于 poppler pdftotext。
因此,首先我们需要看看通过将区域调整为常量,PDFtoText 可以提取什么内容,但由于字符间距和断词(如上所示),结果可能并不总是符合预期。因此,我已将兴趣区域缩减为仅两个部分字母字符串。
pdftotext -nopgbrk -enc UTF-8 -layout -fixed 3.8 -f 5 -l 5 -x 365 -W 52 -y 26 -H 11 "Modele_Rapport_EEQ.pdf" -
结果
Limi tesaccep
在这个阶段,我们可以看到更多的变化,但第 5-30 页是我们想要找到的内容,并且全部都有字符串
"Limi"
,所以这就是我们的 Find
过滤器。
因此,使用操作系统的 shell 可执行文件,我们可以将页面列表过滤到控制台或文件中(或将第一个和最后一个设置为范围变量)。
然而,这就是我不使用Python编写更多内容的地方,这是我如何在本机Windows命令控制台中处理此类任务的方法(算法)。
一旦获得目标页面列表,就可以轻松添加辅助进程(甚至直接),并将结果作为变量,例如在这些页面上重新运行一组不同的命令。