Formats9 min de lectura

Com funciona l'edició de text en un PDF: fluxos de contingut, codificacions de fonts i per què només es pot editar una línia cada vegada

Una pàgina de PDF no té paràgrafs ni quadres de text, només instruccions per dibuixar glifs amb una font en una posició. Editar una línia esborra les instruccions velles i n'escriu de noves al mateix lloc, i això determina què es pot editar i què no.

PDF123 · Updated 2026-10-14
Com funciona l'edició de text en un PDF: fluxos de contingut, codificacions de fonts i per què només es pot editar una línia cada vegada

Una pàgina de PDF no té paràgrafs ni quadres de text. Té una llista d'instruccions: en aquesta posició, amb aquesta font i aquesta mida, dibuixa aquests glifs. Canviar el text vol dir esborrar les instruccions que dibuixen aquella línia i escriure'n de noves a la mateixa posició, amb la mateixa font, mida i color. Per això Edita PDF edita una línia cada vegada i no sap fer el salt de línia automàtic del text: és una conseqüència de com s'emmagatzema el text.

Com és una línia de text dins del fitxer

El contingut d'una pàgina viu en un flux de contingut, un petit programa fet d'operadors. Quatre operadors fan la major part de la feina amb el text: BT i ET emmarquen un bloc de text, Tf selecciona la font i la mida, Td es mou a la posició següent i Tj dibuixa una cadena. Amb una font estàndard, el cas més simple és així:

BT /F1 18 Tf 20 150 Td (Hello World) Tj ET

Vol dir: selecciona la font F1 a 18 punts, mou-te a x 20, y 150 i dibuixa Hello World. Un PDF imprès des de Chrome sol ser diferent: els parèntesis ja no contenen caràcters sinó números de glif de la font, i Tm fixa la posició una sola vegada. A continuació hi ha la línia Hello World from Georgia d'una pàgina exportada per Chrome, on cada quatre dígits hexadecimals són un número de glif:

BT /F4 24 Tf 1 0 0 -1 30 52 Tm <002b0048004f004f00520003003a00520055004f0047000300490055005200500003002a004800520055004a004c0044> Tj ET

002b és H, 0048 és e, 004f és l, 0003 és un espai, 003a és W, i així successivament. Aquests números només signifiquen alguna cosa dins d'aquesta font; no són Unicode. Quan copieu el text, el visor torna a convertir els números en caràcters amb una taula de consulta emmagatzemada en un altre lloc del fitxer.

En resulten dues coses. Primer, enlloc del flux de contingut es diu «això és un paràgraf»: un salt de línia és només un altre Td o Tm que mou la posició a la línia següent, i quantes línies té un paràgraf s'ha de deduir de les posicions. Segon, per escriure un caràcter nou en una línia cal el número d'aquest caràcter en aquella font, i la font sovint només conté els glifs que es van fer servir quan es va escriure el fitxer. Això és el resultat del subconjuntat de fonts.

Podeu expandir els fluxos amb qpdf:

qpdf --qdf --object-streams=disable in.pdf out.pdf

Obriu out.pdf en un editor de text i cerqueu Tj per veure cada cadena que es dibuixa a la pàgina. Trobareu què més conté un PDF a Què hi ha dins d'un PDF.

Com l'editor reconstrueix una «línia» a partir dels glifs

L'editor primer ha d'agrupar glifs solts en una línia sobre la qual l'usuari pugui fer clic. Els glifs amb la mateixa font, mida i color, la distància dels quals al glif anterior no supera una mida de font, pertanyen al mateix fragment de text, un grup de glifs contigus que l'editor tracta com una unitat; un salt de línia, una font nova o un color nou el tanca. El text que va de dreta a esquerra, o en vertical, no s'agrupa i no es pot obrir per editar.

Se'n poden observar directament dues conseqüències. Una línia que barreja dues fonts, com una línia en xinès amb una paraula en anglès a dins, es divideix en dos fragments adjacents sobre els quals es fa clic per separat. Després d'una edició passa el mateix: si el text nou fa servir una altra font, la línia es converteix en dos fragments, i editar-ne un deixa l'altre sense canvis.

Editar una línia: esborrar el text vell i escriure'n el nou

L'esborrat fa servir la variant de l'ennegriment que només afecta el text: els glifs de l'àrea de la línia s'eliminen del flux de contingut, les imatges i les línies no es toquen, i no es dibuixa cap requadre de color sobre el text vell, de manera que la còpia i la cerca ja no el troben. Només canvia el contingut de la pàgina; si el mateix text també apareix en una anotació o a les propietats del document, aquestes no es veuen afectades.

L'escriptura afegeix una instrucció de text nova al final del flux de contingut de la pàgina, a partir de la posició de la línia de base de la línia original i reutilitzant-ne la mida i el color. Després de canviar la línia anterior a Hello World 2, al final de la pàgina s'afegeix això:

q 1 0 0 1 22.5 148.92 cm 0 0 0 rg
/Span <</ActualText <feff00480065006c006c006f00200057006f0072006c006400200032>>> BDC
BT /F4 18 Tf 0 0 Td <002b0048004f004f00520003003a00520055004f00470003> Tj ET
BT /F9 18 Tf 102.18 0 Td (2) Tj ET
EMC
Q

El primer BT fa servir la font original F4 i els números de glif originals, de manera que Hello World es reutilitza exactament com era. El «2» no és al subconjunt de la font original, així que el segon BT inicia una font estàndard nova, Helvetica (F9), per dibuixar-lo. q i Q limiten la transformació de coordenades i el color d'aquest bloc al bloc mateix; l'editor també envolta el contingut original amb un parell q/Q, perquè un estat que hagi quedat sense tancar al final de la pàgina original no pugui afectar el text nou. Així era un fragment; els números varien segons el fitxer.

Afegir al final té tres conseqüències:

  • El text nou es dibuixa l'últim, per sobre de tota la resta de la pàgina. El text que abans era sota una imatge o un bloc de color apareix per sobre després d'una edició.
  • Una eina que extreu el text en l'ordre del flux de contingut (com pdftotext -raw) llegeix la línia editada l'última d'aquella pàgina, mentre que l'extracció per posició (pdftotext -layout) no mostra cap canvi. La pàgina té el mateix aspecte, però l'ordre de lectura ha canviat.
  • L'editor adjunta un ActualText al text nou, que indica a un visor quins caràcters reals representen els glifs. Un glif pot correspondre a diversos caràcters, i consultar-lo només pel número de glif a vegades retorna un caràcter de compatibilitat (per exemple, per a 文 en surt el radical Kangxi ⽂); ActualText garanteix que el que copieu és el que heu escrit.

Quina font dibuixa el text nou

Reutilitzar la font original és l'opció més segura, perquè la forma dels glifs, el pes i l'amplada coincideixen amb el que hi ha al costat. Que es pugui reutilitzar depèn de si l'editor pot saber quin codi té un caràcter en aquella font:

  • Una font composta com l'anterior (Type0, números de glif de dos bytes, codificació Identity-H): cercar el caràcter a la font per obtenir-ne el número de glif i fer-lo servir si es troba. Si no es troba, el caràcter no és al subconjunt.
  • Una font simple d'un byte (TrueType, Type1) amb codificació WinAnsi o MacRoman: la correspondència entre caràcter i byte és fixa, i les amplades surten de la taula d'amplades del fitxer.
  • Una font amb codificació personalitzada (Differences) o una que depèn de la codificació integrada de la font: no hi ha cap correspondència fiable, així que l'editor no endevina i recorre a una font de reserva, perquè si no el text quedaria il·legible.

Quan un caràcter no és a la font original, es fa servir una font de reserva. Les lletres llatines senzilles fan servir la més propera entre Helvetica, Times i Courier, fonts estàndard que tots els visors tenen, de manera que no cal incrustar res. Tota la resta, com els caràcters xinesos, el kana, el hangul, el tailandès, les lletres llatines amb accent, el ciríl·lic i el grec, fa servir una font Noto de codi obert: el servidor pren els caràcters de la sol·licitud i en retalla només aquells glifs de la font completa amb la biblioteca de subconjuntat de codi obert HarfBuzz, normalment uns pocs KB, i el navegador els incrusta al vostre fitxer. La forma regional d'un caràcter xinès segueix la llengua de la interfície: simplificat, tradicional, japonès o coreà.

Els glifs s'incrusten en lloc d'escriure només un nom de font perquè una font referenciada només pel nom és substituïda per la font de reserva que triï cada visor, i el pes pot variar entre visors; un cop incrustats, tots els visors mostren les mateixes formes.

Per què només una línia cada vegada

L'editor no té motor de maquetació. Cada posició de glif és fixa al fitxer; el text nou simplement es disposa cap a la dreta des del punt d'inici amb les amplades de la font, sense cap lògica de salt de línia al marge, i res del que ve darrere es mou. Si feu una línia més llarga, els caràcters addicionals continuen cap a la dreta, i el que passi de la vora de la pàgina no es pot veure. Reescriure un paràgraf o afegir files a una taula requereix una maquetació nova, cosa que vol dir tornar al fitxer d'origen del qual es va fer el PDF.

Les amplades, a més, són només les amplades d'avanç pròpies de la font (quant avança la posició d'escriptura després de cada glif), sense kerning ni substitució de glifs. El text que no necessita shaping, és a dir, selecció i col·locació de glifs segons el context (llatí, ciríl·lic, grec i caràcters xinesos) es maqueta correctament. Els signes de to del tailandès necessiten posicionament de glifs per quedar al lloc correcte, cosa que l'editor no fa, així que poden quedar desplaçats. L'àrab necessita formes de glif que depenen del context i maquetació de dreta a esquerra, l'hebreu necessita maquetació de dreta a esquerra, i les escriptures índiques necessiten que consonants i signes vocàlics es combinin en glifs; tot això requereix shaping complet, que l'editor ara no fa, i per això es rebutja l'entrada en lloc de produir caràcters erronis.

Dos límits més vénen del fitxer mateix. El contingut d'una pàgina escanejada és una sola imatge sense operadors de text, de manera que no hi ha res per esborrar ni canviar. Quan s'edita un fitxer amb signatura digital, el contingut original que protegia la signatura ha canviat, i la signatura deixa de ser vàlida.

Comproveu-ho vosaltres mateixos

Amb tres ordres podeu veure els canvis descrits en un fitxer descarregat:

pdftotext -raw edited.pdf -      # extreu en l'ordre del flux de contingut: el text vell ha desaparegut, la línia editada surt l'última
pdffonts edited.pdf              # llista de fonts: les fonts originals que s'han reutilitzat i el subconjunt de font incrustat de nou
qpdf --qdf --object-streams=disable edited.pdf edited.qdf   # expandeix el flux de contingut; el bloc BT ... ET afegit és al final

Continueu llegint

Open tool
Process in the browser — no watermark, files removed after the job.
Open tool