ExtractText.vb
'' 
'' このコードは、DioDocs for PDF のサンプルの一部として提供されています。
'' Copyright (c) GrapeCity inc. All rights reserved.
'' 
Imports System.IO
Imports System.Drawing
Imports GrapeCity.Documents.Text
Imports GrapeCity.Documents.Pdf

'' このサンプルは、既存のPDFからテキストを抽出する方法を示しています。
'' 任意の PDF を一時的な GcPdfDocument に読み込み、Page.GetText() メソッドを
'' 使用してそのドキュメントの各ページからテキストを取得し、それらのテキストを
'' すべて TextLayout に追加して、現在のドキュメントにレンダリングします。
'' Page.GetText() の代わりに、ドキュメント全体からテキストを一度に取得する
'' GcPdfDocument.GetText() メソッドがあります。
Public Class ExtractText
    Function CreatePDF(ByVal stream As Stream) As Integer
        Dim doc = New GcPdfDocument()
        Dim page = doc.NewPage()
        Dim rc = Util.AddNote(
            "これはPDF文書全体からテキストを一度に取得するサンプルです。" +
            "任意の PDF を一時的な GcPdfDocument に読み込んでから、" +
            "Page.GetText() メソッドを使用して読み込まれたドキュメントの各ページからテキストを取得します。" +
            "読み込んだテキストをすべて TextLayout に追加して出力用のドキュメントに描画します。 " +
            "Page.GetText() の代わりに、GcPdfDocument.GetText() メソッドもあります。",
            page)

        '' キャプションのテキスト書式。
        Dim tf = New TextFormat() With
        {
            .Font = Util.getFont(),
            .FontBold = True,
            .FontSize = 14,
            .ForeColor = Color.Blue
        }
        '' テキストを描画するためのテキストレイアウト。
        Dim tl = New TextLayout(72)
        tl.DefaultFormat.Font = Util.getFont()
        tl.DefaultFormat.FontSize = 12
        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 As New FileStream(Path.Combine("Resources", "PDFs", "diodocs_pricelist.pdf"), FileMode.Open, FileAccess.Read)
            Dim doc1 = New GcPdfDocument()
            doc1.Load(fs)

            '' 読み込まれたドキュメントのページのテキストを取得します。
            Dim texts = New List(Of String)()
            doc1.Pages.ToList().ForEach(Sub(p_) texts.Add(p_.GetText()))

            '' テキストレイアウトにテキストとキャプションを追加します。
            For i = 0 To texts.Count - 1
                tl.AppendLine(String.Format("読み込まれた PDF ファイルの {0} ページ目のテキスト:", i + 1), tf)
                tl.AppendLine(texts(i))
            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
        End Using
        '' PDF ドキュメントを保存します。
        doc.Save(stream)
        Return doc.Pages.Count
    End Function
End Class