Редактирование 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. Проблема многократная:
- Вы должны извлечь страницу и все ее ресурсы (нетривиально)
- Вам нужно создать новую страницу, вставить новые ресурсы (вы добавляете новый шрифт), вложить шрифт, если это возможно
- Измените поток контента на странице, чтобы включить ваш измененный контент.
И 3 - это то, где вы будете зацикливаться, потому что существует бесконечное количество способов создать страницу с содержанием, которое вы описываете, и даже с приличной библиотекой, вам будет трудно получить, может быть, 70% из них. Позвольте мне кратко описать, почему это так плохо, как кажется. Существуют программы для создания PDF-файлов (я смотрю на вас, troff), которые сначала размещают весь простой текст на странице, а затем весь курсивный текст, а затем весь жирный текст. Клянусь, я не придумываю это. Некоторые программы хотят уложить текст очень точно, поэтому, если вам повезет, они будут использовать оператор TJ, который размещает текст с определенным кернингом. Если вам не повезло (что происходит чаще всего), они вместо этого выкладывают текст с набором ходов перед каждым отдельным глифом на странице. А что, если ваш текст лежит на кривой или необычной ориентации (карты, реклама)? Как насчет случаев, когда кто-то слегка изменяет размер шрифта для большего различия между прописными и строчными буквами или имитирует маленькие заглавные буквы?
Вот почему, когда я написал инструмент поиска текста для Acrobat 1.0, мне потребовалось два месяца, чтобы справиться с таким количеством крайних случаев. Это не редактирование текста - это просто попытка найти одно слово или фразу.
Я не собираюсь рекомендовать библиотеку для вас - извините - я кратко рассмотрел xpdf, и неясно, имеет ли она возможности генерации PDF или это просто потребитель PDF. PdfLib, который является коммерческим продуктом, по-видимому, предназначен для создания PDF, хотя неясно, может ли он его потреблять, но вы наверняка могли бы получить обе стороны, склеив их вместе.
Если бы это был я, я бы использовал инструменты, которые я разработал, и я бы все еще немного стеснялся этой задачи. Моя библиотека используется компанией Atalasoft, в которой я работаю, для создания PDF-файлов из цельного полотна и редактирования в очень ограниченном домене (аннотации, метаданные документа). Самое сложное в том, что мы делаем все возможное, чтобы скрыть сложность PDF от наших клиентов. В целом, наши клиенты хотят, чтобы мы поняли спецификацию вместо них и упростили все остальное - но такие задачи (редактирование - другое) действительно трудно выполнить, не понимая глубины спецификации PDF. Если вы начнете входить в библиотечный мир PDF-манипуляций, вам следует начать с чтения спецификации, особенно главы 8 (Графика) и главы 9 (Текст), и вы лучше поймете, что вам нужно делать с библиотекой.
xpdf - это библиотека PDF только для чтения. Это не может написать PDF намного меньше изменяющего содержания.
Хотя это не библиотека в традиционном смысле, Pdfedit имеет возможности редактирования сценариев. Но это требует QT. PodoFo, вероятно, лучше всего соответствует вашим требованиям. Там также PdfHummus.
Но имейте в виду, что если вы ожидаете редактировать текст из PDF, созданный инструментами вне вашего контроля, вы, вероятно, столкнетесь с некоторыми проблемами. Проблема - и @plinth упомянула об этом - есть много способов генерировать текст, который выглядел бы одинаково, но контекстуально очень отличался бы друг от друга.