Чтобы вы понимали суть того, во что вы ввязываетесь, «базовое редактирование» содержимого PDF почти всегда нетривиально.
Содержание страницы в PDF представлено короткими программами RPN, которые рисуют на странице. Это небольшой язык, похожий на PostScript в семантике, но без циклических структур или определений функций (так что проблем с остановкой нет). В нормальном мире ваш текст на странице будет представлен примерно так:
BT /F1 12 Tf 72 720 Td (this is a text in a pdf document) Tj ET
что в переводе на что-то более знакомое это:
BeginText();
SetFont(F1, 12.0); // Font 1, 12.0 pt
TextMoveTo(72, 720);
ShowText("this is a text in a pdf document");
EndText();
Так что в этом случае вы должны преобразовать это в нечто вроде этого:
BeginText();
SetFont(F1, 12.0); // Font 1, 12.0 pt
TextMoveTo(72, 720);
ShowText("this is a ");
SetFont(F2, 12);
ShowText("text");
SetFont(F1, 12);
ShowText(" in a pdf document");
EndText();
который станет:
BT /F1 12 Tf 72 720 Td (this is a ) Tj /F2 12 Tf (text) Tj /F1 12 Tf
( in a pdf document) Tj ET
в эквивалентном PDF. Проблема многократная:
- Вы должны извлечь страницу и все ее ресурсы (нетривиально)
- Вы должны сгенерировать новую страницу, вставить новые ресурсы (вы добавляете новый шрифт), вложить шрифт, если это разрешено
- Измените поток содержимого страницы, чтобы включить в него измененный контент.
И 3 - это то место, где вы будете зацикливаться, потому что существует бесконечное количество способов создать страницу с содержанием, которое вы описываете, и даже с приличной библиотекой, вам придется нелегко получая, возможно, 70% из них. Позвольте мне кратко описать, почему это так плохо, как кажется. Существуют программы генерации PDF (я смотрю на вас, troff), которые сначала размещают весь простой текст на странице, а затем весь курсивный текст, а затем весь жирный текст. Клянусь, я не придумываю это. Некоторые программы хотят уложить текст очень точно, поэтому, если вам повезет, они будут использовать оператор TJ, который размещает текст с определенным кернингом. Если вам не повезло (что происходит чаще всего), они вместо этого выкладывают текст с набором ходов перед каждым отдельным глифом на странице. А что, если ваш текст лежит на кривой или необычной ориентации (карты, реклама)? А как насчет случаев, когда кто-то тонко меняет размер шрифта для большего различия между прописными и строчными буквами или имитирует маленькие заглавные буквы?
Вот почему, когда я написал инструмент поиска текста для Acrobat 1.0, мне потребовалось два месяца, чтобы справиться с таким количеством крайних случаев. Это не редактирование текста - это просто попытка найти отдельное слово или фразу.
Я не собираюсь рекомендовать вам библиотеку - извините - я кратко рассмотрел xpdf, и неясно, имеет ли он возможности генерации PDF или это просто потребитель PDF. PdfLib, который является коммерческим продуктом, по-видимому, предназначен для создания PDF, хотя неясно, может ли он его потреблять, но вы наверняка могли бы получить обе стороны, склеив их вместе.
Если бы это был я, я бы использовал инструменты, которые я разработал, и я бы все еще немного стеснялся этой задачи. Моя библиотека используется Atalasoft , компанией, в которой я работаю, для создания PDF-файлов из цельного полотна и редактирования в очень ограниченном домене (аннотации, метаданные документа). Самое сложное в том, что мы делаем все возможное, чтобы скрыть сложность PDF от наших клиентов. В целом, наши клиенты хотят, чтобы us понимали спецификацию вместо них и упростили все остальное - но такие задачи (еще одна редакция) действительно трудно выполнить без понимания глубины спецификации PDF. , Если вы начнете входить в библиотечный мир PDF-манипуляций, вам следует начать с чтения спецификации, особенно главы 8 (Графика) и главы 9 (Текст), и вы лучше поймете, что вам нужно делать с библиотекой.