ImageAlignment.vb
''
'' このコードは、DioDocs for PDF のサンプルの一部として提供されています。
'' © MESCIUS inc. All rights reserved.
''
Imports System.IO
Imports System.Drawing
Imports System.Text
Imports GrapeCity.Documents.Pdf
Imports GrapeCity.Documents.Text
Imports GrapeCity.Documents.Drawing
Imports GCTEXT = GrapeCity.Documents.Text
Imports GCDRAW = GrapeCity.Documents.Drawing
'' DsPdfの画像整列オプションの使用例を示すサンプルです。
'' このサンプルは、以前「Raw画像」という題名で公開されていた、
'' RawImageクラスを使用し、JPEG画像をドキュメントに追加するデモの代替です。
'' RawImageクラスは現在も使用可能ですが、将来的に廃止される予定のため、
'' ImageAlignクラスでの画像整列オプションを使用することをお勧めします。
'' 注意:DsPdfで同じ画像を複数回レンダリングする場合
'' (例:全ページのヘッダーとして同じ画像を描画する場合など)、
'' 同じ画像オブジェクトを使うと、その画像は自動的にDsPdf内部の
'' ディクショナリに登録され、ドキュメント全体で再利用されます。
'' そのため、毎回ファイル(またはストリーム)から同じ画像を読み込むのではなく、
'' 一度画像を読み込んで、画像オブジェクトとしてキャッシュすることが推奨されます。
'' (この仕組みはDsPdfで扱うすべての画像タイプに適用されます。)
Public Class ImageAlignment
Function CreatePDF(ByVal stream As Stream) As Integer
Dim doc = New GcPdfDocument()
'' キャプション描画用のテキストフォーマットを設定します:
Dim tf = New TextFormat() With {.Font = StandardFonts.Times, .FontSize = 12}
'' 様々な画像整列オプションを使って、画像を描画します:
Dim drawImage As Action(Of GCDRAW.Image, Page, ImageAlign, Boolean) =
Sub(ByVal image_, ByVal page_, ByVal ia_, ByVal clip_)
Dim rect = New RectangleF(72, 72, 72 * 4, 72 * 4)
Dim clipped = If(clip_, "clipped to a 4""x4"" rectangle", "without clipping")
Dim align = If(ia_ Is ImageAlign.Default, "ImageAlign.Default",
If(ia_ Is ImageAlign.CenterImage, "ImageAlign.CenterImage",
If(ia_ Is ImageAlign.StretchImage, "ImageAlign.StretchImage", "custom ImageAlign")))
'' イメージキャプションを描画します:
page_.Graphics.DrawString($"Page {doc.Pages.IndexOf(page_) + 1}: Image drawn at (1"", 1 ""), {clipped}, using {align}:", tf, New PointF(72, 36))
Dim clip As RectangleF? = If(clip_, rect, New RectangleF?)
'' イメージを描画します:
Dim imageRects As RectangleF() = Nothing
page_.Graphics.DrawImage(image_, rect, clip, ia_, imageRects)
'' 画像のアウトラインを表示します:
page_.Graphics.DrawRectangle(imageRects(0), Color.Red, 1, DashStyle.Solid)
'' 画像、クリップ領域を表示する:
page_.Graphics.DrawRectangle(rect, Color.Blue, 1, DashStyle.Solid)
End Sub
'' JPEGからイメージを作成する
''(ここでImage クラスのインスタンスを一度作成して、それを使い回してPDFに画像を描画することで、
''画像データが再利用できます。PDFに同じ画像が重複して埋め込まれることはありません)
Using img As GCDRAW.Image = GCDRAW.Image.FromFile(Path.Combine("Resources", "Images", "puffins.jpg")),
imgSmall As GCDRAW.Image = GCDRAW.Image.FromFile(Path.Combine("Resources", "ImagesBis", "puffins-small.jpg"))
'' ImageAlignクラスは、さまざまな画像整列オプションを提供します。
'' よく使われるオプションは、静的インスタンスで定義されています。
'' 以下の例を参照してください。
'' ページ 1: 既定の配置(Default)に、クリッピング無しで描画する:
drawImage(img, doc.NewPage(), ImageAlign.Default, False)
'' ページ 2:既定の配置(Default)に、クリッピングして描画する:
drawImage(img, doc.NewPage(), ImageAlign.Default, True)
'' ページ 3: 中央(CenterImage)に、クリッピングして描画:
drawImage(img, doc.NewPage(), ImageAlign.CenterImage, True)
'' ページ 4: 枠いっぱいに引き伸ばして(StretchImage)、クリッピング無しで描画:
drawImage(img, doc.NewPage(), ImageAlign.StretchImage, False)
''以下のようにインスタンスを作成することで、細かいカスタム設定も可能です。
'' ページ 5: クリッピング無し、画像を枠内に収め、縦横比を保って描画:
Dim ia = New ImageAlign(ImageAlignHorz.Center, ImageAlignVert.Center, True, True, True, False, False)
drawImage(img, doc.NewPage(), ia, False)
'' ページ 6: 小さい画像を、クリッピング無し、画像を枠内に収め、縦横比を保って、タイル状に並べて描画:
ia = New ImageAlign(ImageAlignHorz.Left, ImageAlignVert.Top, False, False, True, True, True)
drawImage(imgSmall, doc.NewPage(), ia, False)
'' PDF ドキュメントを保存します。
doc.Save(stream)
Return doc.Pages.Count
End Using
End Function
End Class