Эта страница может содержать автоматически переведенный текст.

Редактирование PDF в C#

Используйте Docotic.Pdf для изменения PDF-документов. Это библиотека для редактирования PDF для C# и VB.NET, которая сочетает мощные возможности с интуитивно понятным API.

Значок редактора PDF

Docotic.Pdf предоставляет множество средств для редактирования PDF-документов. Вот некоторые ключевые возможности библиотеки для редактирования PDF:

  • Объединять несколько PDF в один или разбивать один PDF на несколько файлов.
  • Уменьшать размер PDF-файла.
  • Переставлять, удалять, поворачивать или извлекать страницы.
  • Читать, изменять или удалять метаданные PDF.
  • Подписывать PDF цифровыми подписями.
  • Шифровать документы или удалять пароли из PDF.
  • Добавлять, редактировать или удалять аннотации и вложения.
  • Заполнять AcroForms, добавлять или удалять элементы формы.
  • Сплющивать поля формы и аннотации, чтобы сделать их частью содержимого PDF.
  • Добавлять, удалять или заменять текст внутри PDF.
  • Вставлять, заменять и изменять размер изображений.
  • Добавлять водяные знаки и фоны.
  • Преобразовывать отсканированные документы в редактируемый и доступный для поиска текст.

В следующих разделах я подробнее опишу возможности редактирования PDF. Разделы также содержат фрагменты кода и ссылки на соответствующие ресурсы.

Объединение и разбиение PDF

Этот раздел посвящен двум возможностям с противоположными целями.

Разбиение и объединение PDF в C# и VB.NET

Объединение PDF

Когда вы объединяете PDF-файлы, вы создаете один PDF-документ. Объединенный PDF обычно содержит связанную информацию из нескольких существующих PDF-файлов.

Ниже приведен фрагмент кода, показывающий, как объединить PDF-файлы с помощью Docotic.Pdf.

using var pdf = new PdfDocument("first.pdf");
pdf.Append("second.pdf");
pdf.Save("merged.pdf");

Код очень простой, потому что показывает самый базовый случай. У нас есть статья, в которой описаны более сложные случаи объединения. Например, в ней показано, как объединять зашифрованные документы.

Разбиение PDF

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

Следующий фрагмент кода показывает, как создать новый документ из каждой страницы PDF.

using var pdf = new PdfDocument("compound.pdf");
for (int i = 0; i < pdf.PageCount; ++i)
{
    using PdfDocument copy = pdf.CopyPages(i, 1);

    // Помогает уменьшить размер файла, когда скопированные страницы ссылаются
    // на неиспользуемые ресурсы, такие как шрифты, изображения, шаблоны.
    copy.RemoveUnusedResources();
    copy.Save(i + ".pdf");
}

О других подходах к реализации разбиения PDF читайте в отдельной статье.

Сжатие PDF

Есть два основных подхода при сжатии PDF. Первый — применять только операции, которые не изменяют содержимое файла, а только его форму. Второй подход также включает изменения, которые могут привести к потере деталей или качества документа ради лучшего сжатия.

Сжатие PDF без потерь

По умолчанию библиотека сохраняет объекты PDF так, чтобы они занимали меньше байтов. Для этого она исключает неиспользуемые объекты, записывает объекты без форматирования и по возможности использует более короткую форму записи.

Чтобы еще больше улучшить сжатие, Docotic.Pdf также создает потоки объектов в выходных PDF. Это еще одна форма записи объектов в наиболее компактном представлении. Потоки объектов сжимаются алгоритмом Flate.

Вы можете влиять на то, как библиотека сохраняет объекты, с помощью параметров сохранения.

Некоторые документы содержат дублирующиеся шрифты, изображения, цветовые профили и другие объекты. Обычно это характерно для документов с инкрементальными обновлениями и файлов, созданных объединением нескольких документов. Удаление дубликатов этих объектов с помощью метода PdfDocument.ReplaceDuplicateObjects может значительно уменьшить размер выходного файла.

Страницы документа могут ссылаться на неиспользуемые ресурсы. Например, на изображения, которые ранее были видны на странице, но больше не видны. Используйте метод PdfDocument.RemoveUnusedResources, чтобы удалить такие ресурсы.

Все эти операции с PDF уменьшают размер файла без потери качества.

Преобразования с потерями

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

Если изображения в PDF больше, чем нужно, вы можете изменить их размер. Это может дать еще лучшее сжатие. Еще один вариант — преобразовать изображения в черно-белые (битональные).

Вы можете сплющить поля формы и аннотации, чтобы сэкономить место. Это имеет смысл, когда редактируемые аннотации и поля формы в документах больше не нужны.

Шрифты могут занимать много места в документах. Метод PdfDocument.RemoveUnusedFontGlyphs может удалить из шрифтов неиспользуемые глифы, чтобы оптимизировать размер выходного файла. Подмножество шрифта — это другое название для этого процесса. Можно даже полностью удалить байты шрифта из документа (отвязать шрифт от встраивания). Это может иметь смысл, если документ содержит байты популярного шрифта, например Arial.

Другие преобразования напрямую удаляют информацию из документов. Вы можете удалить метаданные, структурную информацию и приватные данные приложения. Эти данные не видны, но удалять их следует только если они не важны для пользователей ваших документов.

Чтобы узнать подробнее и увидеть примеры кода, прочитайте статью о том, как уменьшить размер PDF-файла.

Переупорядочивание страниц в PDF

Есть немало причин менять порядок страниц в PDF. Например, может потребоваться сгруппировать связанную информацию вместе или улучшить читаемость документа, обеспечив логичный ход документа.

Перестановка страниц в PDF

Помимо возможности объединять и разделять страницы, Docotic.Pdf предоставляет широкий набор других методов для перестановки страниц в PDF. Я использую фрагменты кода на C# и API Docotic.Pdf, чтобы показать, как организовать страницы PDF.

Полные тестовые проекты для примеров этого раздела вы можете найти в группе Страницы и навигация примеров кода. В фрагментах я использую ten-pages.pdf. Это простой тестовый документ с заголовком Page N на каждой странице.

Перемещение страниц PDF

Следующий фрагмент показывает, как перемещать непрерывные диапазоны страниц. Код перемещает первую половину страниц в конец документа.

using var pdf = new PdfDocument("ten-pages.pdf");

pdf.MovePages(0, 5, pdf.PageCount);

pdf.Save("continuous-move.pdf");

Можно перемещать произвольные наборы страниц. Следующий код перемещает нечетные страницы в конец документа.

using var pdf = new PdfDocument("ten-pages.pdf");

int[] indexes = [0, 2, 4, 6, 8];
pdf.MovePages(indexes, pdf.PageCount);

pdf.Save("arbitrary-move.pdf");

Чтобы переместить только одну страницу, используйте метод PdfDocument.MovePage.

Обмен страниц PDF

Чтобы поменять две страницы местами, используйте код, как в следующем фрагменте.

using var pdf = new PdfDocument("ten-pages.pdf");

pdf.SwapPages(9, 0);
pdf.SwapPages(8, 1);

pdf.Save("swapped.pdf");

Метод PdfDocument.SwapPages принимает индексы двух страниц, которые должны занять позиции друг друга. Когда число страниц не равно двум, используйте один из методов перемещения страниц.

Добавление и вставка страниц

Любой PdfDocument содержит как минимум одну страницу. Когда вы создаете новый документ, библиотека неявно добавляет одну страницу.

Вот как вставить пустую страницу в PDF с помощью API Docotic.Pdf. Вы можете вставлять страницы в позиции с индексами от 0 до PageCount включительно.

using var pdf = new PdfDocument();

var newPage = pdf.InsertPage(0);
newPage.Canvas.DrawString("This is the new first page");

pdf.Save("two-pages.pdf");

Чтобы добавить пустую страницу в PDF, используйте метод PdfDocument.AddPage. Метод добавляет новую страницу в конец документа. Он делает то же самое, что и вызов pdf.InsertPage(pdf.PageCount).

Чтобы добавить или вставить страницы из другого документа, используйте комбинацию вызовов, как описано в разделе Добавление PDF в начало. Вы можете использовать эту комбинацию вызовов, чтобы добавить титульную страницу в PDF.

Дублирование страниц PDF

С помощью API библиотеки вы можете выполнить операцию дублирования как две последовательные операции. Первая — копирование страниц. См. пример кода в разделе Разбиение PDF.

Вторая — вставка страниц. Для этой операции используйте метод PdfDocument.Append. Затем переместите добавленные страницы в нужную позицию.

Извлечение страниц

Следующий фрагмент показывает, как извлекать страницы из PDF. Он извлекает первые три страницы из исходного документа.

using var pdf = new PdfDocument("ten-pages.pdf");

using (var extracted = pdf.ExtractPages(0, 3))
{
    extracted.RemoveUnusedResources();
    extracted.Save("three-pages.pdf");
}

pdf.Save("seven-pages.pdf");

Метод ExtractPages удаляет страницы из документа. Из-за этого в исходном документе остается только семь страниц. Библиотека не позволяет извлекать страницы из документа, содержащего только одну страницу.

Мы рекомендуем удалять неиспользуемые ресурсы из документа с извлеченными страницами.

Удаление страницы из PDF

Посмотрите фрагмент, показывающий, как удалить страницу в PDF-документе. На самом деле он удаляет две страницы с использованием разных перегрузок метода RemovePage. Первая перегрузка принимает индекс страницы в качестве параметра. Вторая — объект страницы.

using var pdf = new PdfDocument("ten-pages.pdf");
pdf.RemovePage(0);
pdf.RemovePage(pdf.Pages[0]);
pdf.Save("without-first-two-pages.pdf");

Чтобы удалить сразу больше одной страницы, используйте метод PdfDocument.RemovePages. Перегрузки этого метода работают с массивами индексов страниц или объектов страниц.

Цифровые подписи

Docotic.Pdf реализует множество операций для цифровых подписей в PDF и может помочь вам поддерживать надежность и юридическую силу ваших PDF-документов. Вот несколько примеров того, что может делать библиотека:

Подписывать PDF сертификатом. Добавление цифровых подписей в PDF — это способ подтвердить личность подписанта и убедиться, что после подписания документ никто не изменял.

Сертифицировать подпись. Чтобы добавить дополнительные ограничения к PDF, вы можете подписать его сертификационной подписью. Вы можете полностью заблокировать PDF после подписания или разрешить лишь несколько типов изменений.

Проверять подпись в PDF. Проверяйте действительность цифровой подписи, чтобы убедиться, что подписанная часть документа не изменилась.

Разрешать несколько подписей. Контракты, соглашения и формы часто требуют, чтобы один документ подписали несколько сторон. Добавление нескольких подписей в PDF требует, чтобы документ сохранялся инкрементально.

Встраивать метку времени подписи. В параметрах подписи можно указать URL службы метки времени и, при необходимости, ее учетные данные. Библиотека встроит полученную метку времени в подпись.

Встраивать сертификат. Библиотека автоматически встраивает сертификаты подписания в цифровые подписи.

На странице Цифровые подписи есть примеры кода и дополнительная информация по каждой операции.

