Remarcar de forma automática palabras en un pdf (con R y LaTeX)
2026-01-07
Remarcar de forma automática palabras en un pdf (con R y LaTeX)
Normalmente recibo documentos en pdf para revisar y suelo subrayar los verbos comodín. Resulta tan tedioso y aburrido que he decidido automatizarlo.
Primero, obtengo los bounding box de las palabras, reviso las más repetidas, y genero un fichero tex donde incluyo la página original junto con el rectángulo de las palabras que he considerado problemáticas.
library(data.table);setDTthreads(0L); library(pdftools) ficheropdf <- "260107redaccion.pdf" cat("\nProcesando ",ficheropdf,"\n") pagesizedata <- as.data.table(pdf_pagesize(ficheropdf)) w <- pagesizedata[,mean(right)] h <- pagesizedata[,mean(bottom)] ## ============================================================ ## Palabras con su bounding box ## ============================================================ data <- pdf_data(ficheropdf,font_info = FALSE) datos <- lapply(1:length(data),function(i){ dat <- data[[i]] dat$page=i x <- pagesizedata[i,height] dat$hpage <- x x <- pagesizedata[i,width] dat$wpage <- x dat$posx <- dat$x dat$posy <- dat$hpage - (dat$y ) - dat$height as.data.table(dat) }) datos <- rbindlist(datos) datos[,data:= paste0(width,"/",height,"/",posx,"/",posy)] datos[,text:=tolower(text)] ## ============================================================ ## Palabras comunes ## ============================================================ stopwords <- c("de", ".", "en", "la", "el", "y", "los", "del", "%", "que", "o", "a", "se", "las", "con", "un", "al", "por") stopwords <- c(stopwords,"the","of","a","and","to","in","for","as","from","on","this") listapalabras <- datos[!text %in% stopwords,text] listapalabrasconsfinal <- listapalabras[grep("s$",listapalabras)] listapalabrasconsigularyplural <- gsub("s$","",listapalabrasconsfinal) listapalabrasconsigularyplural <- listapalabrasconsigularyplural[listapalabrasconsigularyplural %in% listapalabras] listapalabrasconsigularyplural palabrasconsinguarypluaral <- c(listapalabras,listapalabrasconsigularyplural) aa <- table(palabrasconsinguarypluaral) cat("\n\nPalabras más repetidas en global\n\n") as.data.table(aa)[order(-N)][1:30] cat("\n\nPalabras más repetidas por página\n\n") datos[!text %in% stopwords, .(text),by = page][ , .(count = .N), by = .(page, text)][order(-count), .(top_words = head(text, 2), freq = head(count, 2)), by = page][order(-freq)] palabrasrepetidas <- c("es","son","una") palabrasrepetidas <- c(palabrasrepetidas, paste0(palabrasrepetidas,"s")) palabrasrepetidas datospalabras <- datos[text %in% palabrasrepetidas] ficherotex <- paste0(tools::file_path_sans_ext(basename(ficheropdf)),"_recuadros.tex") texto <- paste0(" \\documentclass[]{article} \\usepackage[margin=0pt,paperheight=",h,"pt,paperwidth=",w,"pt]{geometry} ") texto <- paste0(texto," \\usepackage{graphicx} \\usepackage{tikz} \\newcommand{\\paginapdf}[2] % Compilar dos veces {\\begin{tikzpicture}[remember picture,overlay,inner sep=0pt]% \\node [anchor=east] at (current page.east) {{\\includegraphics[page=#2]{#1}}};% \\end{tikzpicture}} \\pagestyle{empty} \\begin{document} %Compilar dos veces ") cat(texto,file=ficherotex,append=FALSE) for(pagina in 1:(datos[,max(page)])){ tablita <- datospalabras[page == pagina] texto <- paste0("\\paginapdf{",ficheropdf,"}{",pagina,"}%") if(nrow(tablita)){ texto <- paste0(texto," \\begin{tikzpicture}[overlay, remember picture] \\def\\WordData{ ") texto <- paste0(texto, paste(tablita[,data],collapse=",\n") ) texto <- paste0(texto," } \\foreach \\w/\\h/\\x/\\y in \\WordData { \\coordinate (P) at ([xshift=\\x pt, yshift=\\y pt]current page.south west); \\draw [red,thick] (P) rectangle ++(\\w pt, \\h pt); } \\end{tikzpicture} " )} texto <- paste0(texto,"\n\\newpage\n\n") cat(texto,file=ficherotex,append=TRUE) } texto <- "\\end{document}" cat(texto,file=ficherotex,append=TRUE) tools::texi2pdf(ficherotex,clean=FALSE,index=FALSE) tools::texi2pdf(ficherotex,clean=TRUE,index=FALSE) cat("\n\n Las palabras repetidas son: \n\n", palabrasrepetidas,"\n\n") cat("Compilado", ficherotex,"\n")