Редактирование PDF с XPDF (или с чем-то еще)

Я хотел бы спросить, можно ли редактировать файлы PDF с помощью библиотеки xpdf, и если да, то как? Я думаю, что это возможно, но я не смог найти учебник или документацию для xpdf, поэтому я понятия не имею:( . Я также открыт для использования другой библиотеки, если какая-либо другая имеет поддержку для редактирования PDF. Мое единственное требование для такой библиотеки что это должна быть библиотека C++ или хотя бы библиотека C и она должна быть кроссплатформенной (Windows и Linux)

Мне нужно только базовое редактирование PDF-файла, например:

"это текст в документе PDF" будет изменен на "это текст в PDF" с другим цветом текста.

Спасибо за все ваши ответы!

4 ответа

Решение

Чтобы вы понимали суть того, во что вы ввязываетесь, "базовое редактирование" содержимого 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. Проблема многократная:

  1. Вы должны извлечь страницу и все ее ресурсы (нетривиально)
  2. Вам нужно создать новую страницу, вставить новые ресурсы (вы добавляете новый шрифт), вложить шрифт, если это возможно
  3. Измените поток контента на странице, чтобы включить ваш измененный контент.

И 3 - это то, где вы будете зацикливаться, потому что существует бесконечное количество способов создать страницу с содержанием, которое вы описываете, и даже с приличной библиотекой, вам будет трудно получить, может быть, 70% из них. Позвольте мне кратко описать, почему это так плохо, как кажется. Существуют программы для создания PDF-файлов (я смотрю на вас, troff), которые сначала размещают весь простой текст на странице, а затем весь курсивный текст, а затем весь жирный текст. Клянусь, я не придумываю это. Некоторые программы хотят уложить текст очень точно, поэтому, если вам повезет, они будут использовать оператор TJ, который размещает текст с определенным кернингом. Если вам не повезло (что происходит чаще всего), они вместо этого выкладывают текст с набором ходов перед каждым отдельным глифом на странице. А что, если ваш текст лежит на кривой или необычной ориентации (карты, реклама)? Как насчет случаев, когда кто-то слегка изменяет размер шрифта для большего различия между прописными и строчными буквами или имитирует маленькие заглавные буквы?

Вот почему, когда я написал инструмент поиска текста для Acrobat 1.0, мне потребовалось два месяца, чтобы справиться с таким количеством крайних случаев. Это не редактирование текста - это просто попытка найти одно слово или фразу.

Я не собираюсь рекомендовать библиотеку для вас - извините - я кратко рассмотрел xpdf, и неясно, имеет ли она возможности генерации PDF или это просто потребитель PDF. PdfLib, который является коммерческим продуктом, по-видимому, предназначен для создания PDF, хотя неясно, может ли он его потреблять, но вы наверняка могли бы получить обе стороны, склеив их вместе.

Если бы это был я, я бы использовал инструменты, которые я разработал, и я бы все еще немного стеснялся этой задачи. Моя библиотека используется компанией Atalasoft, в которой я работаю, для создания PDF-файлов из цельного полотна и редактирования в очень ограниченном домене (аннотации, метаданные документа). Самое сложное в том, что мы делаем все возможное, чтобы скрыть сложность PDF от наших клиентов. В целом, наши клиенты хотят, чтобы мы поняли спецификацию вместо них и упростили все остальное - но такие задачи (редактирование - другое) действительно трудно выполнить, не понимая глубины спецификации PDF. Если вы начнете входить в библиотечный мир PDF-манипуляций, вам следует начать с чтения спецификации, особенно главы 8 (Графика) и главы 9 (Текст), и вы лучше поймете, что вам нужно делать с библиотекой.

xpdf - это библиотека PDF только для чтения. Это не может написать PDF намного меньше изменяющего содержания.

Вы смотрели на Itext/ISHarp для редактирования файлов PDF?

Хотя это не библиотека в традиционном смысле, Pdfedit имеет возможности редактирования сценариев. Но это требует QT. PodoFo, вероятно, лучше всего соответствует вашим требованиям. Там также PdfHummus.

Но имейте в виду, что если вы ожидаете редактировать текст из PDF, созданный инструментами вне вашего контроля, вы, вероятно, столкнетесь с некоторыми проблемами. Проблема - и @plinth упомянула об этом - есть много способов генерировать текст, который выглядел бы одинаково, но контекстуально очень отличался бы друг от друга.

Другие вопросы по тегам