Защита PDF

Есть три возможности, которые можно использовать для обеспечения безопасности PDF. Docotic.Pdf может работать с ними в обе стороны: библиотека может защищать PDF и разблокировать защищенный PDF.

Безопасность PDF

Защита паролем

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

В PDF есть два типа паролей:

  • Пароль на открытие (пароль пользователя). Этот тип пароля требуется, чтобы открыть и просмотреть PDF. Без правильного пароля совместимый просмотрщик PDF не откроет документ.
  • Пароль разрешений (пароль владельца). Этот пароль требуется, чтобы снять ограничения с PDF. Открытие PDF с паролем владельца разрешает все действия, даже если ограничения запрещают некоторые операции, такие как печать, копирование или редактирование PDF.

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

Шифрование

Шифрование PDF и пароли PDF работают вместе, чтобы обеспечить доступ к конфиденциальной информации внутри PDF только законным пользователям. Только пользователи с правильным ключом расшифровки или паролем могут просматривать содержимое.

Docotic.Pdf может шифровать PDF-файлы с использованием алгоритмов RC4 40-bit, RC4 128-bit, AES 128-bit и AES 256-bit.

Разрешения и ограничения

Вы можете задать различные разрешения для PDF, например ограничить печать, копирование текста, редактирование документа и другое. Разрешения влияют только на поведение при открытии PDF с паролем пользователя. Любые ограничения не применяются к тем, кто открывает PDF с паролем владельца.

Чтобы удалить ограничения из PDF, сначала нужно удалить пароль защиты PDF. Прочитайте о том, как это сделать с помощью C# и API Docotic.Pdf.

Чтобы узнать, как обеспечить целостность PDF дополнительно к безопасности PDF, прочитайте раздел о цифровых подписях.

Метаданные в PDF

Метаданные PDF — это информация, встроенная в PDF-файл и описывающая документ. Есть два основных источника метаданных: свойства PDF-документа и метаданные XMP.

Свойства документа также обычно называют словарем информации документа, информацией о файле, полями метаданных, атрибутами документа и атрибутами файла.

Метаданные XMP (Extensible Metadata Platform) — это, по сути, XML-файл, встроенный в PDF. XMP использует гибкую модель данных, которая может хранить любой набор свойств метаданных. Эти метаданные используют пространства имен для группировки связанных свойств. К распространенным пространствам имен относятся XMP Core/XMP Basic и Dublin Core.

Docotic.Pdf полностью поддерживает как метаданные XMP, так и свойства документа. Обратите внимание, что стандарт PDF 2.0 пометил большинство свойств словаря информации документа как устаревшие. Единственные исключения — дата создания и дата изменения.

Полные тестовые проекты для примеров этого раздела вы можете найти в группе Метаданные примеров кода.

Свойства документа

Посмотрите, как редактировать свойства документа с помощью Docotic.Pdf.

using var pdf = new PdfDocument("file.pdf");
pdf.Info.Author = "An example code";
pdf.Info.Subject = "Showing how to access and change document metadata";
pdf.Info.Title = "Custom title goes here";
pdf.Info.Keywords = "pdf Docotic.Pdf";

pdf.Save("updated-file.pdf");

Вы можете изменять значения каждого свойства, но обратите внимание, что по умолчанию библиотека автоматически обновляет некоторые свойства перед сохранением PDF. Это можно изменить в параметрах сохранения.

Чтобы удалить все метаданные, заданные в свойствах документа, используйте метод PdfInfo.Clear. При желании метод может удалить только пользовательские свойства.

Метаданные XMP

Этот фрагмент показывает, как изменить свойства метаданных XMP в PDF-документе.

using var pdf = new PdfDocument("file.pdf");

pdf.Metadata.DublinCore.Creators = new XmpArray(XmpArrayType.Ordered);
pdf.Metadata.DublinCore.Creators.Values.Add(new XmpString("me"));
pdf.Metadata.DublinCore.Creators.Values.Add(new XmpString("Docotic.Pdf"));
pdf.Metadata.DublinCore.Format = new XmpString("application/pdf");

pdf.Metadata.Pdf.Producer = new XmpString("me too!");

pdf.Save("updated-file.pdf");

Код изменяет свойства в схемах Dublin Core и Adobe PDF. Обратите внимание, что свойство Producer перезаписывается из-за параметров сохранения по умолчанию.

Вы можете извлечь необработанные метаданные XMP с помощью одного из методов XmpMetatada.Save. Метод создаст XML со всеми свойствами.

Чтобы удалить все метаданные XMP из документа, используйте метод XmpMetadata.Unembed.

Синхронизация метаданных

Желательно убедиться, что и метаданные XMP, и свойства Document Info имеют одинаковые значения для соответствующих свойств. Это особенно важно, если вы редактируете оба источника метаданных в одном файле.

Используйте метод PdfDocument.SyncMetadata, чтобы синхронизировать значения в метаданных XMP и Document Info. Когда свойство изменено в обоих источниках, метод перезапишет один источник значением из другого. Подробнее читайте в документации к методу.

Закладки PDF

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

Структура PDF

Приложения просмотра обычно отображают закладки как оглавление в книге, но интерактивное. Когда читатель нажимает на закладку, приложение просмотра переходит к указанной части документа. Аналогичного поведения можно добиться с помощью ссылочных аннотаций.

Вот фрагмент кода на C#, показывающий, как добавить закладки в PDF:

using var pdf = new PdfDocument("ten-pages.pdf");

var root = pdf.OutlineRoot;
root.AddChild("Fifth page", 4);
root.AddChild("Seventh page", pdf.Pages[6]);

pdf.PageMode = PdfPageMode.UseOutlines;
pdf.Save("simple-bookmarks.pdf");

Структура PDF может содержать основные закладки и подзакладки, что упрощает организацию больших документов. Вот как создать подзакладки в PDF:

using var pdf = new PdfDocument("ten-pages.pdf");

var root = pdf.OutlineRoot;
var evenPages = root.AddChild("Even pages");

evenPages.AddChild("Second page", 1);
evenPages.AddChild("Fourth page", 3);

pdf.PageMode = PdfPageMode.UseOutlines;
pdf.Save("even-pages-bookmarks.pdf");

К закладкам можно применять шрифты и цвета. Посмотрите полный пример создания структуры со стилями.

Чтобы удалить закладку из PDF, используйте методы RemoveChild или RemoveChildAt. Вы можете удалить все закладки, вызвав метод RemoveAllChildren у корневого узла.

Вложения файлов

Вложения PDF — это внешние файлы, встроенные в PDF-документ. Такие файлы также обычно называют встроенными файлами и вложениями. Вы можете прикрепить любой файл: изображение, аудио- или видеофайл, другой PDF, документ Word, таблицы Excel или что угодно еще.

Если вы хотите прикрепить PDF друг к другу, создавая объединенный PDF-файл, прочитайте статью об объединении PDF-документов.

Ниже приведен код на C#, показывающий, как добавить вложение в PDF с помощью API Docotic.Pdf.

using var pdf = new PdfDocument();

var excelFile = pdf.CreateFileAttachment("this-year-figures.xlsx");
pdf.SharedAttachments.Add(excelFile);

pdf.Save("shared-attachment.pdf");

Приведенный выше код добавил файл как общее вложение. Читатели могут найти вложенный файл на панели Attachments в своем просмотрщике.

Также можно добавлять вложения на страницы PDF. Такие вложения видны внутри содержимого страницы как любые другие аннотации.

using var pdf = new PdfDocument();

var page = pdf.Pages[0];
page.Canvas.DrawString(20, 100, "Here is this year's figures document:");

var bounds = PdfRectangle.FromLTRB(155, 100, 165, 110);
var excelFile = pdf.CreateFileAttachment("this-year-figures.xlsx");
pdf.Pages[0].AddFileAnnotation(bounds, excelFile);

pdf.Save("page-attachment.pdf");

Полные тестовые проекты для примеров этого раздела вы найдете в группе Вложения примеров кода.

Чтобы удалить вложения из PDF, нужно перечислить и общие вложения, и аннотации страниц, а затем удалить ненужные элементы. См. пример кода перечисления ниже. Чтобы удалить все общие аннотации, можно вызвать pdf.SharedAttachments.Clear().

Чтобы извлечь встроенные файлы из PDF, также потребуется перечислить коллекции. Вот пример кода:

using var pdf = new PdfDocument("file-with-attachments.pdf");

int i = 0;
foreach (var attachment in pdf.SharedAttachments)
{
    if (attachment?.Contents == null)
        continue;

    var fileName = attachment.Specification ?? $"attachment{i++}";
    attachment.Contents.Save(fileName);
}

foreach (var widget in pdf.GetWidgets())
{
    var attachment = (widget as PdfFileAttachmentAnnotation)?.File;
    if (attachment?.Contents == null)
        continue;

    var fileName = attachment.Specification ?? $"attachment{i++}";
    attachment.Contents.Save(fileName);
}

Метки страниц

Метки страниц PDF — это пользовательские имена или номера, назначаемые страницам в PDF-документе. В отличие от стандартных номеров страниц, метки могут включать смесь букв, цифр и даже римских чисел. Другие названия меток страниц — идентификаторы страниц и имена страниц.

Вот как добавить метки страниц в PDF с помощью Docotic.Pdf:

using var pdf = new PdfDocument("ten-pages.pdf");

pdf.PageLabels.AddRange(0, 3, PdfPageNumberingStyle.LowercaseRoman);
pdf.PageLabels.AddRange(4, PdfPageNumberingStyle.DecimalArabic, string.Empty, 5);
pdf.PageLabels.AddRange(7, PdfPageNumberingStyle.DecimalArabic, "Appendix page ", 1);

pdf.Save("page-labels.pdf");

Первые четыре страницы будут иметь метки i, ii, iii и iv. Следующие три метки — 5, 6 и 7. Для оставшихся страниц метки будут Appendix page 1, Appendix page 2 и Appendix page 3.

OCR PDF

Некоторые PDF-документы содержат отсканированные страницы и требуют оптического распознавания символов (OCR), прежде чем вы сможете извлечь из них текст. Еще один сценарий использования OCR — извлечение текста из PDF, который использует пользовательское сопоставление глифов с Unicode.

OCR отсканированного PDF для извлечения текста

У нас есть статья в блоге, показывающая, как выполнить OCR отсканированных документов. В статье есть пример PDF без возможности поиска и показано, как использовать Tesseract OCR, код на C# и Docotic.Pdf для распознавания текста в PDF только с изображениями. С помощью Docotic.Pdf вы также можете добавить в отсканированные PDF-файлы текстовый слой OCR.

Редактирование страниц

Этот раздел посвящен изменениям существующих страниц PDF, например:

  • как поворачивать страницы PDF
  • как изменять размер страницы
  • использовать векторную графику на холсте страницы
  • добавлять HTML-содержимое

Прочитайте о Layout API библиотеки, чтобы узнать, как создавать PDF-документы из таких строительных блоков, как верхний и нижний колонтитулы, таблицы, изображения, абзацы текста и тому подобное.

Посмотрите другие разделы, чтобы узнать о:

Поворот страниц

См. фрагмент кода на C#, показывающий, как повернуть только одну страницу в PDF:

using var pdf = new PdfDocument("existing.pdf");

pdf.Pages[0].Rotation = PdfRotation.Rotate180;

pdf.Save("rotated.pdf");

Код поворачивает первую страницу на 180 градусов. Вы также можете поворачивать страницы PDF на 0, 90 и 270 градусов.

Изменение размера страницы

Docotic.Pdf предоставляет несколько способов изменить размер страницы PDF. В простейшем случае можно использовать свойства Width и Height объекта PdfPage, чтобы задать нужный размер. Для существующего документа это не изменит содержимое страниц документа по размеру. И не удалит никакое содержимое. Будет просто скрыто все содержимое страницы, которое находится за пределами прямоугольника указанного размера.

Похожий подход — обрезка страниц. Вы можете изменить CropBox страницы, используя код на C# примерно так:

using var pdf = new PdfDocument("existing.pdf");

var page = pdf.Pages[0];
var cropBoxBefore = page.CropBox;
page.CropBox = new PdfBox(0, cropBoxBefore.Height - 256, 256, cropBoxBefore.Height);

pdf.Save("cropped.pdf");

Изменение области обрезки — это правильный путь, если вы хотите сохранить часть страницы как изображение.

Если цель — сохранить все содержимое видимым на странице другого размера, используйте подход со масштабированием. В следующем фрагменте я создаю XObject из страницы. XObject — это как векторное изображение. Вы можете рисовать один и тот же объект на нескольких страницах, масштабируя и поворачивая его по необходимости.

После того как XObject готов, я очищаю предыдущее содержимое страницы, изменяю размер страницы, а затем рисую объект на странице с новым размером.

using var pdf = new PdfDocument("existing.pdf");

var page = pdf.Pages[0];
var pageXObject = pdf.CreateXObject(page);

page.Canvas.Clear();
page.Width /= 2;
page.Height /= 2;

page.Canvas.DrawXObject(pageXObject, 0, 0, page.Width, page.Height, 0);

pdf.Save("resized.pdf");

Векторная графика

Библиотека Docotic.Pdf может добавлять векторную графику, такую как линии, кривые и фигуры, в PDF-документы. Вы можете строить графические пути из графических объектов. Затем можно заливать или обводить пути цветами из разных цветовых пространств.

Примеры кода для функций, связанных с графикой, находятся в группе Графика примеров кода.

Также можно извлекать графику из PDF. Начните с вызова метода GetObjects, а затем извлеките информацию из объектов типа PdfPageObjectType.Path. Не забывайте, что XObject также могут содержать вложенные пути.

using var pdf = new PdfDocument("existing.pdf");

var options = new PdfObjectExtractionOptions();
var objects = pdf.Pages[0].GetObjects(options);
foreach (var obj in objects)
{
    if (obj.Type == PdfPageObjectType.Path)
    {
        var path = (PdfPath)obj;
        Console.WriteLine($"Found path {path}");
    }
    else if (obj.Type == PdfPageObjectType.XObject)
    {
        var paintedXObject = (PdfPaintedXObject)obj;
        var nestedObjects = paintedXObject.XObject.GetObjects(options);
        // ...
    }
}

Добавление HTML на страницы PDF

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

Прочитайте о том, как вставить HTML в PDF, чтобы узнать подробности и скачать пример кода.

Редактирование текста PDF

Этот раздел посвящен тому, как редактировать текст в PDF, как изменить цвет текста в PDF и как добавить новый текст.

Редактор PDF изменяет текст

У нас есть статья, посвященная извлечению текста из PDF. Посмотрите ее, если хотите узнать больше по теме.

Сплющивание текста также возможно с помощью Docotic.Pdf.

Поиск и замена

Чтобы изменить текст в PDF, сначала нужно найти область, содержащую текст, а затем удалить текст в этой области. Последний шаг — добавить новый текст в ту же область документа.

Поиск в PDF может быть непростым, потому что внутри документа слова могут располагаться в любом порядке. Текст также может быть повернут. К счастью, у нас есть пример кода, показывающий как искать слова или фразы в PDF.

Когда у вас есть координаты текста, который нужно удалить, пора редактировать содержимое соответствующей страницы. Библиотека предоставляет средства для перечисления и копирования объектов страницы. Поэтому можно пропустить часть текста при копировании объектов. Это по сути и удалит текст. Код примера редактирования содержимого страницы PDF показывает все детали процесса. Вам нужно будет обновить метод ShouldRemoveText, чтобы использовать найденные координаты.

Прочитайте следующий раздел, чтобы увидеть, как добавить новый текст в документ.

Если вы создаете документы с текстом-заполнителем, а затем заменяете заполнитель на другой текст, вместо этого можно использовать текстовые поля.

Идея состоит в том, чтобы добавить в документ текстовое поле только для чтения без рамок и поместить в него текст-заполнитель. Позже вы можете открыть документ, найти текстовое поле по имени и заменить заполнитель простым вызовом box.Text = "new text";. После замены сплющите текстовое поле, если не хотите дальнейших изменений.

Добавление нового текста

Чтобы добавить текст в документы, используйте методы DrawString и DrawText объекта PdfCanvas. Методы используют текущий шрифт холста. Шрифт должен содержать глифы для всех символов в тексте. Используйте метод PdfFont.ContainsGlyphsForText, чтобы проверить, соответствует ли шрифт этому требованию.

var canvas = pdf.Pages[0].Canvas;
canvas.Font = pdf.CreateFont("NSimSun");
canvas.DrawString(10, 50, "Olá. 你好. Hello. This is some new text");

Вы можете добавлять Unicode-текст, отрисованный шрифтами Type1, TrueType и OpenType. Библиотека может использовать шрифты, установленные в системе, 14 встроенных шрифтов Type1 или загружать нужный шрифт из файла.

Изменение цвета текста

Чтобы изменить цвет текста в PDF, используйте тот же подход, что и при удалении текста. Вам нужно будет как минимум изменить метод ReplaceColor в примере кода.

Изображения

Docotic.Pdf предоставляет все необходимое для редактирования изображений в PDF. Ниже приведены фрагменты кода на C# для самых популярных операций.

Группа примеров кода по изображениям содержит полные тестовые проекты для примеров в этом разделе.

Добавление изображения в PDF

Библиотека может импортировать изображения в форматах GIF/TIFF/PNG/BMP/JPEG. Вы также можете добавить изображение из объекта System.Drawing.Image.

var canvas = pdf.Pages[0].Canvas;
var image = pdf.CreateImage("image.jpg");
canvas.DrawImage(image, 10, 50);

Вы можете указать угол поворота и выходной размер, используя перегрузки метода DrawImage. Чтобы рисовать одно и то же изображение на нескольких страницах, добавьте изображение один раз и используйте один и тот же объект PdfImage в нескольких вызовах метода DrawImage.

Объединение изображений в PDF

Ниже приведен код на C#, показывающий, как объединить несколько изображений в один PDF.

using var pdf = new PdfDocument();

var imagePaths = new string[] { "image.jpg", "another-image.png" };
foreach (var path in imagePaths)
{
    var image = pdf.CreateImage(path);

    var page = pdf.AddPage();
    page.Width = image.Width;
    page.Height = image.Height;

    page.Canvas.DrawImage(image, 0, 0);
}

pdf.RemovePage(0);
pdf.Save("combined-images.pdf");

Код добавляет в PDF несколько изображений, изменяя размер каждой страницы так, чтобы он соответствовал размеру соответствующего изображения. Перед сохранением результата код удаляет первую неявно добавленную пустую страницу.

Извлечение изображений PDF

Мы разработали Docotic.Pdf для извлечения изображений из PDF-файлов без ухудшения их качества. Библиотека не изменяет размер или сжатие изображений. Вы получите изображения того же качества, что и в PDF.

using var pdf = new PdfDocument("file-with-images.pdf");
int i = 0;
foreach (PdfImage image in pdf.GetImages())
{
    var path = image.Save($"image{i++}");
    Console.WriteLine($"Saved to {path}");
}

Удаление и замена изображений

Используйте метод PdfPage.RemovePaintedImages, чтобы удалить все изображения или выбранные изображения со страницы PDF. Вы можете фильтровать изображения по положению, размеру, преобразованию или другим параметрам.

using var pdf = new PdfDocument("file-with-images.pdf");
pdf.Pages[0].RemovePaintedImages(
    image =>
    {
        return image.Size.Width > 100;
    }
);

pdf.RemoveUnusedResources();
pdf.Save("no-wide-images.pdf");

Приведенный выше код на C# показывает, как удалить изображения с помощью Docotic.Pdf. Я рекомендую удалять неиспользуемые ресурсы после того, как вы изменили или удалили изображения.

Используйте метод PdfImage.ReplaceWith, чтобы заменить все вхождения изображения в PDF-документе.

using var pdf = new PdfDocument("file-with-images.pdf");
var firstImage = pdf.GetImages(false).FirstOrDefault()
    ?? throw new ArgumentException("No images found");

firstImage.ReplaceWith("another-image.png");

pdf.RemoveUnusedResources();
pdf.Save("replaced-image.pdf");

Изменение схемы сжатия

Docotic.Pdf предоставляет методы для изменения сжатия изображений PDF. Можно перепаковывать изображения с использованием алгоритмов JPEG, CCITT Group 3 и 4 (fax), JPEG 2000 и zip/deflate.

В зависимости от исходного и нового сжатия изменение может привести к потере деталей или качества изображения. Но преобразования с потерями обычно помогают уменьшить размер документа.

firstImage.RecompressWithJpeg2000(25);

Есть и другие методы перепаковки изображения. Посмотрите методы PdfImage с именами, начинающимися на RecompressWith. Вы можете убрать любое сжатие у изображения с помощью метода Uncompress.

Изменение размера изображений

Если некоторые изображения в PDF-документе больше, чем нужно, библиотека может изменить их размер или уменьшить масштаб за вас.

firstImage.Scale(0.5, PdfImageCompression.Jpeg2000, 25);

Приведенный выше код делает первое изображение в два раза меньше по обоим направлениям. Библиотека использует для результата сжатие JPEG 2000.

Вы можете использовать один из методов ResizeTo, чтобы задать точные значения ширины и высоты результата.

Изменение размера изображений обычно еще сильнее уменьшает размер PDF-файла, чем изменение их сжатия (см. раздел выше), но это процесс с потерями.

Водяные знаки и фоны

Водяной знак на PDF

Добавление водяного знака в PDF включает следующие шаги:

  • Создать XObject, контейнер для содержимого водяного знака
  • Заполнить объект текстом, изображениями и векторной графикой
  • Нанести объект на страницы PDF

Вот код на C#, который добавляет в PDF водяной знак Confidential:

using var pdf = new PdfDocument("existing.pdf");

var watermark = pdf.CreateXObject();
watermark.DrawOnBackground = true;

var canvas = watermark.Canvas;
canvas.FontSize = 72;
canvas.Brush.Color = new PdfRgbColor(222, 35, 35);
canvas.Brush.Opacity = 45;
canvas.Pen.Color = canvas.Brush.Color;
canvas.Pen.Opacity = canvas.Brush.Opacity;
canvas.Pen.Width = 5;

var padding = 10;
var text = "CONFIDENTIAL";
canvas.DrawString(padding, padding, text);

var textSize = canvas.MeasureText(text);
var watermarkRect = new PdfRectangle(
    padding, padding, textSize.Width, textSize.Height);
canvas.DrawRoundedRectangle(watermarkRect, new PdfSize(padding, padding));

foreach (var page in pdf.Pages)
{
    page.Canvas.DrawXObject(
        watermark,
        (page.Width - watermarkRect.Width) / 2,
        (page.Height - watermarkRect.Height) / 2);
}

pdf.Save("watermarked.pdf");

Код задает свойства кисти и пера холста водяного знака. Кисть используется для заливки текста. Чтобы определить размер текста, код измеряет текст. Затем он рисует вокруг текста прямоугольник со скругленными углами. Перо используется для обводки прямоугольника.

После того как содержимое водяного знака готово, код рисует его в центре каждой страницы.

Фоны PDF очень похожи на водяные знаки. По крайней мере, создавать их можно почти таким же способом. Чтобы добавить фон в PDF, сделайте то же самое, что и в коде выше, но добавьте watermark.DrawOnBackground = true; сразу после вызова CreateXObject. Обратите внимание, что непрозрачное содержимое, например изображения, может перекрывать фон.

Аннотации

Docotic.Pdf предоставляет богатый API для аннотаций в PDF. Вы можете создавать, редактировать и удалять аннотации из PDF-документов. Также возможно сплющивать аннотации.

Для аннотирования текста доступны:

  • Заметки-липучки или текстовые аннотации. См. метод AddTextAnnotation класса PdfPage.
  • Выделения. См. метод AddHighlightAnnotation.
  • Зачеркивания. См. метод AddStrikeoutAnnotation.
  • Подчеркивания. См. методы AddJaggedUnderlineAnnotation и AddUnderlineAnnotation.

Используйте ссылки, чтобы переходить с одной страницы на другую или к внешнему ресурсу. Для свободного рисования на странице PDF можно использовать чернильные аннотации. Для участков, которые нужно удалить из документа, есть аннотации редактирования (redaction). Вы также можете встроить аудио-, видео- или 3D-содержимое.

Выделение текста

Вот как выделить текст в PDF-документах:

using var pdf = new PdfDocument();

var page = pdf.Pages[0];
var canvas = page.Canvas;
canvas.FontSize = 30;

var text = "Highlighted text.";
var position = new PdfPoint(10, 50);
canvas.DrawString(position, text);
canvas.DrawString(" Not highlighted.");

var size = canvas.MeasureText(text);
var bounds = new PdfRectangle(position, size);

var color = new PdfRgbColor(145, 209, 227);
var annotationText = "Please pay attention to this part.";
page.AddHighlightAnnotation(annotationText, bounds, color);

pdf.Save("highlighted.pdf");

Чтобы создать ссылку на конкретную страницу в PDF, используйте код вроде следующего:

using var pdf = new PdfDocument();
var secondPage = pdf.AddPage();
secondPage.Canvas.DrawString(10, 50, "Welcome to the second page.");

var firstPage = pdf.Pages[0];
var canvas = firstPage.Canvas;
var linkRect = new PdfRectangle(10, 50, 100, 60);
canvas.DrawRectangle(linkRect, PdfDrawMode.Stroke);

var options = new PdfTextDrawingOptions(linkRect)
{
    HorizontalAlignment = PdfTextAlign.Center,
    VerticalAlignment = PdfVerticalAlign.Center
};
canvas.DrawText("Go to 2nd page", options);

firstPage.AddLinkToPage(linkRect, 1);

pdf.Save("linked.pdf");

В коде аннотация области действия работает как внутренняя гиперссылка. Такие области могут вести и к внешним ресурсам, а также выполнять ненавигационные действия.

Удаление аннотаций

Чтобы удалить аннотации из PDF:

  1. Получите доступ к коллекции виджетов с помощью свойства PdfPage.Widgets или метода PdfDocument.GetWidgets.
  2. Проверьте тип, свойства или иным образом определите, какие аннотации вам больше не нужны.
  3. Удалите аннотацию с помощью метода PdfDocument.RemoveWidget или методов объекта PdfWidgetCollection.

Чтобы удалить вложения из PDF, нужно удалить и файловые аннотации, и общие вложения.

Маскирование PDF

Как библиотека для маскирования PDF, Docotic.Pdf предлагает методы для постоянного удаления или быстрого затемнения конфиденциальной информации в ваших PDF-документах.

Затемнение информации в PDF

Маскирование текста

Вот как затемнить текст в PDF без инструмента Redact, используя только C# и Docotic.Pdf.

int i = 0;
foreach (var page in pdf.Pages)
{
    foreach (var word in page.GetWords())
    {
        if (i % 3 == 0)
        {
            page.Canvas.AppendRectangle(word.Bounds);
            page.Canvas.FillPath(PdfFillMode.Winding);
        }

        i++;
    }
}

Код рисует черный прямоугольник поверх каждого третьего слова в документе. Обратите внимание, что текст под прямоугольниками остается в документе, и его можно извлечь позже. Чтобы удалить текст навсегда, используйте подход из раздела о замене текста.

Маскирование изображений

Для закрытия изображений тоже можно использовать черные прямоугольники. Но более простой подход — заменить изображение на черное изображение размером 1 на 1 пиксель. Это не только визуально выделит замаскированное изображение, но и удалит исходные данные изображения.

