TransWikia.com

Como identificar o número da página de um .pdf por algo escrito nela?

Stack Overflow em Português Asked by RxT on December 16, 2020

Eu tenho um .pdf com 120 páginas, cada página é um certificado e a única diferença entre eles é o nome do participante.

Eu também tenho um .csv com a lista de nomes e o e-mail dos participantes (usei esta lista para gerar o .pdf e vou tentar usar os e-mail para mandar pelo R)

Como eu consigo separar cada página (certificado) em um novo .pdf e salvar com o nome do participante?

Vi funções como pdf_subset da library(pdftools), mas como eu consigo identificar o número da página por algo escrito nela?

library(pdftools)

# extair paginas de 1 
pdf_subset('certificados.pdf',
           pages = 1, output = "Carlos dos Santos.pdf")

É um trabalho bastante repetitivo, não gostaria de fazer manualmente.

Também pensei em separar página por página e depois procurar o nome no .pdf e alterar o nome do arquivo. Mas também não sei como fazer isso ainda.

Segue modelo de certificado:
https://drive.google.com/file/d/1iwgW6kMT7C9Xee5SM65vz-D8B26bpavz/view?usp=sharing

Exemplo de .csv:

nome,email
Prof. Dr. Thiado Souza,[email protected]
Prof. Dr. Marcelo José,mjose@gmail
Ricado Augusto,[email protected]
Carlos José,[email protected]

2 Answers

Tendo em vista que os certificados seguem a mesma ordem do arquivo csv:

library(pdftools)

arq <- read.csv('./rxt.csv')
nomes <- as.character(arq$nome)

cria_pdf <- function(n, i){
  pdf_subset('certificado-teste.pdf',
             pages = i, output = paste(n[i],'.pdf'))
}

lapply(seq_along(nomes),cria_pdf, n = nomes)

Este cria no diretório arquivos separados baseado na listagem dos nomes do csv.

Correct answer by lmonferrari on December 16, 2020

Creio que a função seguinte divide o pdf de entrada em páginas, guardando cada página num ficheiro e renomeia esses ficheiros com os nomes do ficheiro csv. A entrada da função é

  1. file - o nome do ficheiro pdf;
  2. nomes - o data.frame com uma coluna 'nome'

Precisa do pacote pdftools para processar os ficheiros pdf e do pacote stringi para remover acentos e letras especiais, tal como etá nesta resposta.

library(pdftools)

rename_file <- function(from, to){
  out <- tryCatch(file.rename(from, to),
                  error = function(e) e
  )
  if(inherits(out, "error")){
    out <- tryCatch(file.copy(from, to),
                    error = function(e) e,
                    warning = function(w) w
    )
    if(inherits(out, "error")){
      stop(e)
    }
    if(inherits(out, "warning")){
      warning(out)
      out <- FALSE
    }
    if(file.exists(to)) {
      if(file.exists(from)) unlink(from)
      out <- TRUE
    } else out <- FALSE
  }
  out
}

fun_split_pdf <- function(file, nomes){
  # ler os dados do pdf para uma lista de data.frames
  data_list <- pdf_data(file)
  # ficar com a coluna 'text' de cada data.frame da lista
  # e convertê-la em um único vetor com paste()
  Text <- unlist(lapply(data_list, function(x) paste(x[['text']], collapse = ' ')))
  # se tiver acentos, removê-los
  Text <- stringi::stri_trans_general(Text, "Latin-ASCII")
  # agora ver quais nomes do csv estão em qual página do pdf
  i <- sapply(nomes[['nome']], function(x){
    x <- stringi::stri_trans_general(x, "Latin-ASCII")
    j <- grep(x, Text)
    if(length(j) > 1) j[1] else j
  })
  # ordenar a coluna 'nome' do csv pela ordem do grep
  nms <- nomes[['nome']][i]
  # nomes finais dos ficheiros de saída
  nms <- paste0(nms, '.pdf')

  # fazer o split para um diretório temporário
  tmp <- tempfile()
  pdf_split(file, output = tmp)

  # renomear os ficheiros temporários
  pattern <- paste0(basename(tmp), "_.*\.pdf")
  tmp_fls <- list.files(path = dirname(tmp), pattern = pattern)
  tmp_fls <- file.path(dirname(tmp), tmp_fls)
  sapply(seq_along(tmp_fls), function(i){
    rename_file(tmp_fls[[i]], nms[[i]])
  })
}

fl <- list.files(pattern = '\.pdf')
fl
#[1] "certificado-teste.pdf"

nomes <- read.csv("pdf_teste.csv")

fun_split_pdf(fl, nomes)
#[1] TRUE TRUE TRUE TRUE

Answered by Rui Barradas on December 16, 2020

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP