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