2
0

More than 1 year has passed since last update.

C#/VB.NET:PDF にテキスト透かしを追加する

Last updated at Posted at 2023-05-06

透かしは、一般的に文書の著作権情報、作者、所属団体、または文書属性などを表示するために使用されます。テキスト注釈などとは異なり、テキスト透かしはページに描画される要素であるため、簡単に削除することができません。そのため、透かしは偽造防止にも非常に有効です。また、透かしにはテキスト透かしと画像透かしがあります。この記事では、Free Spire.PDF for .NET(無料版)を使用してPDFにテキスト透かしを追加する具体的な方法とサンプルコードを共有します。

Free Spire.PDF for .NETをインストールする

方法1NuGetでFree Spire.PDF for .NETをインストールする
Visual Studioを開いて新しいプロジェクトを作成します。次に、「Solution Explorer」で「References」を右クリックし、「Nuget Manage Packages」を選択します。Free Spire.PDF for .NETを検索してインストールします。
方法2:手動でSpire.PDF.dllを追加する
Free Spire.PDF for .NETをローカルにダウンロードしインストールします。次に、Visual Studioて新しいプロジェクトを作成し、右側の「Solution Explorer」で「References」を右クリックし、「Add Reference」>「Browse」を選択して、インストールパス下のBINフォルダのdllファイルを見つけ、「OK」をクリックして、プログラムに参照を追加します。

テキスト透かし

具体的な方法

  • PdfDocument オブジェクトを作成し、PdfDocument.LoadFromFile() メソッドを使用してサンプル PDF ドキュメントをロードします。
  • PdfTrueTypeFont オブジェクトを作成し、透かしテキストを指定し、PdfFontBase.MeasureString() メソッドを使用してテキストサイズを測定します。
  • ドキュメント内のすべてのページをトラバースします。
  • PdfPageBase.Canvas.TraslateTransform() メソッドを使用して指定した座標で特定のページの座標系を変換し、PdfPageBase.Canvas.RotateTransform() メソッドを使用して座標系を反時計回りに45度回転します。これにより、透かしがページの中央に45度の角度で表示されるようになります。
  • PdfPageBase.Canvas.DrawString() メソッドを使用して、ページに透かしテキストを描画します。
  • PdfDocument.SaveToFile() メソッドを使用して、ドキュメントを別の PDF ファイルに保存します。

サンプルコード

C#:

using Spire.Pdf;
using Spire.Pdf.Graphics;
using System.Drawing;

namespace AddTextWatermarkToPdf
{
    class Program
    {
        static void Main(string[] args)
        {
            //PdfDocumentオブジェクトを作成する
            PdfDocument pdf = new PdfDocument();

            //サンプルPDFドキュメントをロードする
            pdf.LoadFromFile(@"C:\Users\Administrator\Desktop\sample.pdf");

            //PdfTrueTypeFontオブジェクトを作成する
            PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("Arial", 50f), true);

            //透かしテキストを設定する
            string text = "CONFIDENTIAL";

            //テキストサイズを測定する
            SizeF textSize = font.MeasureString(text);
            
            //座標系の平行移動量を計算するために使用される2つのオフセット変数の値を計算する
            float offset1 = (float)(textSize.Width * System.Math.Sqrt(2) / 4);
            float offset2 = (float)(textSize.Height * System.Math.Sqrt(2) / 4);

            //ドキュメント内のすべてのページをトラバースする
            foreach (PdfPageBase page in pdf.Pages)
            {
                //ページの透明度を設定する
                page.Canvas.SetTransparency(0.4f);

                //指定された座標で座標系を変換する
                page.Canvas.TranslateTransform(page.Canvas.Size.Width / 2 - offset1 - offset2, page.Canvas.Size.Height / 2 + offset1 - offset2);

                //座標系を反時計回りに45度回転する
                page.Canvas.RotateTransform(-45);

                //ページに透かしテキストを描画する
                page.Canvas.DrawString(text, font, PdfBrushes.DarkBlue, 0, 0);
            }

            //変更を別のファイルに保存する
            pdf.SaveToFile("TextWatermark.pdf");
        }
    }
}

