Formats8 мин четене

Как работи редактирането на текст в PDF: потоци със съдържание, кодировки на шрифтовете и защо можете да правите промени само по един ред

В страницата на PDF няма абзаци и текстови полета, а само инструкции да се изчертаят глифове с даден шрифт на дадена позиция. Редактирането на ред изтрива старите инструкции и записва нови на същото място, и това определя какво може и какво не може да се редактира.

PDF123 · Updated 2026-10-14
Как работи редактирането на текст в PDF: потоци със съдържание, кодировки на шрифтовете и защо можете да правите промени само по един ред

В страницата на PDF няма нито абзаци, нито текстови полета. Има списък с инструкции: на тази позиция, с този шрифт и този размер изчертай тези глифове. Промяната на текста означава да изтриете инструкциите, които чертаят реда, и да запишете нови на същата позиция, със същия шрифт, размер и цвят. Затова Редактиране на PDF редактира по един ред и не може да пренася текста на нов ред: това следва от начина, по който текстът се съхранява.

Как изглежда един ред текст във файла

Съдържанието на страницата е в поток със съдържание, малка програма от оператори. За текста основната работа вършат четири оператора: BT и ET ограждат текстов блок, Tf избира шрифта и размера, Td премества към следващата позиция, а Tj чертае низ. Със стандартен шрифт най-простият случай изглежда така:

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

Това означава: избери шрифт F1 с размер 18 пункта, премести се на x 20, y 150 и изчертай Hello World. PDF, отпечатан от Chrome, обикновено изглежда по-различно: в скобите вече няма знаци, а номера на глифове от шрифта, и Tm задава позицията веднъж. По-долу е редът Hello World from Georgia от страница, експортирана от Chrome, където всяка група от четири шестнайсетични цифри е един номер на глиф:

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

002b е H, 0048 е e, 004f е l, 0003 е интервал, 003a е W и така нататък. Тези числа имат смисъл само в рамките на този един шрифт; те не са Unicode. Когато копирате текста, програмата за преглед превръща номерата обратно в знаци чрез справочна таблица, съхранена другаде във файла.

От това следват две неща. Първо, в потока със съдържание никъде не пише „това е абзац“: преходът на нов ред е просто поредният Td или Tm, който премества позицията към следващия ред, а колко реда има един абзац, трябва да се заключи от позициите. Второ, за да запишете нов знак в реда, ви трябва номерът на този знак в този шрифт, а шрифтът често съдържа само глифовете, използвани при записването на файла. Това е резултат от подмножеството на шрифтове.

Потоците могат да се разгънат с qpdf:

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

Отворете out.pdf в текстов редактор и потърсете Tj, за да видите всеки низ, изчертан на страницата. За това какво още съдържа един PDF, вижте Какво има вътре в PDF: обекти, потоци и таблицата с кръстосани препратки.

Как редакторът възстановява „ред“ от глифове

Редакторът първо трябва да групира разпилените глифове в ред, върху който потребителят може да щракне. Фрагмент е група съседни глифове със същия шрифт, размер и цвят, чийто интервал до предишния глиф не е повече от един размер на шрифта; нов ред, нов шрифт или нов цвят прекъсват фрагмента. Текст, който върви отдясно наляво или вертикално, не се групира и не може да се отвори за редактиране.

Две последици се виждат директно. Ред, който смесва два шрифта, например китайски ред с английска дума в него, се разделя на два съседни фрагмента, върху които се щраква поотделно. След редакция става същото: ако новият текст използва друг шрифт, редът става два фрагмента и редактирането на единия оставя другия непроменен.

Редактиране на ред: изтриване на стария текст, после запис на новия

Изтриването използва вариант на зачерняването само за текст: глифовете в областта на реда се премахват от потока със съдържание, изображенията и линиите остават, върху стария текст не се чертае цветен правоъгълник, затова копирането и търсенето вече не го намират. Променя се само съдържанието на страницата; ако същият текст се среща и в анотация или в свойствата на документа, те не се засягат.

Записът добавя нова текстова инструкция в края на потока със съдържание на страницата, като започва от позицията на базовата линия на оригиналния ред и използва повторно размера и цвета му. След като редът по-горе се промени на Hello World 2, в края на страницата се добавя следното:

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

Първият BT използва оригиналния шрифт F4 и оригиналните номера на глифове, така че Hello World се използва повторно непроменен. Цифрата „2“ я няма в оригиналното подмножество на шрифта, затова вторият BT стартира нов стандартен шрифт Helvetica (F9), за да я изчертае. q и Q ограничават преобразуването на координатите и цвета на този блок само до него; редакторът обгръща и оригиналното съдържание в двойка q/Q, за да не може състояние, останало небалансирано в края на оригиналната страница, да повлияе на новия текст. Така изглеждаше един фрагмент; числата се различават от файл на файл.

Добавянето в края има три последици:

  • Новият текст се изчертава последен, върху всичко останало на страницата. Текст, който е бил под изображение или цветен блок, след редакция се появява над него.
  • Инструмент, който извлича текст по реда на потока със съдържание (като pdftotext -raw), чете редактирания ред последен на тази страница, докато извличането по позиция (pdftotext -layout) не показва промяна. Страницата изглежда същата, но редът на четене се е променил.
  • Редакторът прикачва към новия текст ActualText, който казва на програмата за преглед на кои действителни знаци съответстват глифовете. Един глиф може да отговаря на няколко знака, а търсенето само по номера на глифа понякога връща знак за съвместимост (например за 文 се намира радикалът Канси ⽂); ActualText гарантира, че копираното е това, което сте написали.

