Создание тегированного PDF с помощью C#

Создание маркированного PDF означает добавление (или создание) определенных элементов в документ, что позволит валидировать документ в соответствии с требованиями PDF/UA. Эти элементы часто называются Структурными Элементами.

Приведенный ниже фрагмент кода также работает с библиотекой Aspose.PDF.Drawing.

Создание маркированного PDF (Простой сценарий)

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

private static void CreateTaggedPdfDocument01()
{
    // Создание PDF документа
    var document = new Document();

    // Получение контента для работы с TaggedPdf
    ITaggedContent taggedContent = document.TaggedContent;
    var rootElement = taggedContent.RootElement;
    // Установка заголовка и языка для документа
    taggedContent.SetTitle("Маркированный PDF документ");
    taggedContent.SetLanguage("en-US");

    // 
    HeaderElement mainHeader = taggedContent.CreateHeaderElement();
    mainHeader.SetText("Основной заголовок");

    ParagraphElement paragraphElement = taggedContent.CreateParagraphElement();
    paragraphElement.SetText("Lorem ipsum dolor sit amet, consectetur adipiscing elit. " +
    "Aenean nec lectus ac sem faucibus imperdiet. Sed ut erat ac magna ullamcorper hendrerit. " +
    "Cras pellentesque libero semper, gravida magna sed, luctus leo. Fusce lectus odio, laoreet" +
    "nec ullamcorper ut, molestie eu elit. Interdum et malesuada fames ac ante ipsum primis in faucibus." +
    "Aliquam lacinia sit amet elit ac consectetur. Donec cursus condimentum ligula, vitae volutpat" +
    "sem tristique eget. Nulla in consectetur massa. Vestibulum vitae lobortis ante. Nulla ullamcorper" +
    "pellentesque justo rhoncus accumsan. Mauris ornare eu odio non lacinia. Aliquam massa leo, rhoncus" +
    "ac iaculis eget, tempus et magna. Sed non consectetur elit. Sed vulputate, quam sed luctus lacinia," +
    "ipsum nibh fringilla purus, vitae posuere risus odio id massa. Cras sed venenatis lacus.");

    rootElement.AppendChild(mainHeader);
    rootElement.AppendChild(paragraphElement);

    // Сохранение маркированного PDF документа
    document.Save("C:\\Samples\\TaggedPDF\\Sample1.pdf");
}

Мы получим следующий документ после создания:

Тегированный PDF-документ с 2 элементами - Заголовок и Параграф

Создание тегированного PDF с вложенными элементами (Создание дерева структурных элементов)

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

private static void CreateTaggedPdfDocument02()
{
    // Создание PDF-документа
    var document = new Document();

    // Получение контента для работы с TaggedPdf
    ITaggedContent taggedContent = document.TaggedContent;
    var rootElement = taggedContent.RootElement;
    // Установка заголовка и языка документа
    taggedContent.SetTitle("Tagged Pdf Document");
    taggedContent.SetLanguage("en-US");

    HeaderElement header1 = taggedContent.CreateHeaderElement(1);
    header1.SetText("Заголовок уровня 1");

    ParagraphElement paragraphWithQuotes = taggedContent.CreateParagraphElement();
    paragraphWithQuotes.StructureTextState.Font = FontRepository.FindFont("Calibri");
    paragraphWithQuotes.StructureTextState.MarginInfo = new MarginInfo(10, 5, 10, 5);

    SpanElement spanElement1 = taggedContent.CreateSpanElement();
    spanElement1.SetText("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean nec lectus ac sem faucibus imperdiet. Sed ut erat ac magna ullamcorper hendrerit. Cras pellentesque libero semper, gravida magna sed, luctus leo. Fusce lectus odio, laoreet nec ullamcorper ut, molestie eu elit. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aliquam lacinia sit amet elit ac consectetur. Donec cursus condimentum ligula, vitae volutpat sem tristique eget. Nulla in consectetur massa. Vestibulum vitae lobortis ante. Nulla ullamcorper pellentesque justo rhoncus accumsan. Mauris ornare eu odio non lacinia. Aliquam massa leo, rhoncus ac iaculis eget, tempus et magna. Sed non consectetur elit. ");
    QuoteElement quoteElement = taggedContent.CreateQuoteElement();
    quoteElement.SetText("Sed vulputate, quam sed lacinia luctus, ipsum nibh fringilla purus, vitae posuere risus odio id massa.");
    quoteElement.StructureTextState.FontStyle = FontStyles.Bold | FontStyles.Italic;
    SpanElement spanElement2 = taggedContent.CreateSpanElement();
    spanElement2.SetText(" Sed non consectetur elit.");

    paragraphWithQuotes.AppendChild(spanElement1);
    paragraphWithQuotes.AppendChild(quoteElement);
    paragraphWithQuotes.AppendChild(spanElement2);

    rootElement.AppendChild(header1);
    rootElement.AppendChild(paragraphWithQuotes);

    // Сохранение тегированного PDF-документа
    document.Save("C:\\Samples\\TaggedPDF\\Sample2.pdf");
}

