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

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

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

Библиотека Docotic.Pdf 9.5.17573-dev Регрессионные тесты 14,726 прошло Всего загрузок NuGet 4,765,230
Значок редактора 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 может удалить неиспользуемые глифы из шрифтов для оптимизации размера выходного файла. Выделение подмножества шрифта (font subsetting) — это другое название этого процесса. Вы даже можете полностью удалить байты шрифта из документа (извлечь шрифт). Это может иметь смысл, когда документ содержит байты популярного шрифта, например 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-бит, RC4 128-бит, AES 128-бит и AES 256-бит.

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

Вы можете установить различные разрешения для 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 и сведениях о документе. Когда свойство изменяется в обоих источниках, метод перезапишет один источник значением из другого источника. Прочитайте документацию по методу для получения более подробной информации.

Закладки PDF

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

PDF outline

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

Вот фрагмент кода 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");

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

Также возможно добавлять вложения к страницам 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-файл для извлечения текста

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

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

В этом разделе рассказывается об изменениях в существующих страницах 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. Не забывайте, что XObjects также могут содержать вложенные пути.

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.AddFont("NSimSun")
    ?? throw new ArgumentException("Font not found");

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.AddImage("image.jpg")
    ?? throw new ArgumentException("Cannot add image");

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.AddImage(path)
        ?? throw new ArgumentException("Cannot add image");

    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 (факс), 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#, который добавляет водяной знак Confidential в PDF:

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. Для частей, предназначенных для удаления из документа, имеются аннотации редактирования. Вы также можете встраивать аудио, видео или 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

Docotic.Pdf — это библиотека для редактирования 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.GetControl для поиска элемента управления PDF по его полному или частичному имени. Альтернативой является перечисление элементов управления документа с помощью метода GetControls. В любом случае вам потребуется привести элемент управления к ожидаемому типу поля.

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

if (pdf.GetControl("txt-name") is PdfTextBox nameTextBox)
    nameTextBox.Text = "Bit Miracle team";

if (pdf.GetControl("txt-email") is PdfTextBox emailTextBox)
    emailTextBox.Text = "support@bitmiracle.com";

if (pdf.GetControl("check-agree") 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 в 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. Сначала вам нужно будет найти требуемый элемент управления или аннотацию.

Сгладить текст

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

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

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

Опции сохранения

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

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

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

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

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

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