Попытка извлечь подмножество страниц из каждого PDF-файла в каталог с 70 PDF-файлами

Я использую tidyverse, tidytext и pdftools. Я хочу разбирать слова в каталоге из 70 файлов PDF. Я использую эти инструменты, чтобы сделать это успешно, но приведенный ниже код захватывает все страницы вместо нужного мне подмножества. Мне нужно пропустить первые две страницы и выбрать страницу 3 до конца файла для каждого PDF-файла.

directory <- "Student_Artifacts/"
pdfs <- paste(directory, "/", list.files(directory, pattern = "*.pdf"), sep = "")
pdf_names <- list.files(directory, pattern = "*.pdf")
pdfs_text <- map(pdfs, (pdf_text))
my_data <- data_frame(document = pdf_names, text = pdfs_text)

Я понял, что, заключив [3:12] в такие скобки, я могу взять 3–12-й документы:

pdfs_text <- map(pdfs, (pdf_text))[3:12]

Но это не то, что я хочу. Как использовать спецификацию [3:12] для извлечения нужных страниц из каждого файла PDF?

1 ответ

Решение

Во-первых, вы можете проиндексировать с 3-й по 12-ю страницу каждого PDF-файла в сопоставлении pdf_text, с некоторыми очень небольшими изменениями:

pdfs_text <- map(pdfs, ~ pdf_text(.x)[3:12])

Но это предполагает, что все 70 ваших PDF-файлов содержат 13 страниц. Это также может быть медленным, особенно если некоторые из них действительно большие. Попробуйте что-то вроде этого (я использовал документацию R в формате PDF для демонстрации):

library(furrr)
#> Loading required package: future
library(pdftools)
library(tidyverse)
library(magrittr)
#> 
#> Attaching package: 'magrittr'
#> The following object is masked from 'package:purrr':
#> 
#>     set_names
#> The following object is masked from 'package:tidyr':
#> 
#>     extract

plan(multiprocess)

directory <- file.path(R.home("doc"), "manual")
pdf_names <- list.files(directory, pattern = "\\.pdf$", full.names = TRUE)
# Drop the full reference manual since it's so big
pdf_names %<>% str_subset("fullrefman.pdf", negate = TRUE)
pdfs_text <- future_map(pdf_names, pdf_text, .progress = TRUE)
#> Progress: ----------------------------------------------------------------------------------- 100%

my_data   <- tibble(
  document = basename(pdf_names), 
  text     = map_chr(pdfs_text, ~ {
    str_c("Page ", seq_along(.x), ": ", str_squish(.x)) %>% 
      tail(-2) %>% 
      str_c(collapse = "; ")
  })
)

my_data
#> # A tibble: 6 x 2
#>   document    text                                                         
#>   <chr>       <chr>                                                        
#> 1 R-admin.pdf "Page 3: i Table of Contents 1 Obtaining R . . . . . . . . .~
#> 2 R-data.pdf  "Page 3: i Table of Contents Acknowledgements . . . . . . . ~
#> 3 R-exts.pdf  "Page 3: i Table of Contents Acknowledgements . . . . . . . ~
#> 4 R-intro.pdf "Page 3: i Table of Contents Preface . . . . . . . . . . . .~
#> 5 R-ints.pdf  "Page 3: i Table of Contents 1 R Internal Structures . . . .~
#> 6 R-lang.pdf  "Page 3: i Table of Contents 1 Introduction . . . . . . . . ~

Создано 19.10.2019 пакетом REPEX (v0.3.0)

Основные моменты:

  1. В tail(-2)выполняет работу, которая вас больше всего волнует: отбрасывает первые две страницы. Обычно вы используетеtail() схватить последний n страниц, но он также идеально подходит для захвата всех, кроме первых n страницы - просто используйте негатив.
  2. В plan() а также future_map()распараллеливают чтение PDF-файлов, при этом каждое из ваших виртуальных ядер читает по одному PDF-файлу за раз. Также индикатор выполнения!
  3. Я делаю причудливую конкатенацию строк при построении textздесь, поскольку кажется, что в конечном итоге вам нужен полный текст каждой страницы документа в одной ячейке в вашей итоговой таблице. Я вставляю "; Page [n]: " между текстом каждой страницы, чтобы данные не терялись, и я также удаляю лишние пробелы по всему тексту, поскольку обычно их много.
Другие вопросы по тегам