提案書やカタログを PDF で受け取ったとき、その一部を画像として使いたい場面があります。Web ページのアイキャッチ、社内チャットへの貼り付け、資料のサムネイル——PDF のままでは扱いにくいところで、画像があると話が早く進みます。
本記事では、Spire.PDF for Python で PDF のページを画像にする手順を紹介します。1 ページずつ PNG に書き出す基本形から、背景を透明にする、ページの一部だけを切り出す、SVG のベクター形式で書き出すところまで、実際の出力を見ながら進めます。
クイックナビゲーション
PDF を画像にする 3 つの方法
Spire.PDF for Python では、PdfDocument.SaveAsImage() で 1 ページ分の画像を取得し、Save() でファイルに書き出します。用途に応じて、次の 3 通りの使い方ができます。
| 方法 | 出力される画像 | 向いている用途 |
|---|---|---|
| そのまま書き出す | ページ全体(余白を含む) | サムネイル、資料のページ画像 |
| 背景を透明にする | ページ全体+透過の背景 | 資料や Web ページに重ねる |
| 切り出して書き出す | 指定した矩形の範囲 | 表や図だけを抜き出す |
これに加えて、SaveToFile() に FileFormat.SVG を指定すると、ページをベクター形式で書き出せます。文字と図形がそのまま残るため、拡大しても輪郭が崩れません。
画像の大きさは、ページサイズと解像度で決まります。既定は 96 dpi 相当で、A4 のページは 794 × 1,123 ピクセルです。SaveAsImage() に解像度を渡すと 300 dpi などの高精細な画像も書き出せ、A4 で 2,481 × 3,508 ピクセルになります。ページの一部だけを切り出すと、その範囲と解像度に応じた大きさの画像になります。
実行環境とサンプル PDF
pip install spire.pdf
スクリプトでは、spire.pdf から必要なクラスを読み込みます。座標を表す RectangleF もここに含まれています。
import os
from spire.pdf import *
サンプルには、A4・2 ページの提案書を用意しました。
| ページ | 内容 |
|---|---|
| 1 ページ目 | タイトル帯、提案の概要、機種一覧の表、導入効果 |
| 2 ページ目 | 導入スケジュールの表、お見積り条件 |
1 ページ目の機種一覧は「機種・主な用途・台数・月額」の 4 列で、見出し行が濃紺、明細行が交互に色分けされています。切り出しの節では、この表の範囲だけを画像にします。
ページを PNG 画像として書き出す
まずは、すべてのページを PNG として書き出します。SaveAsImage() の引数はページ番号で、0 から始まる点に注意してください。
import os
from spire.pdf import *
os.makedirs("output/images", exist_ok=True)
# PDF を読み込む
pdf = PdfDocument()
pdf.LoadFromFile("製品導入提案書.pdf")
pages = pdf.Pages.Count
# 1 ページずつ画像として保存する
for i in range(pages):
with pdf.SaveAsImage(i) as image:
name = f"PageImage_{i + 1}.png"
path = os.path.join("output/images", name)
image.Save(path)
print("保存しました:", name, os.path.getsize(path), "bytes")
pdf.Close()
print("ページ数:", pages)
SaveAsImage() は画像のストリームを返すので、with で受け取って Save() に渡します。ファイル名は 1 ページ目が PageImage_1.png になるよう、ループの添字に 1 を足しています。
変換前の PDF と、書き出した 1 ページ目の画像を並べると次のようになります。

このスクリプトを pdf_to_image.py として保存して実行すると、保存したファイル名とサイズが表示されます。

2 ページの PDF から 2 枚の PNG ができました。ページ番号は 0 始まりなので、range(pdf.Pages.Count) で全ページを回り、保存するファイル名だけ 1 始まりに揃えると扱いやすくなります。
解像度(DPI)を指定する
SaveAsImage() の 2 番目と 3 番目の引数には、X 方向・Y 方向の解像度を指定できます。省略した場合は 96 dpi 相当で書き出されます。
import os
from spire.pdf import *
os.makedirs("output/images", exist_ok=True)
pdf = PdfDocument()
pdf.LoadFromFile("製品導入提案書.pdf")
# 300 dpi で書き出す
with pdf.SaveAsImage(0, 300, 300) as image:
image.Save("output/images/PageImage_300dpi.png")
pdf.Close()
print("保存しました: output/images/PageImage_300dpi.png")
A4 のページは、既定の 96 dpi で 794 × 1,123 ピクセル、300 dpi で 2,481 × 3,508 ピクセルになります。印刷や拡大表示に耐える画像が必要なときは 300 dpi、Web のサムネイルなら 96〜150 dpi が目安です。

同じ範囲を同じ大きさで表示すると、300 dpi のほうが文字の輪郭が滑らかになります。解像度は CropBox と組み合わせることもでき、切り出した範囲をその解像度で書き出します。
背景を透明にする
画像を資料や Web ページの上に重ねると、白い背景が四角い枠として見えてしまうことがあります。ConvertOptions.SetPdfToImageOptions() にアルファ値を渡すと、背景を透明にした PNG を書き出せます。
import os
from spire.pdf import *
os.makedirs("output/images", exist_ok=True)
pdf = PdfDocument()
pdf.LoadFromFile("製品導入提案書.pdf")
# 背景のアルファ値を 0 にする(0 = 完全に透明、255 = 不透明)
pdf.ConvertOptions.SetPdfToImageOptions(0)
for i in range(pdf.Pages.Count):
with pdf.SaveAsImage(i) as image:
image.Save(f"output/images/Transparent_{i + 1}.png")
pdf.Close()
print("保存しました: output/images/Transparent_*.png")
アルファ値は 0〜255 の範囲で指定します。0 にすると背景が完全に透明になり、128 のような中間の値にすると半透明の背景になります。文字や図形はそのままの濃さで描かれるため、背景だけが抜けた状態の PNG ができます。

