Извлечение тегированного содержимого из 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));