Кой шрифт чертае новия текст

Повторното използване на оригиналния шрифт е най-безопасно, защото формата на глифовете, плътността и ширината съвпадат със съседния текст. Дали може да се използва, зависи от това дали редакторът може да определи какъв код има знакът в този шрифт:

  • Съставен шрифт като този по-горе (Type0, двубайтови номера на глифове, кодировка Identity-H): знакът се търси в шрифта за номера на глифа и ако е намерен, се използва. Ако не е намерен, знакът не е в подмножеството.
  • Еднобайтов прост шрифт (TrueType, Type1) с кодировка WinAnsi или MacRoman: съответствието между знак и байт е фиксирано, а ширините идват от таблицата с ширини във файла.
  • Шрифт с нестандартна кодировка (Differences) или такъв, който разчита на вградената кодировка на шрифта: няма надеждно съответствие, затова редакторът не налучква и преминава към резервен шрифт, иначе текстът би излязъл с изкривени знаци.

Когато знакът не е в оригиналния шрифт, се използва резервен шрифт. Обикновените латински букви се чертаят с най-близкия от Helvetica, Times и Courier, стандартни шрифтове, които има всяка програма за преглед, така че не е нужно нищо да се вгражда. Всичко останало, като китайски йероглифи, кана, хангъл, тайски, латински букви с диакритики, кирилица и гръцки, използва шрифт Noto с отворен код: сървърът взема знаците от заявката и изрязва от пълния шрифт само тези глифове с библиотеката за подмножества HarfBuzz с отворен код, обикновено няколко КБ, а браузърът ги вгражда във вашия файл. Регионалната форма на китайския знак се определя от езика на интерфейса: опростена, традиционна, японска или корейска.

Глифовете се вграждат, вместо да се записва само името на шрифта, защото шрифт, посочен само с име, се заменя от всяка програма за преглед с резервния, който тя сама избере, и плътността може да се различава между програмите; след вграждането всяка програма показва едни и същи форми.

Защо само по един ред

Редакторът няма механизъм за подредба. Позицията на всеки глиф е фиксирана във файла; новият текст просто се нарежда надясно от началната точка според ширините на шрифта, без логика „пренеси на нов ред при ръба“, и нищо след него не се премества. Ако удължите реда, допълнителните знаци продължават надясно, а каквото мине отвъд ръба на страницата, не се вижда. Пренаписването на абзац или добавянето на редове в таблица изисква нова подредба, което значи връщане към изходния файл, от който е направен PDF.

Ширините също идват само от самия шрифт (с колко се измества позицията след всеки глиф), без кернинг и без замяна на глифове. Текст, който не се нуждае от шейпинг, тоест подбор и позициониране на глифовете според контекста (латиница, кирилица, гръцки и китайски знаци), се подрежда правилно. Тайските тонални знаци се нуждаят от позициониране на глифовете, за да застанат на правилното място, което редакторът не прави, така че може да са отместени. Арабският се нуждае от контекстни форми на глифовете и подредба отдясно наляво, ивритът се нуждае от подредба отдясно наляво, а индийските писмености се нуждаят от съчетаване на съгласни и гласни знаци в глифове; всичко това изисква пълен шейпинг, който редакторът засега не прави, затова въвеждането им се отхвърля, вместо да даде грешни знаци.

Още две ограничения идват от самия файл. Съдържанието на сканирана страница е едно изображение без текстови оператори, така че няма какво да се изтрива или променя. След като файл с цифров подпис бъде редактиран, оригиналното съдържание, което подписът е защитавал, е променено и подписът вече не е валиден.

Проверете сами

Описаните промени можете да видите в изтеглен файл с три команди:

pdftotext -raw edited.pdf -      # извличане по реда на потока със съдържание: старият текст го няма, редактираният ред е последен
pdffonts edited.pdf              # списък на шрифтовете: оригиналните шрифтове, използвани повторно, и новото вградено подмножество на шрифт
qpdf --qdf --object-streams=disable edited.pdf edited.qdf   # разгъва потока със съдържание; добавеният блок BT ... ET е в края

Продължете да четете

Open tool
Process in the browser — no watermark, files removed after the job.
Open tool
Read next
Как да дадете на AI асистент PDF инструменти: начало с @pdf123/mcp, локален срещу хостван
Свържете @pdf123/mcp с Claude Code, Claude Desktop или Cursor за две минути, за да може AI асистент да обединява, компресира и преобразува PDF на вашата машина по път до файла. Локалният сървър подава само пътища; хостваната крайна точка /mcp иска файла като base64 в аргументите на инструмента; PDFX_MCP_ROOT ограничава кои директории локалният сървър може да чете и записва.
От Markdown към PDF и обратно: какво запазва преобразуването на формати
Markdown↔PDF пази заглавията, списъците и простите таблици по-добре от пикселите. Точните шрифтове, разбивката и оформлението не оцеляват като цикъл без загуби.
Какво има вътре в PDF: обекти, потоци и таблицата с кръстосани препратки
PDF е граф от номерирани обекти, компресирани потоци и xref с отмествания в байтове. Get Info го преглежда; Repair възстановява структурата, когато картата се счупи.