C# PDF Sharp でPDFスタンプを作る

概要

 今回は、C#とPDF SHARP を使って、AcrobatReaderDCで開いた PDF に押印できるPDFスタンプを作ってみます。他のフリーのPDFビューワーには、画像ファイルをスタンプとして取り込むことが出来るものもありますが、AcrobatReaderDCはPDF形式のファイルしか取り込めない(?)様です。
 私自身はAcrobatReaderDCをあまり使わないのですが、私の周囲の方は AcrobatReaderDC を使う方がほとんどなので、PDF形式のスタンプ作成を試みることにしました。

PDF SHARPインストール

①環境

 (1)OS  : Windows10 64bit
 (2)開発環境 : VisualStudio2019 Community

②インストール手順

(1)C#フォームアプリケーションを作成します。

(2)パッケージマネージャーコンソールを表示します。

(3)コンソールに下記コマンドを入力します。
 ※最新情報:https://www.nuget.org/packages/PdfSharp/

   Install-Package PdfSharp -Version 1.50.5147

 “正常にインストールされました” 等のメッセージが表示されて、再びコマンド入力可能な状態になれば完了です。

日本語設定

以下のサイトを参考にしました。
C#で日本語をPDFに出力する(PDFSharpを利用)

(1)源真ゴシック フォントダウンロード
 次のサイトを下方にスクロールするとダウンロードリンクがあるので、圧縮ファイルをダウンロードし展開します。 
  http://jikasei.me/font/genshin/

 参考サイト例の通り GenShinGothic-Monospace-Medium.ttf を使います。(上図、赤マーキングファイル)

(2)フォームアプリケーションにフォルダーを追加します。

(3)フォルダー名を “fonts” とし、ダウンロード・展開した GenShinGothic-Monospace-Medium.ttf ファイルをドラッグアンドドロップします。
 ファイル選択するとプロパティが表示されるので、ビルドアクションを “埋め込みリソース” に変更します。

(4)フォントリゾルバー(JapaneseFontResolver.cs)作成

 参考サイト同様です。
 クラスを追加し、コピペさせて頂きました。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using PdfSharp.Fonts;
using System.IO;
using System.Reflection;


namespace PDF_SHARP
{
    public class JapaneseFontResolver : IFontResolver
    {
        // 源真ゴシック( http://jikasei.me/font/genshin/)
        private static readonly string GEN_SHIN_GOTHIC_MEDIUM_TTF = "PDF_SHARP.fonts.GenShinGothic-Monospace-Medium.ttf";

        public byte[] GetFont(string faceName)
        {
            switch (faceName)
            {
                case "GenShinGothic#Medium":
                    return LoadFontData(GEN_SHIN_GOTHIC_MEDIUM_TTF);
            }
            return null;
        }

        public FontResolverInfo ResolveTypeface(
                    string familyName, bool isBold, bool isItalic)
        {
            var fontName = familyName.ToLower();

            switch (fontName)
            {
                case "gen shin gothic":
                    return new FontResolverInfo("GenShinGothic#Medium");
            }

            // デフォルトのフォント
            return PlatformFontResolver.ResolveTypeface("Arial", isBold, isItalic);
        }

        // 埋め込みリソースからフォントファイルを読み込む
        private byte[] LoadFontData(string resourceName)
        {
            var assembly = Assembly.GetExecutingAssembly();

            using (Stream stream = assembly.GetManifestResourceStream(resourceName))
            {
                if (stream == null)
                    throw new ArgumentException("No resource with name " + resourceName);

                int count = (int)stream.Length;
                byte[] data = new byte[count];
                stream.Read(data, 0, count);
                return data;
            }
        }
    }
}

メインプログラム

 フォームは下図の様なシンプルなものです。ボタンを押すとPDFを生成します。フォームアプリケーションにしたのは、日付等を変更する場合のユーザーインタフェース設定を想定してのことです。

 ボタンを押すと次の様なスタンプ画像を描画し、PDFファイルを保存します。

 描画プログラムです。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using PdfSharp;
using PdfSharp.Drawing;
using PdfSharp.Pdf;
using System.Diagnostics;

using System.IO;

namespace PDF_SHARP
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            PdfSharp.Fonts.GlobalFontSettings.FontResolver = new JapaneseFontResolver();
        }

        private void Button1_Click(object sender, EventArgs e)
        {
            PdfDocument document = new PdfDocument();
            document.Info.Title = "PDF SHARP TEST";
            document.Info.Author = "著者" ;
            PdfPage page = document.AddPage();
            page.Size = PageSize.A5;
            page.Orientation = PageOrientation.Portrait;

            XGraphics gfx = XGraphics.FromPdfPage(page);
            XFont font = new XFont("Gen Shin Gothic",25, XFontStyle.Regular);
            gfx.DrawString("KatsEye",font,XBrushes.Blue,new XRect(5, 5, 120, 22),XStringFormats.Center);

            font = new XFont("Gen Shin Gothic", 9, XFontStyle.Regular);
            gfx.DrawString("~IoT な日常の探求~", font, XBrushes.Red , new XRect(5, 26, 120, 22), XStringFormats.Center);

            String dt_now = DateTime.Now.ToString("yy/MM/dd hh:mm:ss");
            font = new XFont("Gen Shin Gothic", 10, XFontStyle.Regular);
            gfx.DrawString(dt_now, font, XBrushes.Black, new XRect(5, 37, 120, 22), XStringFormats.Center);

            gfx.DrawRoundedRectangle(new XPen(XColors.Blue , 2) , 15 , 4 , 100 , 52 , 10 , 10);

            String filename = DateTime.Now.ToString("yyyy_MM_dd") + ".pdf" ;
            document.Save(filename);
            Process.Start(filename);
        }  
    }
}

 図形等の描画は下記を参考にしました。
 http://www.pdfsharp.net/wiki/Graphics-sample.ashx

スタンプ登録

(1)次のいずれかの方法で「注釈」を開きます。

(2)「スタンプボタン」をクリックし、「カスタムスタンプ」‐「作成」の順に開きます。

(3)作成したスタンプPDFファイルを読み込みます。

(4)保管する分類・名前を設定します。
 既に設定済の分類名はドロップダウンリストから選択可能です。選択したPDFファイルのスタンプ部は自動でトリミングとセンタリングされます。“OK” を押してフォームを閉じます。

(5)(4)で追加した分類にスタンプが登録されています。

(6)スタンプを選択し、開いているPDFファイルの任意の位置に押印することが出来ます。


まとめ

 C#でPDF生成が出来ることを知ったのは大きな収穫です。
 更に自動でスタンプ登録までできると良いのですが・・・。
 活用・応用方法等を検討してみたいと思います。

「C# PDF Sharp でPDFスタンプを作る」への1件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です