Извлечение тегированного содержимого из PDF

В этой статье вы узнаете, как извлекать тегированный контент из PDF-документа с использованием C#.

Следующий фрагмент кода также работает с библиотекой Aspose.PDF.Drawing.

Получение тегированного содержимого PDF

Для получения содержимого PDF-документа с тегированным текстом, Aspose.PDF предлагает свойство TaggedContent класса Document.

Следующий фрагмент кода показывает, как получить содержимое 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;

//
// Работа с содержимым Tagged Pdf
//

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

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

Получение корневой структуры

Для получения корневой структуры тегированного PDF-документа Aspose.PDF предлагает свойство StructTreeRootElement интерфейса ITaggedContent и StructureElement. Следующий фрагмент кода показывает, как получить корневую структуру тегированного 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");

// Свойства StructTreeRootElement и RootElement используются для доступа к
// объекту StructTreeRoot документа PDF и к корневому элементу структуры (элемент структуры документа).
StructTreeRootElement structTreeRootElement = taggedContent.StructTreeRootElement;
StructureElement rootElement = taggedContent.RootElement;

Доступ к дочерним элементам

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

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

// Открыть документ PDF
Document document = new Document(dataDir + "StructureElementsTree.pdf");

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

// Доступ к корневому элементу(ам)
ElementList elementList = taggedContent.StructTreeRootElement.ChildElements;
foreach (Element element in elementList)
{
    if (element is StructureElement)
    {
        StructureElement structureElement = element as StructureElement;

        // Получить свойства
        string title = structureElement.Title;
        string language = structureElement.Language;
        string actualText = structureElement.ActualText;
        string expansionText = structureElement.ExpansionText;
        string alternativeText = structureElement.AlternativeText;
    }
}

// Доступ к дочерним элементам первого элемента в корневом элементе
elementList = taggedContent.RootElement.ChildElements[1].ChildElements;
foreach (Element element in elementList)
{
    if (element is StructureElement)
    {
        StructureElement structureElement = element as StructureElement;

        // Установить свойства
        structureElement.Title = "title";
        structureElement.Language = "fr-FR";
        structureElement.ActualText = "actual text";
        structureElement.ExpansionText = "exp";
        structureElement.AlternativeText = "alt";
    }
}

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

Тегирование изображений в существующем PDF

Для тегирования изображений в существующем документе PDF, Aspose.PDF предлагает метод FindElements класса StructureElement. Вы можете добавить альтернативный текст для фигур с использованием свойства AlternativeText класса FigureElement.

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

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

// Открыть документ
Document document = new Document(inFile);

// Получить тегированное содержимое и корневой элемент структуры
ITaggedContent taggedContent = document.TaggedContent;
StructureElement rootElement = taggedContent.RootElement;

// Установить заголовок для тегированного PDF документа
taggedContent.SetTitle("Документ с изображениями");

foreach (FigureElement figureElement in rootElement.FindElements<FigureElement>(true))
{
    // Установить альтернативный текст для фигуры
    figureElement.AlternativeText = "Альтернативный текст фигуры (техника 2)";


    // Создать и установить атрибут BBox
    StructureAttribute bboxAttribute = new StructureAttribute(AttributeKey.BBox);
    bboxAttribute.SetRectangleValue(new Rectangle(0.0, 0.0, 100.0, 100.0));

    StructureAttributes figureLayoutAttributes = figureElement.Attributes.GetAttributes(AttributeOwnerStandard.Layout);
    figureLayoutAttributes.SetAttribute(bboxAttribute);
}

// Переместить элемент Span в элемент Paragraph (найти неправильный span и paragraph в первом TD)
TableElement tableElement = rootElement.FindElements<TableElement>(true)[0];
SpanElement spanElement = tableElement.FindElements<SpanElement>(true)[0];
TableTDElement firstTdElement = tableElement.FindElements<TableTDElement>(true)[0];
ParagraphElement paragraph = firstTdElement.FindElements<ParagraphElement>(true)[0];

// Переместить элемент Span в элемент Paragraph
spanElement.ChangeParentElement(paragraph);


// Сохранить документ
document.Save(outFile);



// Проверка соответствия PDF/UA для выходного документа
document = new Document(outFile);

bool isPdfUaCompliance = document.Validate(logFile, PdfFormat.PDF_UA_1);
Console.WriteLine(String.Format("Соответствие PDF/UA: {0}", isPdfUaCompliance));