ExtractParagraphs.vb
'' 
'' このコードは、DioDocs for PDF のサンプルの一部として提供されています。
'' © MESCIUS inc. All rights reserved.
'' 
Imports System.IO
Imports System.Drawing
Imports System.Numerics
Imports System.Collections.Generic
Imports System.Linq
Imports GrapeCity.Documents.Text
Imports GrapeCity.Documents.Drawing
Imports GrapeCity.Documents.Pdf
Imports GrapeCity.Documents.Pdf.Annotations
Imports GrapeCity.Documents.Pdf.Graphics
Imports GCTEXT = GrapeCity.Documents.Text
Imports GCDRAW = GrapeCity.Documents.Drawing

'' このサンプルは、既存のPDFから段落ごとにテキストを抽出する方法を示しています。
'' 任意の PDF を一時的な GcPdfDocument に読み込み、Page.GetText().Paragraphs プロパティを
'' 使用して、そのドキュメントの各ページから段落を取得し、それらの段落を
'' すべて TextLayout に追加して、現在のドキュメントにレンダリングします。
'' ページからテキストを取得するPage.GetText() メソッドや、ドキュメント全体からテキストを
'' 一度に取得するGcPdfDocument.GetText() メソッドもあります。
'' このサンプルで使用した元のPDFは、 PaginatedTextによって生成されたものです。
Public Class ExtractParagraphs
    Function CreatePDF(ByVal stream As Stream) As Integer
        Const margin = 36
        Dim c1 = Color.PaleGreen
        Dim c2 = Color.PaleGoldenrod

        Dim doc = New GcPdfDocument()
        Dim page = doc.NewPage()

        Dim rc = Util.AddNote(
            "このサンプルでは、既存のPDFを一時的なGcPdfDocument に読み込んだ後、" +
            "各ページから段落ごとにテキストを取得し、別のPDFへ出力します。" +
            "なお、段落ごとの境界がより明確になるよう、段落の背景色を変更してあります。" +
            "また、元のPDFは、最終的に生成されるPDFに追加されます。",
            page,
            New RectangleF(margin, margin, page.Size.Width - margin * 2, 0))

        '' キャプションのテキスト書式。
        Dim tf = New TextFormat() With
            {
                .Font = Util.getFont(),
                .FontBold = True,
                .FontSize = 14,
                .ForeColor = Color.Blue
            }
        '' 段落のテキスト書式。
        Dim tfpar = New TextFormat() With
        {
            .Font = tf.Font,
            .FontSize = 12,
            .BackColor = c1
        }
        '' テキストを描画するためのテキストレイアウト。
        Dim tl = page.Graphics.CreateTextLayout()
        tl.MaxWidth = doc.PageSize.Width
        tl.MaxHeight = doc.PageSize.Height
        tl.MarginAll = rc.Left
        tl.MarginTop = rc.Bottom + 36
        '' widow/orphan 制御のテキスト分割オプション。
        Dim topt = New TextSplitOptions(tl) With
        {
            .MinLinesInFirstParagraph = 2,
            .MinLinesInLastParagraph = 2,
            .RestMarginTop = rc.Left
        }

        '' 任意の PDF を開き、それを一時ドキュメントに読み込んで、すべてのページテキストを取得します。
        Using fs = File.OpenRead(Path.Combine("Resources", "PDFs", "StrongInTheRain.pdf"))
            Dim doc1 = New GcPdfDocument()
            doc1.Load(fs)

            For i = 0 To doc1.Pages.Count - 1
                tl.AppendLine(String.Format("読み込まれた PDF ファイルの {0} ページ目のパラグラフ:", i + 1), tf)

                Dim pg = doc1.Pages(i)
                Dim pars = pg.GetTextMap().Paragraphs
                For Each par In pars
                    tl.AppendLine(par.GetText(), tfpar)
                    If tfpar.BackColor = c1 Then
                        tfpar.BackColor = c2
                    Else
                        tfpar.BackColor = c1
                    End If
                Next
            Next

            tl.PerformLayout(True)
            While True
                '' 'rest' は、収まりきらなかったテキストを受け入れます。
                Dim rest As TextLayout = Nothing
                Dim splitResult = tl.Split(topt, rest)
                doc.Pages.Last.Graphics.DrawTextLayout(tl, PointF.Empty)
                If splitResult <> SplitResult.Split Then
                    Exit While
                End If
                tl = rest
                doc.NewPage()
            End While
            '' 参照用に元の文書に追加します。
            doc.MergeWithDocument(doc1, New MergeDocumentOptions())

            '' PDF ドキュメントを保存します。
            doc.Save(stream)
            Return doc.Pages.Count
        End Using
    End Function
End Class