概要
このブログでは、Pythonといくつかの追加ライブラリを使ってPDFビュアーを作成する方法を詳細に解説します。特に、ドラッグアンドドロップ機能、ページナビゲーション、マウスカーソルの座標表示、ファイル選択ダイアログを使用してPDFのページサイズに合わせてウィンドウサイズを自動調整する機能までを備えたアプリケーションの作成を目指します。
使用例
このPDFビュアーは、教育資料や業務報告書など、さまざまなPDFファイルを視覚的にナビゲートするためのツールとして利用可能です。ユーザーはファイルをアプリケーションにドラッグアンドドロップするだけでなく、ファイルダイアログを使用してPDFを開くことができ、ページごとに詳細なビューを得ることができます。また、マウスカーソルの座標をリアルタイムで確認できるため、デザイン作業やドキュメントのレビュー時に便利です。
必要なPythonライブラリとインストール方法
このプロジェクトには以下のライブラリが必要です:
tkinter
: Pythonの標準GUIツールキット。PyMuPDF
(別名fitz
): PDFファイルを操作するためのライブラリ。TkinterDnD2
: ドラッグアンドドロップ機能を実装するためのライブラリ。
これらのライブラリのインストール方法は以下の通りです:
pip install pymupdf
pip install tkinterdnd2
使用手順
- 上記のライブラリをインストールします。
- 提供されたコードをPythonスクリプトとして保存し、実行します。
- PDFファイルをウィンドウにドラッグアンドドロップするか、「Open File」ボタンをクリックしてファイルを選択し、PDFを表示します。
- 画面下部に表示されるナビゲーションボタンを使用して、ページ間を移動します。
注意点
- PDFファイルのパスに特殊文字が含まれている場合、エラーが発生する可能性があります。これを避けるために、ファイルパスを適切に処理する必要があります。
- 一部のPDFファイルでは、保護されているために読み込みができないことがあります。これらのファイルは事前に保護解除が必要です。
プログラム
下記のコードをメモ帳などに丸々コピーしてPythonファイル(〇〇.py
)にしてください。
import tkinter as tk
from tkinter import filedialog
from tkinterdnd2 import DND_FILES, TkinterDnD
import fitz # PyMuPDF (別名fitz)
class PDFViewer:
def __init__(self, root):
self.root = root
self.doc = None
self.current_page = 0
self.total_pages = 0
self.label = tk.Label(root)
self.label.pack(fill=tk.BOTH, expand=True)
# ナビゲーションボタンとファイル選択ボタン
btn_frame = tk.Frame(root)
btn_frame.pack(fill=tk.X)
self.prev_btn = tk.Button(btn_frame, text="<< Previous", command=self.prev_page)
self.prev_btn.pack(side=tk.LEFT)
self.next_btn = tk.Button(btn_frame, text="Next >>", command=self.next_page)
self.next_btn.pack(side=tk.RIGHT)
open_btn = tk.Button(btn_frame, text="Open File", command=self.open_file_dialog)
open_btn.pack(side=tk.LEFT)
# ファイルパス表示用ラベル
self.file_path_label = tk.Label(root, text="No file selected")
self.file_path_label.pack(side=tk.TOP)
# 座標表示用ラベル
self.coord_label = tk.Label(root, text="X: 0, Y: 0")
self.coord_label.pack(side=tk.BOTTOM)
self.label.bind('<Motion>', self.mouse_move) # マウス移動イベントをバインド
root.drop_target_register(DND_FILES)
root.dnd_bind('<<Drop>>', self.drop)
def open_file_dialog(self):
file_path = filedialog.askopenfilename(filetypes=[("PDF files", "*.pdf")])
if file_path:
self.file_path_label.config(text=f"Selected file: {file_path}")
self.open_pdf(file_path)
def open_pdf(self, path):
self.doc = fitz.open(path)
self.total_pages = len(self.doc)
self.current_page = 0
self.show_page(self.current_page)
def show_page(self, page_num):
page = self.doc.load_page(page_num)
pix = page.get_pixmap()
img = tk.PhotoImage(data=pix.tobytes("ppm"))
self.label.config(image=img)
self.label.image = img
# ウィンドウサイズをページサイズに合わせる
width, height = pix.width, pix.height
self.root.geometry(f"{width}x{height + 100}") # 100ピクセルはボタンとラベルのための追加スペース
def prev_page(self):
if self.current_page > 0:
self.current_page -= 1
self.show_page(self.current_page)
def next_page(self):
if self.current_page < self.total_pages - 1:
self.current_page += 1
self.show_page(self.current_page)
def mouse_move(self, event):
# ラベルに座標を表示
self.coord_label.config(text=f"X: {event.x}, Y: {event.y}")
def drop(self, event):
file_path = event.data
file_path = file_path.strip('\'"') # 引用符を取り除く
self.file_path_label.config(text=f"Selected file: {file_path}")
if file_path.endswith('.pdf'):
self.open_pdf(file_path)
root = TkinterDnD.Tk()
root.title('PDF Viewer')
app = PDFViewer(root)
root.mainloop()
あるいは、下のテキストファイルをダウンロードし、「.txt」を「.py」に変えることでそのまま使えます。
pdf-viewerくんv1
まとめ
このブログでは、Pythonを使用して機能豊富なPDFビュアーを開発する方法を紹介しました。GUI操作により、ユーザーフレンドリーで直感的なPDF管理ツールを簡単に作成できます。このツールは、教育、ビジネス、研究など多岐にわたる分野での文書管理とレビューに役立つでしょう。