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

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

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

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

  • 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 – возвращает непрозрачность артефакта. Допустимые значения в диапазоне от 0 до 1, где 1 означает полную непрозрачность.

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

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

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

Чтобы получить все водяные знаки на определённой странице, класс Page имеет свойство Artifacts.

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

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

// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void ExtractWatermarkFromPDF()
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf();

    // Open PDF document
    using (var document = new Aspose.Pdf.Document(dataDir + "sample-w.pdf"))
    {
        // Get the watermarks from the first page artifacts
        var watermarks = document.Pages[1].Artifacts
            .Where(artifact =>
                artifact.Type == Aspose.Pdf.Artifact.ArtifactType.Pagination
                && artifact.Subtype == Aspose.Pdf.Artifact.ArtifactSubtype.Watermark);

        // Iterate through the found watermark artifacts and print details
        foreach (Aspose.Pdf.WatermarkArtifact item in watermarks.Cast<Aspose.Pdf.WatermarkArtifact>())
        {
            Console.WriteLine($"{item.Text} {item.Rectangle}");
        }
    }
}

Использование фонов в качестве артефактов

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

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

// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void AddBackgroundImageToPDF()
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf();

    // Open PDF document
    using (var document = new Aspose.Pdf.Document(dataDir + "sample.pdf"))
    {
        // Create a new BackgroundArtifact and set the background image
        var background = new Aspose.Pdf.BackgroundArtifact()
        {
            BackgroundImage = File.OpenRead(dataDir + "background.jpg")
        };

        // Add the background image to the first page's artifacts
        document.Pages[1].Artifacts.Add(background);

        // Save PDF document with the added background
        document.Save(dataDir + "SampleArtifactsBackground_out.pdf");
    }
}

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

 // For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET

 private static void AddBackgroundColorToPDF()
 {
    // The path to the documents directory
     var dataDir = RunExamples.GetDataDir_AsposePdf();

     // Open PDF document
     using (var document = new Aspose.Pdf.Document(dataDir + "sample.pdf"))
     {
         // Create a new BackgroundArtifact and set the background color
         var background = new Aspose.Pdf.BackgroundArtifact()
         {
             BackgroundColor = Aspose.Pdf.Color.DarkKhaki
         };

         // Add the background color to the first page's artifacts
         document.Pages[1].Artifacts.Add(background);

         // Save PDF document
         document.Save(dataDir + "SampleArtifactsBackground_out.pdf");
     }
 }

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

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

// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void CountPDFArtifacts()
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf();

    // Open PDF document
    using (var document = new Aspose.Pdf.Document(dataDir + "sample.pdf"))
    {
        // Get pagination artifacts from the first page
        var paginationArtifacts = document.Pages[1].Artifacts
            .Where(artifact => artifact.Type == Aspose.Pdf.Artifact.ArtifactType.Pagination);

        // Count and display the number of each artifact type
        Console.WriteLine("Watermarks: {0}",
            paginationArtifacts.Count(a => a.Subtype == Aspose.Pdf.Artifact.ArtifactSubtype.Watermark));
        Console.WriteLine("Backgrounds: {0}",
            paginationArtifacts.Count(a => a.Subtype == Aspose.Pdf.Artifact.ArtifactSubtype.Background));
        Console.WriteLine("Headers: {0}",
            paginationArtifacts.Count(a => a.Subtype == Aspose.Pdf.Artifact.ArtifactSubtype.Header));
        Console.WriteLine("Footers: {0}",
            paginationArtifacts.Count(a => a.Subtype == Aspose.Pdf.Artifact.ArtifactSubtype.Footer));
    }
}

Добавление артефакта нумерации Бейтса

Чтобы добавить артефакт нумерации Бейтса в документ, вызовите метод расширения AddBatesNumbering(BatesNArtifact batesNArtifact) на PageCollection, передав объект BatesNArtifact в качестве параметра:

Или вы можете передать коллекцию PaginationArtifacts:

Кроме того, вы можете добавить артефакт нумерации Бейтса, используя делегат действия:

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