Редактирование PDF с XPDF (или с чем-то еще) - PullRequest
3 голосов
/ 19 января 2010

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

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

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

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

Ответы [ 4 ]

14 голосов
/ 20 января 2010

Чтобы вы понимали суть того, во что вы ввязываетесь, «базовое редактирование» содержимого 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 от наших клиентов. В целом, наши клиенты хотят, чтобы us понимали спецификацию вместо них и упростили все остальное - но такие задачи (еще одна редакция) действительно трудно выполнить без понимания глубины спецификации PDF. , Если вы начнете входить в библиотечный мир PDF-манипуляций, вам следует начать с чтения спецификации, особенно главы 8 (Графика) и главы 9 (Текст), и вы лучше поймете, что вам нужно делать с библиотекой.

2 голосов
/ 14 октября 2011

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

0 голосов
/ 25 января 2015

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

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

0 голосов
/ 19 января 2010

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

...