Photoruction工事中!

Photoructionの開発ブログです!

PyMuPDFでPDFを操作する①

はじめに

こんにちは、株式会社フォトラクションでエンジニアをしています酒井です。

自分のチームではPDFを扱うことが多く、これらを PyMuPDF と呼ばれるPythonのライブラリを用いて操作しています。

Pythonには他にも PyPDF2PDFminer など様々なPDF操作用のライブラリがありますが、日本語への対応や実装されている関数の多さ、ドキュメントの読みやすさ等をふまえ、弊社では PyMuPDFを使用しています。(参考: PyMuPDFドキュメント

今回はPyMuPDFで可能となる操作をいくつか紹介したいと思います。

1. 画像変換(pdf ⇒ ndarray)

import io

import cv2
import fitz
import numpy as np
from PIL import Image

# PDFファイルパスの読み込み
pdf_path = input()

# 1ページ目の要素を取得
document = fitz.open(pdf_path)
page = document[0]

# 拡大度を指定
zoom = 3.0

# pixmapを取得
matrix = fitz.Matrix(zoom, zoom)
pixmap = page.get_pixmap(matrix=matrix)

# pillowでpng形式のバイトオブジェクトを取得
byte = pixmap.pil_tobytes("png")

# PIL画像を取得
binary = io.BytesIO(byte)
pil_img = Image.open(binary)

# PIL画像をNumPy配列の画像に変換
ndarray_img = np.array(pil_img)

# BGR -> RGB
ndarray_img = cv2.cvtColor(ndarray_img, cv2.COLOR_BGR2RGB)

2. 注釈取得

# PDFファイルパスの読み込み
pdf_path = input()

# 1ページ目の要素を取得
document = fitz.open(pdf_path)
page = document[0]

# 注釈情報を取得
annotations = page.annots()

3. PDFサイズの取得

# PDFファイルパスの読み込み
pdf_path = input()

# 1ページ目の要素を取得
document = fitz.open(pdf_path)
page = document[0]

pdf_width, pdf_height = page.rect.width, page.rect.height

最後に

PyMuPDFを使えば、他にも「ページの分割」や「注釈の設定」等様々な操作が可能となります。

よかったら使ってみてください。

参考

Introduction - PyMuPDF 1.21.0 documentation

株式会社フォトラクションでは一緒に働く仲間を募集しています