PythonでPDF文書を生成する

PDF（Portable Document Format）は、クロスプラットフォーム互換性、忠実性、セキュリティ、双方向性を備えた、一般的に使用されている文書フォーマットです。私たちの日常業務における契約書、報告書、論文などは、異なるオペレーティング・システム（Windows、Mac、Linuxなど）やデバイスで閲覧しても一貫した外観を維持できるように、通常PDF形式になっています。

Pythonは効率的でシンプルなプログラミング言語です。Pythonを使ってPDF文書を扱うことで、オフィスの自動化を実現し、作業効率を向上させることができます。今回は、**Pythonを使ってPDF文書を作成し、画像を挿入する方法**を紹介します。

## Pythonライブラリのインストール
この記事では、[**Spire.PDF for Python**](https://www.e-iceblue.com/Introduce/pdf-for-python.html)ライブラリを使用します。このサードパーティのPythonライブラリは完全に独立しており、PythonアプリケーションでPDFを作成、読み込み、編集、変換、保存することができます。
**pipコマンド：**
>pip install Spire.PDF

Spire.PDF for Pythonパッケージをダウンロードして、ローカルパスから手動でインストールすることもできます。

https://www.e-iceblue.com/Download/Spire-PDF-Python.html


## Python - PDFドキュメントの生成と画像の挿入
Spire.PDF for Pythonは、PDF文書へのテキスト、画像、図形、リンク、フォームフィールドの追加をサポートしています。以下は、テキストと画像を含む単純なPDF文書を作成する方法の例です：

1. `PdfDocument` オブジェクトを作成します。
1. `PdfDocument.Pages.Add()` メソッドを使用して、指定したサイズと余白のページを追加します。
1. ブラシやフォントを作成し、テキストの配置を設定します。
1. **`PdfPageBase.Canvas.DrawString()`** メソッドを使用して、ページ上の指定した座標に文字列を描画します。
1. 文書内容を含む TXT ファイルを読み込み、それを保持する PdfTextWidget オブジェクトを作成します。(**`PdfTextWidget`** クラスは、複数ページにまたがるテキストエリアを表します)
1. **`PdfTextWidget.Draw()`** メソッドを使用して、ページ上の指定された位置にドキュメントコンテンツを描画します。
1. 画像を読み込んでサイズを指定し、**`PdfPageBase.Canvas.DrawImage()`** メソッドを使用してページ上の指定した位置に画像を描画します。
1. `PdfDocument.SaveToFile()` メソッドを使用して結果ドキュメントを保存します。

> Pythonのコード:
```python
from spire.pdf.common import *
from spire.pdf import *
 
def ReadFromTxt(fname: str) -> str:
    with open(fname, 'r', encoding='utf-8') as f:
        text = f.read()
    return text
 
# PDFドキュメントの作成
pdf = PdfDocument()
 
# ページを追加する
page = pdf.Pages.Add(PdfPageSize.A4(), PdfMargins(20.0, 20.0))
 
# タイトルテキストを指定する
titleText = "クラゲってどんな生きもの？"
 
# ベタ塗りブラシの作成
titleBrush = PdfSolidBrush(PdfRGBColor(Color.get_MediumBlue()))
paraBrush = PdfSolidBrush(PdfRGBColor(Color.get_Black()))
 
# トゥルータイプフォントの作成
titleFont = PdfTrueTypeFont("Yu Mincho", 15.0, PdfFontStyle.Bold, True)
paraFont = PdfTrueTypeFont("Yu Mincho", 11.0, PdfFontStyle.Regular, True)
 
# テキスト配置の設定
textAlignment = PdfStringFormat(PdfTextAlignment.Center, PdfVerticalAlignment.Middle)
 
# ページの中央にタイトルを描く
page.Canvas.DrawString(titleText, titleFont, titleBrush, page.Canvas.ClientSize.Width / 2, 35.0, textAlignment)
 
# TXTファイルから文書の内容を取得する
paraText = ReadFromTxt("content.txt")
 
# ドキュメントの内容を保持するPdfTextWidgetオブジェクトを作成する
textWidget = PdfTextWidget(paraText, paraFont, paraBrush)
 
# 文書の内容を描画する矩形領域を指定する
rect = RectangleF(PointF(0.0, 52.0), page.Canvas.ClientSize)
 
# PdfLayoutType を Paginate に設定して、コンテンツの自動ページングを有効にします
textLayout = PdfTextLayout()
textLayout.Layout = PdfLayoutType.Paginate
 
# 文書の内容をページに描く
textWidget.Draw(page, rect, textLayout)
 
# 画像を読み込む
image = PdfImage.FromFile("jellyfish.png")
 
# 画像サイズの指定
width = image.Width * 0.75
height = image.Height * 0.75
 
# ページ上の指定した位置に画像を描画します
x = (page.Canvas.ClientSize.Width - width) / 2
y = 280.0
page.Canvas.DrawImage(image, x, y, width, height)
 
# 結果ファイルの保存
pdf.SaveToFile("GeneratePDF.pdf")
```

***生成されたPDFファイル：***
![GeneratePdfDocument.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/e99537ff-92ae-e494-255f-d664184ad9ba.png)
* * *

:point_right: ウォーターマークを削除するための無料トライアルライセンスをリクエストする。

https://www.e-iceblue.com/TemLicense.html