ReadTagsToOutlines.cs
//
// このコードは、DioDocs for PDF のサンプルの一部として提供されています。
// © MESCIUS inc. All rights reserved.
//
using System;
using System.IO;
using System.Drawing;
using System.Linq;
using System.Collections.Generic;
using GrapeCity.Documents.Pdf;
using GrapeCity.Documents.Text;
using GrapeCity.Documents.Pdf.TextMap;
using GrapeCity.Documents.Pdf.Structure;
using GrapeCity.Documents.Pdf.Recognition.Structure;
namespace DsPdfWeb.Demos
{
// タグツリー内の「H」タグを使用し、アウトラインを作成します。
public class ReadTagsToOutlines
{
public int CreatePDF(Stream stream)
{
var doc = new GcPdfDocument();
using var s = File.OpenRead(Path.Combine("Resources", "PDFs", "C1Olap-QuickStart.pdf"));
doc.Load(s);
// LogicalStructureと最上位の親要素を取得します。
LogicalStructure ls = doc.GetLogicalStructure();
Element root = ls.Elements[0];
// 要素を反復し、すべての見出し要素(H1、H2、H3など)を選択します。
OutlineNodeCollection outlines = doc.Outlines;
int outlinesLevel = 1;
foreach (Element e in root.Children)
{
string type = e.StructElement.Type;
if (string.IsNullOrEmpty(type) || !type.StartsWith("H"))
continue;
// 注:最上位のレベルは「1」です。
if (!int.TryParse(type.Substring(1), out int headingLevel) || headingLevel < 1)
continue;
// 要素のテキストを取得します。
string text = e.GetText();
// 対象となるページを検索します。
var page = FindPage(e.StructElement);
if (page != null)
{
var o = new OutlineNode(text, new DestinationFit(page));
if (headingLevel > outlinesLevel)
{
++outlinesLevel;
outlines = outlines.Last().Children;
}
else if (headingLevel < outlinesLevel)
{
--outlinesLevel;
var p = ((OutlineNode)outlines.Owner).Parent;
outlines = p == null ? doc.Outlines : p.Children;
}
outlines.Add(o);
}
}
doc.Save(stream);
return doc.Pages.Count;
}
private Page FindPage(StructElement se)
{
if (se.DefaultPage != null)
return se.DefaultPage;
if (se.HasChildren)
foreach (var child in se.Children)
{
var p = FindPage(child);
if (p != null)
return p;
}
return null;
}
}
}