ChatGPTでお手軽コーディング：PDFに透かしを入れるコードを教えてください！

# はじめに
## ChatGPTが盛り上がっています！
ここ最近、複数の企業においてChatGPTに関連した新たなサービスが展開されたり、農林水産省や横須賀市においても活用が始まるということでテレビなどで取り上げられたりすることも増え、一気に浸透してきた感があります。
ネットを眺めているとChatGPTに色々なキャラクターを演じさせるなどエンタメ的な事例も多数紹介されていますが、ここではQiitaらしく技術的な方向で試してみたいと思います。
ChatGPTを活用したコーディングの雰囲気が多少なりとも伝われば幸いです。

## 本記事のゴール
本記事ではChatGPTに次の機能を持った3本のPythonのコードを書いてもらいます。
1. PDFに透かし(ウォーターマーク)を入れる
1. 透かし用のPDFを生成する
1. 透かしを入れる元のPDF(テスト用)を生成する

この3本のコードを実行することにより、下図に示す"CONFIDENTIAL"という透かしが入ったPDFができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2741318/cb5ae323-65af-4d7c-865b-6425dff761e0.png)

なお、これからChatGPTを使い始めるという方は以下のサイトにてアカウントを作成してください。
(本記事ではアカウント作成方法やAPI Keyの取得についての解説は行いません)

https://openai.com/blog/chatgpt

# ChatGPTでPythonプログラミング
**VS CodeにおけるChatGPT 利用イメージ**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2741318/9bd96946-2b1a-0ad9-3552-bf08cb4e5b6f.png)

## 環境
本記事にて使用した環境は次のとおりです。
- Visual Studio Code 1.76.2
- Python 3.9.13

### 環境についての補足
- ChatGPTのモデルは「gpt-3.5-turbo」を使用しています。
- リモートコンテナ上でコーディングしていますが、必須ではありません。
- VS Codeの拡張機能である「ChatGPT - Genie AI v0.0.8」を使用してChatGPTを使っています。ブラウザや他に使い慣れたクライアントがあればそちらをご利用ください。

https://marketplace.visualstudio.com/items?itemName=genieai.chatgpt-vscode


# ChatGPTを活用したコーディング
ChatGPTを活用したコーディングでは、ChatGPTに対して様々な質問/命令(いわゆる"プロンプト")を送ることで進めていきます。
そのため、以下ではChatGPTに対してどのようなプロンプトを送ったのか、および、それに対してChatGPTが生成したコードを記載します。

:::note info
記載するコード等について
- ChatGPTの回答にはコードの説明なども含まれますが、長くなるためそれらは割愛してコード部分を抜粋して記載しています。
- コードについてはそのままコピペして試せるようにファイル名の整合性をとるなど一部修正しています。
- コード内のコメントは**修正していません。**
- 本記事内のChatGPTに対する質問をそのまま入力しても、同じ回答が返ってくるとは限りません。
:::

## 1\. PDFに透かし(ウォーターマーク)を入れる
先ずは以下のような質問をしました。

**ChatGPTへの質問**
> PythonでPDFに透かしを入れたいです。


上述の質問に対し、ChatGPTはPythonのライブラリであるPyPDF2を利用すること、および、PyPDF2を使用して透かしを入れる以下のコードを示してくれました。
~~~python:securePdf.py
import PyPDF2

def addWatermark(input_pdf, output_pdf, watermark):
    # 入力PDFファイルをオープンする
    with open(input_pdf, 'rb') as input_file:
        # 出力PDFファイルを作成する
        with open(output_pdf, 'wb') as output_file:
            # PDFの読み込み用オブジェクトを作成する
            pdf_reader = PyPDF2.PdfFileReader(input_file)
            # PDFの書き込み用オブジェクトを作成する
            pdf_writer = PyPDF2.PdfFileWriter()

            # 透かし用のPDFを読み込む
            with open(watermark, 'rb') as watermark_file:
                watermark_reader = PyPDF2.PdfFileReader(watermark_file)
                watermark_page = watermark_reader.getPage(0)

                # 入力PDFの各ページに透かしを追加する
                for page in range(pdf_reader.getNumPages()):
                    page_obj = pdf_reader.getPage(page)
                    page_obj.mergePage(watermark_page)
                    pdf_writer.addPage(page_obj)

                # 出力PDFファイルに書き込む
                pdf_writer.write(output_file)

