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]
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 é
file
- o nome do ficheiro pdf;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
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP