PDFからタグ付きコンテンツを抽出する

この記事では、C#を使用してタグ付きコンテンツPDFドキュメントを抽出する方法を学びます。

以下のコードスニペットは、Aspose.PDF.Drawing ライブラリでも動作します。

タグ付きPDFコンテンツの取得

PDFドキュメントのタグ付きテキストのコンテンツを取得するために、Aspose.PDFはDocument クラスの TaggedContent プロパティを提供しています。

次のコードスニペットは、タグ付きテキストのPDFドキュメントのコンテンツを取得する方法を示しています:

// 完全な例やデータファイルについては、https://github.com/aspose-pdf/Aspose.PDF-for-.NET をご覧ください。
// ドキュメントディレクトリへのパス。
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();

// Pdf Documentを作成
Document document = new Document();

// タグ付きPdfのコンテンツを作業用に取得
ITaggedContent taggedContent = document.TaggedContent;

//
// タグ付きPdfコンテンツの作業
//

// ドキュメントのタイトルと言語を設定
taggedContent.SetTitle("Simple Tagged Pdf Document");
taggedContent.SetLanguage("en-US");

// タグ付きPdfドキュメントを保存
document.Save(dataDir + "TaggedPDFContent.pdf");

ルート構造の取得

Tagged PDF Documentのルート構造を取得するために、Aspose.PDFはITaggedContentインターフェースのStructTreeRootElementプロパティとStructureElementを提供しています。次のコードスニペットは、Tagged PDF Documentのルート構造を取得する方法を示しています:

// 完全な例とデータファイルについては、https://github.com/aspose-pdf/Aspose.PDF-for-.NET をご覧ください。
// ドキュメントディレクトリへのパス。
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();

// Pdf Documentを作成
Document document = new Document();

// TaggedPdfの作業用コンテンツを取得
ITaggedContent taggedContent = document.TaggedContent;

// ドキュメントのタイトルと言語を設定
taggedContent.SetTitle("Tagged Pdf Document");
taggedContent.SetLanguage("en-US");

// StructTreeRootElementプロパティとRootElementプロパティは、
// PDFドキュメントのStructTreeRootオブジェクトとルート構造要素(ドキュメント構造要素)にアクセスするために使用されます。
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");

// タグ付けされたPdfの作業用のコンテンツを取得
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はStructureElementクラスのFindElementsメソッドを提供します。FigureElementクラスのAlternativeTextプロパティを使用して、図に代替テキストを追加できます。

以下のコードスニペットは、既存の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);
}

// スパン要素を段落に移動(最初の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];

// スパン要素を段落に移動
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));