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

'' このサンプルは、既存のPDFの全ページにシンプルなテキストの透かしのような
'' オーバーレイを追加する方法を示しています。
Public Class AddWatermark
    Function CreatePDF(ByVal stream As Stream) As Integer
        Dim doc = New GcPdfDocument()
        Using fs = File.OpenRead(Path.Combine("Resources", "PDFs", "SlidePages.pdf"))
            doc.Load(fs)
            For Each page In doc.Pages
                Dim g = page.Graphics

                '' 「ウォーターマーク」の描画に使用されるテキストレイアウト。
                Dim tl = g.CreateTextLayout()
                tl.Append("GcPdf Demo")
                tl.DefaultFormat.Font = Font.FromFile(Path.Combine("Resources", "Fonts", "calibrib.ttf"))
                tl.DefaultFormat.FontSize = g.Resolution
                '' 半透明の色。
                tl.DefaultFormat.ForeColor = Color.FromArgb(128, Color.Yellow)
                tl.DefaultFormat.GlyphAdvanceFactor = 1.5F
                tl.PerformLayout()

                '' 回転角度(ラジアン) - ページの左下から右上の角まで。
                Dim angle = -Math.Asin(g.CanvasSize.Width / g.CanvasSize.Height)
                '' ページの中央。
                Dim center = New PointF(g.CanvasSize.Width / 2, g.CanvasSize.Height / 2)
                '' テキストサイズを基にオフセットを追加。
                Dim delta = New PointF(
                    ((tl.ContentWidth * Math.Cos(angle) - tl.ContentHeight * Math.Sin(angle)) / 2),
                    ((tl.ContentWidth * Math.Sin(angle) + tl.ContentHeight * Math.Cos(angle)) / 2))

                '' 透かしテキストをページの中央に斜めに描画します。
                '' (Matrixの変換は最後から最初へ適用されます)
                g.Transform =
                    Matrix3x2.CreateRotation(angle) *
                    Matrix3x2.CreateTranslation(center.X - delta.X, center.Y - delta.Y)
                g.DrawTextLayout(tl, PointF.Empty)
                g.Transform = Matrix3x2.Identity
            Next
            doc.Save(stream)
        End Using
        Return doc.Pages.Count
    End Function
End Class