См. раздел о удалении и замене изображений с примерами кода. Я также рекомендую вызвать метод PdfDocument.ReplaceDuplicateObjects после замены.

PDF-формы

Docotic.Pdf может создавать Acroforms (это еще одно название PDF-форм) с использованием всех видов интерактивных элементов, таких как кнопки, флажки, раскрывающиеся списки, списки, переключатели и текстовые поля.

Обычно для добавления и настройки поля формы требуется всего несколько строк кода. Например, можно добавить редактируемые поля в PDF, просто вызвав метод PdfPage.AddTextBox. Примеры кода в группе Формы и аннотации содержат дополнительную информацию о создании и использовании форм.

Как заполнить PDF-форму

Используйте метод PdfDocument.TryGetControl, чтобы получить элемент управления PDF по его полному или частичному имени. Альтернативно можно перечислить все элементы управления в документе с помощью метода GetControls. В обоих случаях результат нужно привести к ожидаемому типу поля.

using var pdf = new PdfDocument(@"example-form.pdf");

if (pdf.TryGetControl("txt-name", out var c) && c is PdfTextBox nameTextBox)
    nameTextBox.Text = "Bit Miracle team";

if (pdf.TryGetControl("txt-email", out c) && c is PdfTextBox emailTextBox)
    emailTextBox.Text = "support@bitmiracle.com";

if (pdf.TryGetControl("check-agree", out c) && c is PdfCheckBox agreeCheckBox)
    agreeCheckBox.Checked = true;

pdf.Save("filled-form.pdf");

Код использует этот пример PDF-формы. В коде я задаю значения двух текстовых полей и отмечаю флажок.

Когда вы закончите заполнение формы, можно сплющить все ее поля.

Использование JavaScript в формах

Можно добавлять действия к событиям элементов управления. Класс PdfControl предоставляет доступ к заранее определенному набору событий. Имена событий начинаются с "On" (например, OnMouseDown).

Вот пример использования JavaScript для PDF-форм:

using var pdf = new PdfDocument(@"example-form.pdf");
foreach (var field in pdf.GetControls())
    field.OnChange = pdf.CreateJavaScriptAction($"app.alert('{field.Name} changed!',3)");

pdf.Save("javascript-events.pdf");

Формат данных форм

Есть еще один способ электронного заполнения PDF. Используйте возможность FDF-to-PDF библиотеки, чтобы автоматически заполнить PDF-форму из базы данных или другого источника.

using var pdf = new PdfDocument(@"example-form.pdf");
pdf.ImportFdf("form-data.fdf");
pdf.Save("auto-populated.pdf");

В коде используется этот файл FDF, чтобы заполнить все поля формы одновременно.

Сплющивание PDF

Этот раздел о том, как сплющить PDF.

Сплющивание PDF

Когда вы сплющиваете PDF, вы преобразуете интерактивные элементы, такие как формы и аннотации, в статическое содержимое, чтобы предотвратить дальнейшее редактирование. Сплющенный PDF может занимать значительно меньше байтов и выглядеть так же.

Сплющивание форм и аннотаций

Чтобы сплющить заполняемый PDF, используйте метод PdfDocument.FlattenControls. Этот метод рисует все поля формы и другие элементы управления на родительской странице, удаляя исходный элемент управления из документа.

Когда вы сплющиваете PDF-форму, имеет смысл сплющить и аннотации. Используйте метод PdfDocument.FlattenWidgets, чтобы одновременно сплющить и элементы управления, и аннотации.

Если вы хотите преобразовать только некоторые элементы управления и/или аннотации в их визуальное представление, используйте метод PdfWidget.Flatten. Сначала нужно найти нужный элемент управления или аннотацию.

Сплющивание текста

С помощью Docotic.Pdf можно преобразовать текст PDF в контуры. Обычно это делают, чтобы добиться независимости от шрифтов. Независимо от того, установлены ли шрифты, сплющенный текст будет выглядеть одинаково на любом устройстве.

Однако после преобразования текста в контуры вы больше не сможете редактировать его как текст. Кроме того, в процессе сплющивания библиотека преобразует текст в векторную графику. Это может увеличить размер файлов.

Чтобы сплющить текст PDF, нужно извлечь текст как векторные пути и скопировать его на новую или ту же страницу. Для этого есть пример кода.

Параметры сохранения

В приведенных выше фрагментах кода я использовал метод PdfDocument.Save без дополнительных аргументов. В таких случаях библиотека использует параметры сохранения по умолчанию. Мы подобрали значения по умолчанию так, чтобы в обычных случаях они работали отлично.

Тем не менее бывают ситуации, когда нужно переопределить параметры по умолчанию. Для этого создайте объект PdfSaveOptions, настройте параметры и передайте его в один из методов сохранения. Далее я опишу такие случаи.

Чтобы защитить PDF паролем или сертификатом, создайте обработчик шифрования и задайте его свойству EncryptionHandler.

Когда вы хотите подписать один и тот же PDF несколько раз, включите режим инкрементальных обновлений, установив свойство WriteIncrementally в true. Сделайте то же самое, если сохраняете ранее подписанный файл с новыми аннотациями или данными формы.

Установите свойство Linearize в true, чтобы получить линейризованный PDF-файл (или PDF, оптимизированный для Fast Web View). Просмотрщики, которые распознают эту оптимизацию, могут отображать такие файлы быстрее.

Чтобы предотвратить изменения некоторых полей метаданных при сохранении, установите свойства UpdateProducer и UpdateModifiedDate в false.