Redigering af PDF’er

Semi-automatisk

R
PDF
Forfatter

Christian Knudsen

Udgivet

22. juni 2025

Du har en pdf. En af de rare, tekstbaserede, hvor du kan kopiere teksten. Men af en eller anden årsag vil du gerne kunne fjerne noget af teksten. Helst uden at skulle investere i dyr software fra Adobe.

Så - er der en bedre måde? Måske endda en måde der kan scriptes, så du kan fjerne overflødig tekst fra flere pdf’er.

Sådan en måde eksisterer. Der er lidt begrænsninger. Nogle pdf’er er krypterede eller passwordbeskyttede. Og nedenstående løsning kan ikke hjælpe med det.

Der findes et program, qpdf, der kan foretage transformationer af pdf’er. Uden at ændre på indholdet.

Det er et kommando-linie program. Det er skræmmende for nogen. Men det betyder ogs at vi kan scripte hvad det gør.

Vi kunne gøre det direkte i et shell-script. Det ville være elegant. Men jeg er en R-fyr.

Start med installere.

sudo apt update
sudo apt install qpdf

Vi antager her at vi er på en linux platform, der bruger apt som pakke-manager.

qpdfs repo of qpdf har noget dokumentation, der kan være nyttig hvis du er på en windows maskine.

PDF’er er komprimerede. Så processen består af tre trin:

  1. Dekomprimer filen
  2. Fjern det fjollede
  3. (gen)komprimer filen

Lad os scripte det. Start med at sætte parametre og midlertidige filer (og nu ver vi tilbage i R):

input_pdf <- "fluffy.pdf"
output_pdf <- "non-fluffy.pdf"
fluff <- "\\(he/him\\)"
temp_pdf <- tempfile(fileext = ".pdf")

Bemærk at fluff er et regulært udtryk, og da vi er i R, skal vi dobbelt-escape paranteserne.

Dernæst konstruerer vi den streng vi skal køre for at dekomprimere filen:

cli_decompress <- paste0(
  "qpdf --qdf --object-streams=disable '", 
  input_pdf, "' ' ", temp_pdf, "'")

Resultatet ser således ud:

cli_decompress

Det sender vi til styresystemet:

system(cli_decompress)

Nu konstruerer vi det vi skal sende til kommandolinien for at køre en case-insensitiv søg-og-erstat. Vi bruger sed:

cmd_sed <- paste0("sed -i 's/", fluff, "//Ig' '", temp_pdf, "'")

Det sender vi også til kommandolinien:

system(cmd_sed)

Endelig gen-komprimerer vi pdf’en, ved at konstruere kommandolinie kommandoen:

cmd_compress <- paste0("qpdf '", temp_pdf, "' '", output_pdf)
)
cmd_compress

Og kører det:

system(cmd_compress)

Hep - overflødig tekst er blevet fjernet.

Det kan vi nu automatisere, eksempelvis fjerne andet fjol fra filerne, og fra mere end end pdf. Dette overlades til den interesserede studerende.