Основное управление PDF‑документами охватывает операции, которые встречаются почти в каждом PDF‑рабочем процессе: открытие или создание документа, доступ к страницам и их содержимому, чтение и запись аннотаций, извлечение текста и работа с интерактивными действиями. Aspose.PDF FOSS for .NET предоставляет API .NET 8+, которое обрабатывает все эти задачи через согласованную объектную модель, сосредоточенную вокруг типов Document и Page.

Жизненный цикл документа: Создание, Открытие, Сохранение

Каждый рабочий процесс начинается либо с создания нового документа, либо с загрузки существующего. Document.Create() возвращает новый, пустой Document экземпляр. Document.Open(data) принимает byte[] или Stream и разбирает структуру PDF:

using var doc = Document.Create();
doc.Pages.Add();
var page = doc.Pages[1];
var action = PdfAction.CreateUri("https://aspose.com");
page.Annotations.AddLinkAnnotation(new Rectangle(50, 700, 200, 720), action);
using var ms = new MemoryStream();
doc.Save(ms);
ms.Position = 0;
using var doc2 = Document.Open(ms.ToArray());
var annot = (LinkAnnotation)doc2.Pages[1].Annotations[1];
Console.WriteLine(annot.Uri); // https://aspose.com

Этот фрагмент открывает минимальный PDF, добавляет аннотацию ссылки на страницу 1, сохраняет в MemoryStream и проверяет, что аннотация сохраняется после перезагрузки. Перегрузка Document.Save(Stream) записывает полную обновлённую структуру; Document.ToArray() возвращает байты напрямую.


Доступ к страницам и коллекция Pages

Страницы доступны через свойство Pages с использованием целочисленного индекса, начинающегося с 1: doc.Pages[1] возвращает первую страницу, doc.Pages[doc.Pages.Count] возвращает последнюю. Каждый объект Page предоставляет:

  • AnnotationsAnnotationCollection для этой страницы, поддерживающий AddLinkAnnotation и перечисление существующих аннотаций по типу.
  • Операторы потока содержимого — низкоуровневый доступ к командам рисования страницы через коллекцию Operators.

Индекс, начинающийся с 1, последователен во всём API: поиск аннотаций, индексы страниц назначения действия GoTo и все остальные ссылки на страницы используют одну и ту же конвенцию.


Извлечение текста с помощью TextFragmentAbsorber

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

using var doc = Document.Open("path/to/document.pdf");
var absorber = new TextFragmentAbsorber("Hello");
absorber.Visit(doc.Pages[1]);
foreach (var fragment in absorber.TextFragments)
{
    Console.WriteLine($"Found: {fragment.Text} size={fragment.FontSize}");
}

Вызовите absorber.Visit(page) для обработки одной страницы. Полученная коллекция TextFragments содержит TextFragment объектов; каждый предоставляет Text (строковое содержимое) и FontSize (отображаемый размер в пунктах). Вторая перегрузка TextFragmentAbsorber(searchPhrase, isRegex) принимает флаг регулярного выражения для поиска по шаблону.


Интерактивные действия

PdfAction — это фабричный класс для всех стандартных типов действий PDF. Четыре статических фабричных метода покрывают наиболее распространённые случаи:

  • PdfAction.CreateUri(uri) — открывает URL в браузере пользователя.
  • PdfAction.CreateGoTo(pageIndex, fitType) — переходит к определённой странице в документе.
  • PdfAction.CreateJavaScript(script) — выполняет строку JavaScript в PDF viewer.
  • PdfAction.CreateLaunch(filePath) — запускает внешний файл или приложение.

Действия привязываются к страницам через аннотации. AnnotationCollection.AddLinkAnnotation(rectangle, action) размещает LinkAnnotation над указанным прямоугольным регионом с прикреплённым действием:

using var doc = Document.Create();
doc.Pages.Add();
var page = doc.Pages[1];
var action = PdfAction.CreateUri("https://example.org");
var annot = page.Annotations.AddLinkAnnotation(new Rectangle(10, 10, 100, 30), action);
Console.WriteLine(page.Annotations.Count);      // 1
Console.WriteLine(annot.AnnotationType);         // Link

AnnotationType.Link подтверждает, что аннотация была создана как тип ссылки. Конструктор Rectangle принимает координаты left, bottom, right и top в единицах пользовательского пространства PDF.


Метаданные документа и лицензирование

Класс Document предоставляет IsLicensed (возвращает true в FOSS‑версии), JavaScript (JavaScriptCollection для скриптов уровня документа) и DocumentActions для событий жизненного цикла, таких как BeforeClosing и BeforeSaving.

Пакет FOSS устанавливается через NuGet:

dotnet add package Aspose.Pdf.Foss --version 0.1.0-alpha

Ключ лицензии не требуется. Лицензия MIT разрешает использование в коммерческих приложениях без требований к указанию авторства, кроме сохранения уведомления о лицензии.


Начало работы

Связанные ресурсы