ChatGPTにサポートしてもらってPDFを暗号化するWindowsアプリをつくってみた

# はじめに
PDFファイルを暗号化したいよ！！ドラえもん、なんかいい道具出してよ！！タダで！！Windowsで動くやつがいいな！！

VisualStudioCommunityEditionでC#でWindowsアプリつくれるよね。でもPDFファイルいじるにはどうするんだろう！？？
そうだ！！最近はやりのChatGPTに聞いてみよう！！

ってなかんじで、ChatGPTに聞いてみてなんとかなるかな、と思い挑戦してみました。

※できあがったものをgithubにおいておきます
https://github.com/hase-k0x01/PdfEncrypter

# ChatGPTに聞いてみた
ChatGPTとかに入力する質問文を考える専門の仕事があるらしいですね。プロンプトエンジニアっていうらしいです。私はプロンプトエンジニアではないので、至極てきとうに入力してみます。

````
Show source code to encrypt pdf in C# .
````

出てきた回答が以下の通り
````
using System;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;

class Program
{
    static void Main(string[] args)
    {
        string inputFilePath = @"C:\input.pdf";
        string outputFilePath = @"C:\output.pdf";
        string password = "mypassword";

        using (var input = new FileStream(inputFilePath, FileMode.Open, FileAccess.Read))
        using (var output = new FileStream(outputFilePath, FileMode.Create, FileAccess.Write))
        {
            var reader = new PdfReader(input);
            var encryption = new PdfEncryption();
            encryption.UserPassword = encryption.OwnerPassword = password;
            encryption.Permissions = PdfWriter.AllowPrinting | PdfWriter.AllowCopy | PdfWriter.AllowScreenReaders;
            PdfStamper stamper = new PdfStamper(reader, output);
            stamper.SetEncryption(encryption);
            stamper.Close();
        }
    }
}

````
つづいて、説明文が
````
This code reads an existing PDF document from the inputFilePath, encrypts it with the specified password, and saves the encrypted document to the outputFilePath. The PdfEncryption object is used to set the password and permissions for the encrypted PDF. In this example, the permissions allow printing, copying, and screen reader access. You can adjust these permissions to your needs by setting the appropriate PdfWriter constants.
````

あー、なんかそれっぽいね！！いいね。
さっそく、VisualStudioでプロジェクト作って、コピペしてみよう!!

# 久しぶりにVisualStudioを使ってみる
そういえば、VisualStudioを使うのは、すごく久しぶりだったんですよね。

とりあえず、それっぽい部品を配置して画面を作りました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126400/9238655a-9cc7-a78e-4e60-c1a350aed3eb.png)


で、コマンドボタンのところにChatGPTのコードをコピペしたら、赤線がでて怒られたので、そのままだと動かないんだなぁって思って原因を探ります。

# さすがに、コピペしただけじゃ動かなかった
調べてみると、"iTextSharp"っていうライブラリが必要のようでした。
インストール方法はGoogleに頼りました笑

こちらのサイト↓に、iTextSharpのライブラリのインストール方法が書いてありました。
https://va2577.github.io/post/111/

恥ずかしながら、VisualStudioの追加ライブラリのインストール方法を知らなかったんですけど、今はpythonでいうpipみたいにしてインストールできるんですねー。驚きです。

NuGet パッケージマネージャで以下のようにします。
````
PM> Install-Package iTextSharp
````

さて、パッケージをインストールできて、usingのところの赤線が消えました。めでたしめでたし。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126400/1e956112-56fd-287a-2342-a4a28310ad55.png)

あー、でも、赤線はきえないんですねー、何ででしょうか。
メソッドがないんですね。
さすがに、ChatGPT様そのままのコードじゃだめなんですね。
なんででしょう？？？

マニュアルが必要ですね。
ChatGPTに、「マニュアルだせよ！！」って頼んでみました。

````
Show reference manual of iTextSharp.
````
で、その回答...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126400/b8c6e952-b44e-de13-642f-950f3bc509c3.png)

回答内容は「iTextSharpライブラリは、2018年からサポートされなくなったよ！！PDFSharpライブラリを使ってね！！」ってな感じの内容です。

**サポートされれないんかーーーい！！**

だったらはじめからPDFSharpのコードを出しなさ～～～い！！

# 気を取り直してPDFSharpのコードを要求する
というわけで、気を取り直して、PDFSharpのコードを出すように要求してみました。

````
Show source code to encrypt pdf in C# with PDFSharp library.
````

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126400/2c601051-0762-c07b-84d7-30683fb06e35.png)

ちゃんとPDFSharpライブラリを使っているっぽいですね。

コードはこんな感じでした。
````
using System;
using System.IO;
using PdfSharp.Pdf;
using PdfSharp.Pdf.Security;