input_pdf = 'input.pdf'
output_pdf = 'output.pdf'
watermark = 'watermarked.pdf'
addWatermark(input_pdf, output_pdf, watermark)
~~~

:::note warn
PyPDF2のバージョンについて
ChatGPTが生成するコードは、PyPDF2 バージョン3.0.0より前のバージョン(1.x,2.x)を前提としている場合があります。そのためPyPDF2のバージョンに起因するエラーが発生した場合、バージョンを指定してインストールする必要があります。
インストール例：
pip install PyPDF2==1.28.1
:::

このコードでは透かし用のPDFファイルを別途用意する必要がありそうです。
そこで、次の質問をしました。

## 2\. 透かし用のPDFを生成する

**ChatGPTへの質問**
> 透かしとして利用するPDFファイルを生成するコードを教えて下さい。

生成されたコードは次のとおりです。
~~~python:createWaterMark.py
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas

# 透かしとして表示するテキスト
text = "Confidential"

# PDFファイルを作成
c = canvas.Canvas("watermarked.pdf", pagesize=letter)

# フォントとサイズを設定
c.setFont("Helvetica", 80)

# 文字列の色を設定
c.setFillGray(0.5, 0.5)

# 文字列を描画
width, height = letter
c.drawCentredString(width / 2, height / 2, text)

# PDFを保存
c.save()
~~~

このコードを実行すると下図に示すPDFファイルが生成できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2741318/d5b3a6a1-09e9-a5b1-3e6d-58c9fc6a1694.png)

最後に、テスト用として透かしを入れる対象のPDFファイルも生成してもらいます。

## 3\. 透かしを入れる元のPDF(テスト用)を生成する

**ChatGPTへの質問**
> テスト用のPDFを生成するPythonコードを教えて下さい。

~~~python:createPdf.py
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas

def create_pdf(title, body):
    # PDFキャンバスを作成する
    c = canvas.Canvas("input.pdf", pagesize=letter)
    
    # タイトルを描画する
    c.setFontSize(16)
    c.drawString(72, 720, title)
    
    # 本文を描画する
    c.setFontSize(12)
    textobject = c.beginText(72, 680)
    lines = body.split('\n')
    for line in lines:
        textobject.textLine(line)
    c.drawText(textobject)
    
    # PDFファイルを保存する
    c.save()

title = "Sample Document"
body = """Hello World!
This is a test document created using Python and the reportlab library.
"""
create_pdf(title, body)
~~~

このコードの実行により、下図のPDFファイルが生成できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2741318/b22b6b21-98af-bcbb-447a-bfd5b4560ea3.png)

これで透かし用と透かしを入れる対象のPDFファイルが出来たため、最初のPythonコードを実行すると、前述の**本記事のゴール**に示したPDFが生成されます。

# おわりに
ご覧いただきありがとうございました。
本記事ではPDFに透かしを入れる方法を題材に、ChatGPTがコーディングしてくれました。
ポイントとしては次のものが挙げられるかと思います。
- ChatGPTによりほぼそのまま実行できるコードが生成された(しかもコメント付き！)
- テストデータ(今回はテスト用のPDF)を作成するコードもすぐに作ってくれる。
- 人間が行う作業は、環境の用意/ChatGPTへの質問/ファイル名などについて若干のコード修正/動作確認…

従来であれば、
1. Pythonで利用可能なPDFに関するライブラリの調査
1. ライブラリの使い方を確認
1. 実装
1. テストデータ準備
1. テスト

のようなステップを踏んでいたものを、ChatGPTにより最後まで一気にショートカットできました。

ChatGPTの情報が古いことなどに起因して生成されるコードに多少問題があることもありますが、今回の内容であれば3本のコードの作成に要する時間は10分もかかっていません(質問していただけなので)。
とりあえず気軽に試せる内容かと思いますので、ご興味ありましたら先ずはChatGPTに何か尋ねてみてはいかがでしょうか。

以上、何かの参考になれば幸いです。