導入
PDFや画像に埋め込まれたテキストや図形の正確な座標(X座標・Y座標)を取得したいと思ったことはありませんか?
Webサイトのアニメーション制作、ゲーム開発、データベースへのインポート、またはアクセシビリティ向上のために座標情報を扱う場面は多岐にわたります。
しかし「座標を取得するには?」と考えたとき、複雑そうな作業に見えがちです。
この記事では、初心者の方向けに「PDF座標取得ツール」を活用した画像内座標の抜き取り方法を、まずは無料・簡単に使えるツールで始め、さらに自動化やスクリプト化まで進めるまでを体系的に解説します。
「これで座標の取得が楽になる!」という目標に向けて、ステップごとに丁寧に説明します。
1. 座標取得が必要なシーン一覧
| シーン | 目的 | 例 |
|---|---|---|
| Webページの要素配置 | デザインの再現 | スクリーンショットの座標を用いてCSSを書き直す |
| UIテスト自動化 | 位置情報でクリック | Selenium で「画像上の特定位置」をクリック |
| PDF内図形の編集 | ページレイアウト調整 | PDFBox で矩形を動かす |
| バイオメトリクス | 画像上の顔・目の位置 | マシンラーニングモデルに座標入力 |
| マップ作成 | 位置情報を座標軸に変換 | スキャン画像の座標を GeoJSON に変換 |
このように座標を取得する場面は実務でも個人プロジェクトでも広く存在します。
2. 簡単に使える座標取得ツールまとめ
ツールを選ぶ際は、以下のポイントをチェックしましょう。
| ポイント | 内容 | 推奨 |
|---|---|---|
| ユーザーインタフェース | 直感的か(GUI/CLI) | 直感的 → Adobe Acrobat / PDF-XChange |
| 無料/有料 | 予算 | 無料 → PDF-XChange Editor |
| 画像対応 | PDF 以外の画像からも取得できるか | 可能なら画像も対象 |
| カスタマイズ性 | 自動化スクリプトが書けるか | 例:Python ライブラリ |
| フォーマット | 取得結果の出力形式 | CSV , JSON , SVG |
以下では 3 つの代表的ツールを選び、その使い方を詳しく解説します。
2‑1. Adobe Acrobat Pro DC(有料)
- ① 「ツール」→「ページの編集」→「図形を描く」
- ② 描画した図形上で右クリック → 「プロパティ」
- ③ 「位置」タブで X, Y, 幅, 高さ を確認
Adobe Acrobat ならば、PDFにあるテキスト・画像・図形の座標を直接 GUI で確認できます。
無料版の Acrobat Reader では図形の座標を取得できないので注意。
2‑2. PDF-XChange Editor(無料/有料版)
- ① 「View」→「Toolbars」→「Markups Toolbar」を有効に
- ② 「Add Rectangle / Ellipse」ツールで範囲を描く
- ③ 右クリック → 「Object Properties」 →「Coordinates」タブで X, Y を確認
PDF-XChange では PDF 上の図形に対して座標情報を簡単に取得できます。無料版でも十分な機能が利用可能です。
2‑3. Pixiv もしくは ImageMagick(画像ファイル専用)
画像の座標取得はImageMagick の identify コマンドで簡単に行えます。
identify -format "size: %[width]x%[height] format: %[format]" sample.png
上記は画面全体のサイズを取得。
座標点(マウスオーバー位置など)を取得したい場合は、imagemagick の convert + スクリプトで座標リストを生成するなど、手作業で選択した点を CSV に保存する方法が一般的です。
3. PDF 画像内座標を自動で取得する手順(Python で実装)
PDF 内の画像から座標を自動で抜き取る場合は、Python の PyMuPDF(または fitz)を使うと便利です。以下に、簡単なスクリプトの例を示します。
3‑1. 必要なパッケージのインストール
pip install pymupdf pillow
- PyMuPDF は PDF パーサー、Pillow は画像処理ライブラリ
3‑2. PDF 内に埋め込まれた画像を抽出
import fitz # PyMuPDF
from pathlib import Path
pdf_path = Path("sample.pdf")
out_dir = Path("images")
out_dir.mkdir(exist_ok=True)
doc = fitz.open(pdf_path)
for page_num in range(len(doc)):
page = doc[page_num]
images = page.get_images(full=True)
for img_index, img in enumerate(images):
xref = img[0]
base_image = doc.extract_image(xref)
image_bytes = base_image["image"]
image_ext = base_image["ext"]
image_filename = out_dir / f"page{page_num+1}_img{img_index+1}.{image_ext}"
with open(image_filename, "wb") as f:
f.write(image_bytes)
print(f"Saved {image_filename}")
- このスクリプトは PDF から全画像を抜き出し、
images/フォルダに保存します。
3‑3. 画像内座標を取得(マウスポインタ位置を手入力)
以下の例では、Tkinter を使って簡易 GUI で画像を表示し、クリック位置を取得します。
import tkinter as tk
from PIL import Image, ImageTk
class ImageSelector(tk.Tk):
def __init__(self, image_path):
super().__init__()
self.title("画像座標取得ツール")
self.img = Image.open(image_path)
self.tk_img = ImageTk.PhotoImage(self.img)
self.canvas = tk.Canvas(self, width=self.img.width, height=self.img.height)
self.canvas.pack()
self.canvas.create_image(0, 0, anchor="nw", image=self.tk_img)
self.canvas.bind("<Button-1>", self.on_click)
self.coords = []
def on_click(self, event):
x, y = event.x, event.y
print(f"Clicked at: X={x}, Y={y}")
self.coords.append((x, y))
# 追加でサークルで描画
r = 3
self.canvas.create_oval(x - r, y - r, x + r, y + r, outline="red")
if __name__ == "__main__":
img_path = "images/page1_img1.png"
app = ImageSelector(img_path)
app.mainloop()
- 右クリックで座標がコンソールに出力され、クリック領域に赤いサークルが描画されます。
- 複数点を取得したいときは、取得済み座標を CSV に保存しておくと後で Excel へ貼り付けやデータ加工が容易です。
3‑4. 複数画像に自動で座標を取得
- 画像を抽出 ->
images/フォルダに保存 - 画像ごとに上記 Tkinter スクリプトを実行(スクリプト側でフォルダ内の全画像を loop するように改造)
- クリック結果は CSV に書き込み、座標をまとめる
こうすることで、PDF から抽出した複数画像の座標を一括で取得できます。
4. 画像の座標を画像の物理サイズとリンクさせる
画像に対する座標はピクセル単位で取得されますが、実際に Web ページや CAD で利用するには、画像の物理サイズ(インチやミリメートル)と結びつける必要があります。以下の手順でピクセル座標を実際の単位に変換できます。
| ステップ | 内容 |
|---|---|
| ① 画像 DPI を確認 | PNG/JPEG のメタデータに DPI が書かれていることが多い |
| ② 画像サイズを取得 | Pillow の image.size で幅・高さ (ピクセル) |
| ③ 物理サイズ (inch) を算出 | ピクセル数 / DPI |
| ④ 必要単位へ変換 | inch * 2.54 = cm など |
Python 例(画像の DPI を取得して cm に変換)
from PIL import Image
img = Image.open("image.png")
width_px, height_px = img.size
dpi = img.info.get("dpi", (72, 72)) # 省略時は 72DPI が標準
print(f"DPI: {dpi}")
width_in = width_px / dpi[0]
height_in = height_px / dpi[1]
width_cm = width_in * 2.54
height_cm = height_in * 2.54
print(f"物理サイズ: {width_cm:.2f}cm x {height_cm:.2f}cm")
取得したピクセル座標を width_cm / width_px の比率で倍率し、実際の長さを算出します。
5. よくあるトラブルと解決策
| 問題 | 原因 | 対策 |
|---|---|---|
| ①「ツールで座標が表示されない」 | PDF に図形が描画されていない | PDF を「編集モード」または「図形モード」で再確認 |
| ②「画像のクリック位置がズレる」 | 画像と Canvas のサイズが一致していない | canvas.config(width=img.width, height=img.height) を必ず設定 |
| ③「取得した座標が負数になる」 | 画像にオフセットがある | canvas.moveto(-offset_x, -offset_y) で調整 |
| ④「DPI が取得できない」 | 画像に DPI メタデータが埋め込まれていない | 画像を再エンコード時に DPI を指定して保存 |
| ⑤「大量の画像で処理が遅い」 | 画像サイズが大きい | 画像をリサイズして一時ファイルに保存 |
| ⑥「PDF の画像が埋め込まれていない(リンクだけ)」 | PDF がリンクイメージを用いている | fitz.Document の extract_image はリンクを無視するため、リンク先の画像にアクセスする必要 |
| ⑦「Python スクリプト実行時に MemoryError」 | 画像が多すぎる | バッチ処理に分割し、処理後はメモリを解放 ( del img など) |
トラブルシューティングの際は、まず最初に何が取得できているかを確認することが大切です。
- PyMuPDF の
get_images()で取得したxrefが正しいか - 画像のパスやバイナリが正しいか
- マウス座標が正しく Canvas と一致しているか
6. まとめと今後の展開アイデア
今回紹介したツールとスクリプトを組み合わせることで、PDF 内画像の座標抽出は初心者でも手軽に実施できます。
ここからさらに次のレベルへ進めるためにオススメするアイデアをまとめました。
| 項目 | 内容 |
|---|---|
| ① 自動化ワークフローの構築 | GitHub Actions + Python スクリプトで毎回新しい PDF を処理 |
| ② データベース化 | 取得した座標を SQLite/CSV/JSON に保存し、検索や分析できるように |
| ③ アプリ化 | Tkinter で作った簡易 GUI を PyInstaller で実行ファイル化(Windows 版) |
| ④ AI と連携 | Google Vision API 等で画像内オブジェクト自動検出し、座標を取得 |
| ⑤ Web ベースツール | JavaScript + HTML5 Canvas でブラウザ上から座標取得(サーバーサイド処理は Python) |
| ⑥ スクリーンショットの座標自動取得 | Selenium の execute_script("return arguments[0].getBoundingClientRect();") で Web 要素座標取得 |
| ⑦ 座標情報を可視化 | Matplotlib で座標点を散布図として可視化し、データの分布を確認 |
どの方向へ展開するかはプロジェクトの要件次第です。
基本的な座標取得のスキルを身につければ、より高度な自動化やデータ分析へと自然に進むことができます。
おわりに
「PDF内画像の座標を取得したい!」という願いは、まずはツールの選択と基本操作の習得から。
この記事で紹介した 3 つのツールと Python スクリプトを組み合わせれば、初心者でも数分で画像の座標を抜き取れます。
ぜひ試してみてください。 そして、得られた座標データをさらに発展させたプロセスに取り入れ、作業効率化を図りましょう。


コメント