Мы получим следующий документ после создания: Тегированный PDF-документ с вложенными элементами - span и quotes

Стилизация структуры текста

Для стилизации структуры текста в Тегированном PDF-документе, Aspose.PDF предлагает свойства Font, FontSize, FontStyle и ForegroundColor класса StructureTextState. Следующий фрагмент кода показывает, как стилизовать текстовую структуру в Тегированном PDF-документе:

// Для полных примеров и файлов данных, пожалуйста, перейдите на https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// Путь к директории с документами.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();

// Создать PDF-документ
Document document = new Document();

// Получить содержимое для работы с TaggedPdf
ITaggedContent taggedContent = document.TaggedContent;

// Установить название и язык для документа
taggedContent.SetTitle("Tagged Pdf Document");
taggedContent.SetLanguage("en-US");

ParagraphElement p = taggedContent.CreateParagraphElement();
taggedContent.RootElement.AppendChild(p);

// В процессе разработки
p.StructureTextState.FontSize = 18F;
p.StructureTextState.ForegroundColor = Color.Red;
p.StructureTextState.FontStyle = FontStyles.Italic;

p.SetText("Красный курсивный текст.");

// Сохранить Тегированный PDF-документ
document.Save(dataDir + "StyleTextStructure.pdf");

Иллюстрация структурных элементов

Для иллюстрации структурных элементов в тегированном PDF документе, Aspose.PDF предлагает класс IllustrationElement. Следующий пример кода показывает, как иллюстрировать структурные элементы в тегированном PDF документе:

// Для полных примеров и файлов данных, пожалуйста, перейдите на https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// Путь к директории документов.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();

// Создать PDF документ
Document document = new Document();

// Получить содержимое для работы с TaggedPdf
ITaggedContent taggedContent = document.TaggedContent;

// Установить заголовок и язык для документа
taggedContent.SetTitle("Тегированный PDF документ");
taggedContent.SetLanguage("en-US");

// В разработке
IllustrationElement figure1 = taggedContent.CreateFigureElement();
taggedContent.RootElement.AppendChild(figure1);
figure1.AlternativeText = "Рисунок Один";
figure1.Title = "Изображение 1";
figure1.SetTag("Fig1");
figure1.SetImage("image.png");

// Сохранить тегированный PDF документ
document.Save(dataDir + "IllustrationStructureElements.pdf");

Проверка тегированного PDF

Aspose.PDF для .NET предоставляет возможность валидации PDF/UA тегированного PDF документа. Валидация стандарта PDF/UA поддерживает:

  • Проверки для XObjects
  • Проверки для Actions
  • Проверки для Optional Content
  • Проверки для Embedded Files
  • Проверки для полей Acroform(Проверка естественного языка и альтернативного имени и цифровых подписей)
  • Проверки для полей форм XFA
  • Проверки для настроек безопасности
  • Проверки для навигации
  • Проверки для аннотаций

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

// Для полных примеров и файлов данных, пожалуйста, перейдите на https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// Путь к каталогу документов.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
string inputFileName = dataDir + "StructureElements.pdf";
string outputLogName = dataDir + "ua-20.xml";

using (var document = new Aspose.Pdf.Document(inputFileName))
{
    bool isValid = document.Validate(outputLogName, Aspose.Pdf.PdfFormat.PDF_UA_1);

}