透明にした背景の上に色を敷くと、元の白い余白は消え、文字と表だけが残ります。透過は PNG のアルファチャンネルで表現されるため、背景を活かしたい場面では PNG で保存します。
ページの一部だけを画像にする
ページ全体ではなく、表や図だけを取り出したい場合は、CropBox でページの表示領域を絞ってから画像にします。
import os
from spire.pdf import *
os.makedirs("output/images", exist_ok=True)
pdf = PdfDocument()
pdf.LoadFromFile("製品導入提案書.pdf")
# 1 ページ目の表示領域を、機種一覧の表がある範囲に絞る
page = pdf.Pages.get_Item(0)
page.CropBox = RectangleF(44.0, 300.0, 456.0, 200.0)
# 絞った範囲を画像として保存する
with pdf.SaveAsImage(0) as image:
image.Save("output/images/TableArea.png")
pdf.Close()
print("保存しました: output/images/TableArea.png")
CropBox に渡す RectangleF は、X 座標・Y 座標・幅・高さの順です。座標の原点はページの左上で、単位はポイント(1/72 インチ)です。A4 のページは 595 × 842 ポイントなので、上の指定は「左から 44、上から 300 の位置から、幅 456・高さ 200 の範囲」を意味します。

切り出した画像は 608 × 267 ピクセルで、見出しと表だけが入った状態になりました。範囲は「表の見出し行の少し上」から「最終行の下」までを含むように決めると、余白のバランスが取れます。座標を決めるときは、PDF を表示して目的の位置を確認しながら、上下左右を少しずつ調整すると早く合います。
SVG として書き出す
図や表を拡大しても崩れない形で残したい場合は、SVG への書き出しが向いています。SaveToFile() に FileFormat.SVG を指定します。
import os
from spire.pdf import *
os.makedirs("output/svg", exist_ok=True)
pdf = PdfDocument()
pdf.LoadFromFile("製品導入提案書.pdf")
# ページごとに SVG ファイルとして書き出す
pdf.SaveToFile("output/svg/提案書.svg", FileFormat.SVG)
pdf.Close()
print("保存しました:", sorted(os.listdir("output/svg")))
指定したファイル名をもとに、ページごとの SVG が作成されます。2 ページの PDF なら 提案書_1.svg と 提案書_2.svg の 2 ファイルができ、番号は 1 始まりです。

SVG では文字がテキストのまま残り、フォントもファイル内に埋め込まれます。ブラウザで開いて拡大しても輪郭が滑らかなのは、ラスタ画像との大きな違いです。PNG は写真や複雑なグラデーション、SVG は表・図・文字が多いページ、というように使い分けると扱いやすくなります。逆方向の変換は Python で SVG ファイルを PDF 形式に変換・保存する方法 で解説しています。
まとめ
本記事では、Spire.PDF for Python で PDF を画像に変換する方法を紹介しました。
- ページ画像を書き出す —
SaveAsImage()で 1 ページ分のストリームを取得し、Save()で PNG として保存します。解像度は 2 番目・3 番目の引数で指定できます。 - 背景を透明にする —
SetPdfToImageOptions(0)で背景が透過した PNG になります。 - 一部を切り出す —
CropBoxにRectangleF(左, 上, 幅, 高さ)を指定します。 - SVG で書き出す —
SaveToFile()にFileFormat.SVGを指定すると、ページごとの SVG ができます。
ページ番号を変えれば任意のページを画像にできるので、サムネイル生成やページプレビューの処理にもそのまま組み込めます。TIFF 形式の扱いは Python で PDF と TIFF を相互変換 で解説しています。全機能を評価したい場合は、30 日間の無料ライセンスを申請 できます。
FAQ
特定のページだけを画像にできますか?
SaveAsImage() に渡すページ番号を変えるだけです。たとえば 1〜3 ページ目だけを画像にする場合は、for i in range(3): のようにループの範囲を絞ります。ページ番号は 0 始まりなので、3 ページ目は 2 を指定します。
複数の PDF をまとめて画像にできますか?
できます。ファイルパスのリストを用意し、PDF を読み込んでページ数だけループする処理を、リストの件数分繰り返します。保存先のフォルダを PDF のファイル名ごとに分けておくと、後から見分けやすくなります。
パスワードで保護された PDF も画像にできますか?
LoadFromFile() の 2 番目の引数にパスワードを渡すと読み込めます。
pdf = PdfDocument()
pdf.LoadFromFile("protected.pdf", "password")
画像の解像度は変えられますか?
変えられます。SaveAsImage(ページ番号, X 方向の dpi, Y 方向の dpi) のように解像度を渡します。省略すると 96 dpi 相当で、A4 のページは 794 × 1,123 ピクセル、300 dpi を指定すると 2,481 × 3,508 ピクセルになります。
透過した背景はどの形式で保存すればよいですか?
PNG で保存します。PNG はアルファチャンネルを持つため、背景の透明さがそのまま保たれます。資料の上に重ねる、アイキャッチを作る、といった用途に向いています。
PDF に埋め込まれた画像だけを取り出せますか?
ページを画像にするのではなく、PDF の中の画像をそのまま取り出す方法は PythonでPDFから画像を抽出する完全ガイド で解説しています。ページ全体を画像にしたい場合は、本記事の SaveAsImage() を使います。






