Работа с артефактами в .NET

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

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

Для создания элемента в виде артефакта в PDF, вам необходимо использовать класс Artifact. Он содержит следующие полезные свойства:

  • Artifact.Type – получает тип артефакта (поддерживает значения перечисления Artifact.ArtifactType, куда входят Background, Layout, Page, Pagination и Undefined).
  • Artifact.Type – получает тип артефакта (поддерживает значения перечисления Artifact.ArtifactType, к которым относятся Background, Layout, Page, Pagination и Undefined).
  • Artifact.Subtype – получает подтип артефакта (поддерживает значения перечисления Artifact.ArtifactSubtype, к которым относятся Background, Footer, Header, Undefined, Watermark).
  • Artifact.Image – получает изображение артефакта (если изображение присутствует, иначе null).
  • Artifact.Text – получает текст артефакта.
  • Artifact.Contents – получает коллекцию внутренних операторов артефакта. Поддерживаемый тип - System.Collections.ICollection.
  • Artifact.Form – получает XForm артефакта (если используется XForm). Артефакты с водяными знаками, заголовками и нижними колонтитулами содержат XForm, который отображает все содержимое артефакта.
  • Artifact.Rectangle – получает позицию артефакта на странице.
  • Artifact.Rotation – получает вращение артефакта (в градусах, положительное значение указывает на вращение против часовой стрелки).
  • Artifact.Opacity – получает непрозрачность артефакта.
  • Artifact.Opacity – Получает прозрачность артефакта.

Следующие классы также могут быть полезны для работы с артефактами:

Работа с существующими водяными знаками

Водяной знак, созданный с помощью Adobe Acrobat, называется артефактом (как описано в разделе 14.8.2.2 Реальное содержание и артефакты спецификации PDF).

Для получения всех водяных знаков на определенной странице класс Page имеет свойство Artifacts.

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

Примечание: Этот код также работает с библиотекой Aspose.PDF.Drawing. Примечание: Этот код также работает с библиотекой Aspose.PDF.Drawing.

var document = new Document(System.IO.Path.Combine(_dataDir, "sample-w.pdf"));
var watermarks = document.Pages[1].Artifacts
    .Where(artifact =>
    artifact.Type == Artifact.ArtifactType.Pagination
    && artifact.Subtype == Artifact.ArtifactSubtype.Watermark);
foreach (WatermarkArtifact item in watermarks.Cast<WatermarkArtifact>())
{
    Console.WriteLine($"{item.Text} {item.Rectangle}");
}

Работа с фонами как с артефактами

Фоновые изображения могут использоваться для добавления водяного знака или другого тонкого дизайна в документы. В Aspose.PDF для .NET каждый документ PDF представляет собой коллекцию страниц, и каждая страница содержит коллекцию артефактов. Класс BackgroundArtifact можно использовать для добавления фонового изображения на объект страницы.

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

var document = new Document(System.IO.Path.Combine(_dataDir, "sample.pdf"));
var background = new BackgroundArtifact()
{
    BackgroundImage = System.IO.File.OpenRead(System.IO.Path.Combine(_dataDir, "background.jpg"))
};
document.Pages[1].Artifacts.Add(background);
document.Save(System.IO.Path.Combine(_dataDir, "sample_artifacts_background.pdf"));

Если вы по какой-то причине хотите использовать однотонный фон, пожалуйста, измените предыдущий код следующим образом:

var document = new Document(System.IO.Path.Combine(_dataDir, "sample.pdf"));
var background = new BackgroundArtifact()
{
    BackgroundColor = Color.DarkKhaki,
};
document.Pages[1].Artifacts.Add(background);
document.Save(System.IO.Path.Combine(_dataDir, "sample_artifacts_background.pdf"));

Подсчет артефактов определенного типа

Для расчета общего количества артефактов определенного типа (например, общее количество водяных знаков), используйте следующий код:

var document = new Document(System.IO.Path.Combine(_dataDir, "sample.pdf"));
var paginationArtifacts = document.Pages[1].Artifacts.Where(artifact => artifact.Type == Artifact.ArtifactType.Pagination);
Console.WriteLine("Водяные знаки: {0}", paginationArtifacts.Count(a => a.Subtype == Artifact.ArtifactSubtype.Watermark));
Console.WriteLine("Фоны: {0}", paginationArtifacts.Count(a => a.Subtype == Artifact.ArtifactSubtype.Background));
Console.WriteLine("Заголовки: {0}", paginationArtifacts.Count(a => a.Subtype == Artifact.ArtifactSubtype.Header));
Console.WriteLine("Подвалы: {0}", paginationArtifacts.Count(a => a.Subtype == Artifact.ArtifactSubtype.Footer));