UP | HOME |

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.

pp01_recuadros-1.png

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")