【C#】QuestPDFを使おうとしたらライセンスエラーでハマった話【.NET】

# 前書き
初めまして。ar3です。
画像を重ね合わせてPDF化する案件があり、オープンソースの.NET APIであるQuestPDFを試してみたところ、サンプルが動かない＆日本語のドキュメントもなくてハマったので記事を書くことにしました。

# QuestPDFとは
.NETで使えるPDF処理用の無料のオープンソースAPIです。

【公式】
https://products.fileformat.com/ja/pdf/net/questpdf/

# 動作環境
- 【OS】Windows 11 Home
- 【IDE】Visual Studio 2022
- 【言語/フレームワーク】C# .NET6.0 WPFアプリケーション

# 導入
NuGetからインストールします。
[公式](https://products.fileformat.com/ja/pdf/net/questpdf/) にコマンドのインストール手順は書いてるので、GUIでのインストール手順をご紹介します。

1. プロジェクト作成後、[ツール] > [NuGet パッケージ マネージャー] > [ソリューションの NuGet パッケージの管理]をクリックします。
2. [参照]タブを選択し、テキストボックスに「questpdf」と入力して検索し、一覧に出てきた「QuestPDF」を選択すると、右側にプロジェクト一覧が出てくるので、チェックを入れて[インストール]をクリックします。
![20231025_nuget_questpdf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581065/08640911-92ea-8c39-e4b1-d5b2b1c6f62f.png)

3. 変更の適用とライセンスに同意し、インストール完了です。

# ライセンスエラーについて
このままサンプル通りに動かそうとするとライセンスのエラーが発生します。

> System.Exception: 'QuestPDF is a modern open-source library. We identify the importance of the library in your projects and therefore want to make sure you can safely and confidently continue the development. Being a healthy and growing community is the primary goal that motivates us to pursue professionalism. 
>
> Please refer to the QuestPDF License and Pricing webpage for more details. (https://www.questpdf.com/pricing.html) 
>
> If you are an existing QuestPDF user and for any reason cannot update, you can stay with the 2022.12.X release with the extended quality support but without any new features, improvements, or optimizations. That release will always be available under the MIT license, free for commercial usage. 
>
> The library does not require any license key. We trust our users, and therefore the process is simple. To disable license validation and turn off this exception, please configure an eligible license using the QuestPDF.Settings.License API, for example: 
>
> "QuestPDF.Settings.License = LicenseType.Community;" 
>
> Learn more on: https://www.questpdf.com/license-configuration.html 

![2023-10-25-2_questpdf_error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581065/806f865f-e122-eff5-17c0-45647653d9fc.png)

上記リンクの https://www.questpdf.com/license-configuration.html にアクセスするとなぜか404になってしまいますが、↓のリンクならいけます。エラーメッセージのURL更新しておいてくれ。
https://www.questpdf.com/license/configuration.html

これを見るに、スタートアッププログラムでライセンスを設定する必要があるとのこと。

>Code change
>Please use the following code to configure the appropriate license.
>
>You need to execute this code only once when the application starts, most likely in the Program.cs or the Startup.cs file.
>
>csharp
> ```QuestPDF.Settings.License = LicenseType.Community;```
>csharp>
>```QuestPDF.Settings.License = LicenseType.Professional;```
>csharp
>```QuestPDF.Settings.License = LicenseType.Enterprise;```
>
> - [出展元] License configuration | QuestPDF
> https://www.questpdf.com/license/configuration.html

無料版を利用するのでLicenceTypeにCommunityを設定して、WPFのInitializeComponentの部分に貼ってあげると動きます。


```XML:Xaml
<Window x:Class="QuestPdfTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:QuestPdfTest"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="400">
    <Grid>
        <Button Content="PDFを生成" Name="CreatePdf" HorizontalAlignment="Left" Margin="100,175,0,0" VerticalAlignment="Top" Width="180" Height="50" FontSize="18" Click="CreatePdf_Click"/>

    </Grid>
</Window>
```

```C#:xaml.cs
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
using System.Windows;

namespace QuestPdfTest
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            QuestPDF.Settings.License = LicenseType.Community;
        }

        private void CreatePdf_Click(object sender, RoutedEventArgs e)
        {
            Document.Create(container =>
            {
                container.Page(page =>
                {
                    page.Size(PageSizes.A4);
                    page.Margin(2, Unit.Centimetre);
                    page.PageColor(Colors.White);
                    page.DefaultTextStyle(x => x.FontSize(20));
                    page.Header()
                        .Text("Hello PDF!")
                        .SemiBold().FontSize(36).FontColor(Colors.Blue.Medium);
                    page.Content()
                        .PaddingVertical(1, Unit.Centimetre)
                        .Column(x =>
                        {
                            x.Spacing(20);
                            x.Item().Text(Placeholders.LoremIpsum());
                            x.Item().Image(Placeholders.Image(200, 100));
                        });
                    page.Footer()
                        .AlignCenter()
                        .Text(x =>
                        {
                            x.Span("Page ");
                            x.CurrentPageNumber();
                        });
                });
            })
.GeneratePdf("hello.pdf");
        }
    }
}
```

デバッグ実行してボタンをクリックして、実行ディレクトリ（プロジェクトフォルダ\bin\Debug\net6.0-windows）を見ると、hello.pdfが出力されています。

![2023-10-25-3_output_pdf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581065/2ed08f01-980e-854d-4340-9b61d4fd9150.png)

無事に動かせたので今回はいったんここまでにします。
最後まで読んでくださりありがとうございました。