class Program
{
    static void Main(string[] args)
    {
        string inputFilePath = @"C:\input.pdf";
        string outputFilePath = @"C:\output.pdf";
        string password = "mypassword";

        using (var input = new FileStream(inputFilePath, FileMode.Open, FileAccess.Read))
        using (var output = new FileStream(outputFilePath, FileMode.Create, FileAccess.Write))
        {
            var document = PdfReader.Open(input);
            var securitySettings = document.SecuritySettings;
            securitySettings.UserPassword = password;
            securitySettings.OwnerPassword = password;
            securitySettings.PermitAccessibilityExtractContent = true;
            securitySettings.PermitAnnotations = true;
            securitySettings.PermitAssembleDocument = true;
            securitySettings.PermitExtractContent = true;
            securitySettings.PermitFormsFill = true;
            securitySettings.PermitFullQualityPrint = true;
            securitySettings.PermitModifyDocument = true;
            securitySettings.PermitPrint = true;
            document.Save(output);
        }
    }
}
````

あー、まあなんかそれっぽいですね。

# PDFSharpライブラリを利用してみる
とりあえず、PDFSharpのライブラリをインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126400/996c26c4-6987-4c78-6b8e-6d607491f74d.png)

で、ChatGPT様が教えてくださったコードをコピペしました。
とくに赤線もでませんでした。

ChatGPTのコードに埋め込んであったファイル名の部分は、テキストボックスに入力したファイル名にしておきます。その他配置したコントロールと連携するようにしておきます。
````
            toolStripStatusLabel.Text = "Starting Encrypting";

            string inputFilePath = textBoxSourceFileName.Text;
            string outputFilePath = textBoxDestinationFileName.Text;
            string password = textBoxPassword.Text;

            toolStripStatusLabel.Text = "Encrypting...";
            using (var input = new FileStream(inputFilePath, FileMode.Open, FileAccess.Read))
            using (var output = new FileStream(outputFilePath, FileMode.Create, FileAccess.Write))
            {
                var document = PdfReader.Open(input);
                var securitySettings = document.SecuritySettings;
                securitySettings.UserPassword = password;
                securitySettings.OwnerPassword = password;
                securitySettings.PermitAccessibilityExtractContent = true;
                securitySettings.PermitAnnotations = true;
                securitySettings.PermitAssembleDocument = true;
                securitySettings.PermitExtractContent = true;
                securitySettings.PermitFormsFill = true;
                securitySettings.PermitFullQualityPrint = true;
                securitySettings.PermitModifyDocument = true;
                securitySettings.PermitPrint = true;
                document.Save(output);
            }

            toolStripStatusLabel.Text = "Done...";
````

# 動かしてみた
で、とりあえずビルドして起動。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126400/7a456897-d132-c6df-7320-a4645b706023.png)

ビルドエラーなし、OK!!




とりあえず、ファイル名を設定して、後はボタンを押すだけ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126400/2b5562e2-e3b8-bcd5-5258-4723215b33de.png)

ボタンを押して...
例外も発生しないので、いけたのでは？？？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126400/7ee64615-0b49-748a-027e-bf4beef58cd8.png)

ファイルはできていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126400/6b7c31f3-b8dc-78fe-7d0e-c8e0088cbe64.png)

ちゃんと暗号化されてるっぽいですねー

パスワードを入力して....
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126400/3a75227d-f56f-f3fe-3576-b144d91fe887.png)

ほら、ちゃんとPDF開けました。やったね！！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126400/34cc0c96-e5b8-889d-7632-d600662b2426.png)


ってことで、企みはまあ成功です

# まとめ

ChatGPTで提示されたコードでアプリが作れるかという試みでしたが、まあなんとかなりました。
それっぽいコードを提案してくれるんですねー、すごいです。でも、役に立たないコードも出てきます。

なので、プログラミングの知識全くないとかだとエラーに対処できないので厳しいですね。

こういうアプリを作りたい、どうやるんだろう！！？？？のとっかかり位にしかならないですね。

# そのほか
今回、ひさしぶりにVisualStudioを使ったんですが、コードの提案が素晴らしいんですよね。例えば、以下のコードなんですが、ボタンを押してファイル選択ダイアログを呼び出してその結果をテキストボックスにセットするって言う処理をしてるんですが、コードを書こうとおもって押したキー文字数は、ほんの数文字くらいです。あとはVisualStudioが勝手に提案してくれました。TABキー押すだけで入力できました。素晴らしいですね。

````
        private void buttonSelectSourceFile_Click(object sender, EventArgs e)
        {
            

            if (openSourceFileDialog.ShowDialog(this) == DialogResult.OK)
            {
                string FileName;
                FileName = openSourceFileDialog.FileName;
                textBoxSourceFileName.Text = FileName;
            }
        }
````

おわり