VB.NET:

Imports Spire.Pdf
Imports Spire.Pdf.Graphics
Imports System.Drawing
 
Namespace AddTextWatermarkToPdf
    Class Program
        Shared  Sub Main(ByVal args() As String)
            'PdfDocumentオブジェクトを作成する
            Dim pdf As PdfDocument =  New PdfDocument() 
 
            'サンプルPDFドキュメントをロードする
            pdf.LoadFromFile("C:\Users\Administrator\Desktop\sample.pdf")
 
            'PdfTrueTypeFontオブジェクトを作成する
            Dim font As PdfTrueTypeFont =  New PdfTrueTypeFont(New Font("Arial",50f),True) 
 
            '透かしテキストを設定する
            Dim text As String =  "CONFIDENTIAL" 
 
            'テキストサイズを測定する
            Dim textSize As SizeF =  font.MeasureString(text) 
 
            '座標系の平行移動量を計算するために使用される2つのオフセット変数の値を計算する
            Dim offset1 As single = CType((textSize.Width * System.Math.Sqrt(2) / 4), single)
            Dim offset2 As single = CType((textSize.Height * System.Math.Sqrt(2) / 4), single)
 
            'ドキュメント内のすべてのページをトラバースする
            Dim page As PdfPageBase
            For Each page In pdf.Pages
                'ページの透明度を設定する
                page.Canvas.SetTransparency(0.4f)
 
                '指定された座標で座標系を変換する
                page.Canvas.TranslateTransform(page.Canvas.Size.Width / 2 - offset1 - offset2, page.Canvas.Size.Height / 2 + offset1 - offset2)
 
                '座標系を反時計回りに45度回転する
                page.Canvas.RotateTransform(-45)
 
                'ページに透かしテキストを描画する
                page.Canvas.DrawString(text, font, PdfBrushes.DarkBlue, 0, 0)
            Next
 
            '変更を別のファイルに保存する
            pdf.SaveToFile("TextWatermark.pdf")
        End Sub
    End Class
End Namespace

2023-05-06_173412.png

複数行のテキスト透かし

具体的な方法

  • PdfDocument オブジェクトを作成し、PdfDocument.LoadFromFile() メソッドを使用してサンプル PDF ドキュメントをロードします。
  • カスタムメソッド InsertMultiLineTextWatermark(PdfPageBase page, String watermarkText, PdfTrueTypeFont font, int rowNum, int columnNum) を作成して、複数行のテキスト透かしを PDF ページに追加します。 パラメータ rowNum および columnNum は、タイル透かしの行番号と列番号を指定します。
  • ドキュメント内のすべてのページをトラバースし、カスタムメソッド InsertMultiLineTextWatermark() を呼び出して、各ページに透かしを適用します。
  • PdfDocument.SaveToFile() メソッドを使用して、ドキュメントを別のファイルに保存します。

サンプルコード

C#:

using System;
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System.Drawing;

namespace AddMultiLineTextWatermark
{
    class Program
    {
        static void Main(string[] args)
        {
            //PdfDocumentインスタンスを作成する
            PdfDocument pdf = new PdfDocument();

            //サンプルPDFドキュメントをロードする
            pdf.LoadFromFile(@"C:\Users\Administrator\Desktop\sample.pdf");

            //PdfTrueTypeFontオブジェクトを作成する
            PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("Arial", 20f), true);

            //すべてのページをトラバースする
            for (int i = 0; i < pdf.Pages.Count; i++)
            {
                //InsertMultiLineTextWatermark()メソッドを呼び出して、指定したページにテキスト透かしを追加する
                InsertMultiLineTextWatermark(pdf.Pages[i], "CONFIDENTIAL", font, 3, 3);
            }

            //ドキュメントを別のファイルに保存する
            pdf.SaveToFile("MultiLineTextWatermark.pdf");
        }

