Редактирование PDF с помощью XPDF (или с помощью чего-то другого)
Вопрос
Я хотел бы спросить, возможно ли редактировать PDF-файлы с помощью ни xpdf библиотека, и если да, то каким образом?Я предполагаю, что это возможно, но я не смог найти ни учебника, ни документации для xpdf, так что я действительно понятия не имею : ( .Я также открыт для использования другой библиотеки, если какая-либо другая поддерживает PDF редактирование.Мое единственное требование к такой библиотеке заключается в том, что она должна быть C++ библиотека или, по крайней мере, C один и должен быть кроссплатформенным (Windows и Linux)
Мне нужно только базовое редактирование PDF-файла, например:
"это текст в PDF-документе" было бы изменено на "это текст в формате pdf", а также с другим цветом текста.
Спасибо за все ваши ответы!
Решение
Просто чтобы вы понимали масштаб того, во что вы ввязываетесь, "базовое редактирование" содержимого 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-файлов (я смотрю на тебя, трофф), которые сначала размещают весь обычный текст на странице, затем выделяют весь текст курсивом, затем весь текст жирным шрифтом.Клянусь, я ничего не выдумываю.Некоторые программы хотят расположить текст очень точно, поэтому, если вам повезет, они будут использовать оператор TJ, который выделяет текст с определенным кернингом.Если вам не повезет (что происходит в большинстве случаев), вместо этого они размещают текст с набором ходов перед каждым отдельным символом на странице.А что, если ваш текст нанесен криво или в необычной ориентации (карты, объявления)?Как насчет случаев, когда кто-то незаметно изменяет размер шрифта для большего различия между верхним и нижним регистром или имитирует маленькие заглавные буквы?
Вот почему, когда я писал инструмент поиска текста для Acrobat 1.0, мне потребовалось два месяца пота, чтобы обработать как можно больше крайних случаев.Это не редактирование текста - это просто попытка найти одно слово или фразу.
Я не собираюсь рекомендовать вам библиотеку - извините - я кратко ознакомился с xpdf, и неясно, есть ли у нее возможности генерации PDF или она просто использует PDF.PDFlib, который является коммерческим продуктом, по-видимому, предназначен для генерации PDF-файла, хотя неясно, может ли он его использовать, но вы, безусловно, могли бы получить обе стороны, склеив их вместе.
Если бы это был я, я бы использовал инструменты, которые я разработал, и я бы все еще немного стеснялся этой задачи.Моя библиотека используется Atalasoft ( Аталасофт ), компания, в которой я работаю, для создания PDF-файлов из цельной ткани и для редактирования в очень ограниченной области (аннотации, метаданные документа).Самое сложное заключается в том, что мы делаем все возможное, чтобы скрыть сложность PDF от наших клиентов.В целом, наши клиенты хотят США понять спецификацию вместо них и упростить остальное - но задачи, подобные этой (редактирование - еще одна), действительно трудно выполнить, не понимая глубины спецификации PDF.Если вы начинаете входить в библиотечный мир работы с PDF-файлами, вам следует начать с чтения спецификации, особенно главы 8 (Графика) и главы 9 (текст), и вы получите лучшее представление о том, что вам придется делать с библиотекой.
Другие советы
xpdf - это библиотека PDF, доступная только для чтения.Он не может записывать PDF, не говоря уже об изменении содержимого.
Вы смотрели Itext / iSharp для редактирования PDF-файлов?
Хотя и не библиотека в традиционном смысле этого слова, Pdfправить имеет возможности редактирования по сценарию.Но для этого требуется QT. ПодоФо вероятно, лучше всего соответствует вашим требованиям.Есть также PdfХуммус.
Но имейте в виду, что если вы собираетесь редактировать текст из PDF-файла, созданного с помощью инструментов, находящихся вне вашего контроля, вы, вероятно, столкнетесь с некоторыми проблемами.Проблема в том - и @plinth упоминал об этом - есть много способов сгенерировать текст, который выглядел бы похожим, но контекстуально сильно отличается друг от друга.