広告/統計/アニメ/映画 等に関するブログ

広告/統計/アニメ/映画 等に関するブログ

Pythonで画像をA4比率のPDFに分割する

Webサイトのキャプチャはchromeデベロッパーツールから撮ることができるが、PNGなどの画像ファイルになる。しかし、 PC上で部分的に拡大するにはPDF形式の方が扱いやすいし、紙に出力するのであればA4比率のPDFに分割できた方が便利である。

事前準備

img2pdfとPILを使用する必要がある。以下のサイトを参考にした。(主に1つめ)

laboratory.kazuuu.net

self-development.info

kapibara-sos.net

コード

必要なライブラリのインポート

import img2pdf
from PIL import Image

ファイルの読み込み

いくつもの画像ファイルを変換する必要があるのであるならば、ファイル名を自動で取得し、同じファイル名を使って出力するようにするとよい。コードに直接ファイル名を記述するのは面倒である。

import glob

例えば、inputというフォルダに画像ファイルを入れる想定だと以下のようにファイル名を取得すればよい。

files = glob.glob("./input/*")
for file in files:
    print(file)

A4サイズで分ける

各ファイルについて同じ動作を繰り替えすfor文構文にする。

PILのImage関数は画像サイズを取得できる

note.nkmk.me

横の長さを取得し、A4サイズの比率(210mm x 297mm)を掛ければA4サイズ比率の縦の長さを求められる。ここでは、image_heightとした。

複数枚に分割しそれぞれをPDFにするため、その作業を何回繰り返す必要があるのか、画像の縦の長さをimage_heightで割って、商を求めてプラス1しておくことで求めておく。image_numsとした。

また、吐き出すフォルダ名をoutputとしておき、ファイル名も文字列変換でpngをpdfに、inputフォルダをoutputフォルダにしておけば、同じファイル名で吐き出せる。分割回数をファイル名に"_"などで加えておくとよい。

画像をA4比率で切り抜くにはcrop関数を使う。開始する縦の位置をposとして、繰り返しごとにimage_height分の高さを加えていけばよい。また、切り抜きの終了の縦の位置についてはpos+image_heightだけでも良いが、最後の1枚に余白を残したくなければ、下記のコードのように(「pos+image_height <= image_original.size[1]」)元の画像の長さ以下かそうでないかを判定し、最後の1枚の終了位置を元の画像の高さと同じにしておけば余白はでない。

for file in files:
    image_original = Image.open(file)
    image_original = image_original.convert("RGB")
    image_width = image_original.size[0]
    image_height = round(image_width/210*297,-3)
    image_nums = int(image_original.size[1] // image_height) + 1
    
    filename = file.replace(".png","")
    filename = filename.replace("input","output")

    pos = 0
    for i in range(image_nums):
        if pos+image_height <= image_original.size[1]:
            image_part = image_original.crop((0,pos,image_width,pos+image_height))
        else:
            image_part = image_original.crop((0,pos,image_width,image_original.size[1]))
        image_part_filename = filename + "_" + "{0:03d}".format(i) + ".pdf"
        image_part.save(image_part_filename)
        pos += image_height