        //複数行のテキスト透かしをページに挿入するカスタムメソッドを作成する
        static void InsertMultiLineTextWatermark(PdfPageBase page, String watermarkText, PdfTrueTypeFont font, int rowNum, int columnNum)
        {
            //テキストサイズを測定する
            SizeF textSize = font.MeasureString(watermarkText);

            //座標系の移動量の計算に使用される2つのオフセット変数の値を計算する
            float offset1 = (float)(textSize.Width * System.Math.Sqrt(2) / 4);
            float offset2 = (float)(textSize.Height * System.Math.Sqrt(2) / 4);

            //タイルブラシを作成する
            PdfTilingBrush brush = new PdfTilingBrush(new SizeF(page.ActualSize.Width / columnNum, page.ActualSize.Height / rowNum));
            brush.Graphics.SetTransparency(0.3f);
            brush.Graphics.Save();
            brush.Graphics.TranslateTransform(brush.Size.Width / 2 - offset1 - offset2, brush.Size.Height / 2 + offset1 - offset2);
            brush.Graphics.RotateTransform(-45);

            //タイルブラシに透かしテキストを描画する
            brush.Graphics.DrawString(watermarkText, font, PdfBrushes.Violet, 0, 0);
            brush.Graphics.Restore();

            //タイルブラシを使用して(ページ全体をカバーする)長方形を描画する
            page.Canvas.DrawRectangle(brush, new RectangleF(new PointF(0, 0), page.ActualSize));
        }
    }
}

VB.NET:

Imports System
Imports Spire.Pdf
Imports Spire.Pdf.Graphics
Imports System.Drawing
 
Namespace AddMultiLineTextWatermark
    Class Program
        Shared  Sub Main(ByVal args() As String)
            'PdfDocumentインスタンスを作成する
            Dim pdf As PdfDocument =  New PdfDocument() 
 
            'サンプルPDFドキュメントをロードする
            pdf.LoadFromFile("C:\Users\Administrator\Desktop\sample.pdf")
 
            'PdfTrueTypeFontオブジェクトを作成する
            Dim font As PdfTrueTypeFont =  New PdfTrueTypeFont(New Font("Arial",20f),True) 
 
            'すべてのページをトラバースする
            Dim i As Integer
            For  i = 0 To  pdf.Pages.Count- 1  Step  i + 1
                'InsertMultiLineTextWatermark()メソッドを呼び出して、指定したページにテキスト透かしを追加する
                InsertMultiLineTextWatermark(pdf.Pages(i), "CONFIDENTIAL", font, 3, 3)
            Next
 
            'ドキュメントを別のファイルに保存する
            pdf.SaveToFile("MultiLineTextWatermark.pdf")
        End Sub
 
        '複数行のテキスト透かしをページに挿入するカスタムメソッドを作成する
        Shared  Sub InsertMultiLineTextWatermark(ByVal page As PdfPageBase, ByVal watermarkText As String, ByVal font As PdfTrueTypeFont, ByVal rowNum As Integer, ByVal columnNum As Integer)
            'テキストサイズを測定する
            Dim textSize As SizeF =  font.MeasureString(watermarkText) 
 
            '座標系の移動量の計算に使用される2つのオフセット変数の値を計算する
            Dim offset1 As single = CType((textSize.Width * System.Math.Sqrt(2) / 4), single)
            Dim offset2 As single = CType((textSize.Height * System.Math.Sqrt(2) / 4), single)
 
            'タイルブラシを作成する
            Dim brush As PdfTilingBrush =  New PdfTilingBrush(New SizeF(page.ActualSize.Width / columnNum,page.ActualSize.Height / rowNum)) 
            brush.Graphics.SetTransparency(0.3f)
            brush.Graphics.Save()
            brush.Graphics.TranslateTransform(brush.Size.Width / 2 - offset1 - offset2, brush.Size.Height / 2 + offset1 - offset2)
            brush.Graphics.RotateTransform(-45)
 
            'タイルブラシに透かしテキストを描画する
            brush.Graphics.DrawString(watermarkText, font, PdfBrushes.Violet, 0, 0)
            brush.Graphics.Restore()
 
            'タイルブラシを使用して(ページ全体をカバーする)長方形を描画する
            page.Canvas.DrawRectangle(brush, New RectangleF(New PointF(0, 0), page.ActualSize))
        End Sub
    End Class
End Namespace

2023-05-06_173453.png

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0