pythonでPDFファイル作成+複数のPDFを結合

Python
スポンサーリンク

今回はpythonを使用して、業務用プログラミングを実施してみようと思います。

内容は、pythonプログラミングを駆使して、大量の画像をpdfファイルに変換して、最後に複数のpdfファイルを1つに結合していきます。

 

1.今回の流れ

今回の流れは、まずディレクトリ内の画像を1つずつpdfファイルに変換した後、変換後のpdfファイルを結合するという流れになります。

下の図はフローのイメージ図になります。

 

2.ソースコード

import os
from PIL import Image
import img2pdf
import PyPDF2

#ディレクトリを2つに分けている理由は画像を入れるフォルダとpdfを入れるフォルダを分けるため。
path = "C://Users/Hayato/Desktop/RaspberryPiで始める機械学習"
pdf_path = "C://Users/Hayato/Desktop/RaspberryPiで始める機械学習2"
os.chdir(path)

#画像を読み込み、pdfファイルに変換
for i in os.listdir(path):
    #pdfファイルの保存名を指定
    pdf_name = pdf_path + "/" +  "PDF_" + str(i) + ".pdf"
    
    #Pillowモジュールを使用し画像の読み込み
    img = Image.open(i)
    img = img.rotate(-90, expand = True)#この部分は画像を回転させる必要がある場合のみ使用
    
    #画像→pdfファイルに変換
    cov_pdf = img2pdf.convert(i)
    
    #pdfファイルを読み込み(pdf_nameで指定したpdfがない場合、pdf_nameをファイル名として新規にpdfファイルを作成)
    file = open(pdf_name, "wb")
    #pdfファイルを書き込み
    file.write(cov_pdf)
    
    #開いているファイルを閉じる
    img.close()
    file.close()

#複数のpdfファイルを結合する
merge = PyPDF2.PdfFileMerger()
for j in os.listdir(pdf_path):
    merge.append(pdf_path + "/" + j)

merge.write(pdf_path + "/" + "RaspberryPiで始める機械学習.pdf")
merge.close()

print("変換終了")

 

 

3.ソースコード詳細

ライブラリのインポート

import os
from PIL import Image
import img2pdf
import PyPDF2

まずはライブラリのインポートです。

osモジュールはOSに依存する機能(ディレクトリ移動やファイル名取得など…)を取得するためのモジュール

Pillowモジュールはpythonの画像処理ライブラリの一種

img2pdfモジュールはpythonで画像データをpdfに変換するモジュールです。

PyPDF2モジュールは複数のPDFファイル結合・抽出して結合・PDFファイルをページごとに複数のファイルに分割するモジュール

 

ライブラリをインポートしていない人はpipを使用して、インストールしてください。

#Pillowをインストール
pip install pillow

#img2pdfをインストール
pip install img2pdf

#PyPDF2をインストール
pip install PyPDF2

 

ファイルパスの指定

path = "C://Users/User名/画像が入っているディレクトリ名"
pdf_path = "C://Users/User名/PDFを保存するディレクトリ名"

#画像の入っているディレクトリに移動
os.chdir(path)

pathには、画像が保存されているディレクトリのパスを指定してください。

pdf_pathには、これから画像を保存するディレクトリのパスを指定してください。

ディレクトリの移動はosモジュール機能を使用します。os.chdir()関数の使い方は、

os.chdir(“移動したい相対パス/絶対パス”)

 

ちなみに今回使用する画像とディレクトリを以下に表示します。

 

画像をPDF変換

#画像を読み込み、pdfファイルに変換
for i in os.listdir(path):
    #pdfファイルの保存名を指定
    pdf_name = pdf_path + "/" +  "PDF_" + str(i[0:3]) + ".pdf"
    
    #Pillowモジュールを使用し画像の読み込み
    img = Image.open(i)
    img = img.rotate(-90, expand = True)#この部分は画像を回転させる必要がある場合のみ使用
    
    #画像→pdfファイルに変換
    cov_pdf = img2pdf.convert(i)
    
    #pdfファイルを読み込み(pdf_nameで指定したpdfがない場合、pdf_nameをファイル名として新規にpdfファイルを作成)
    file = open(pdf_name, "wb")
    #pdfファイルを書き込み
    file.write(cov_pdf)
    
    #開いているファイルを閉じる
    img.close()
    file.close()

os.listdir()関数は、指定したディレクトリ内のファイル一覧を取得します。使い方は、

os.listdir(“引数:取得したいファイル名のディレクトリのパスを指定”)

In[1]: os.listdir(path)
Out[1]: ['cat_pic.jpg', 'dog1.jpg', 'inu2.jpg', 't_pic2.jpg']

このようにpathで指定したディレクトリ内のファイル名を取得できます。これをfor文を利用して1枚ずつpdfに変換しましょう。

 

img2pdf.convert()関数:画像からPDFへの変換

#画像→pdfファイルに変換
cov_pdf = img2pdf.convert(i)

画像からpdfファイルに変換で注意することは、img2pdf.convert()関数の使い方です。

img2pdf.convert(引数)

引数は必ずバイナリデータか文字データでなければなりません。画像データでもいけません。

 

#pdfファイルを読み込み
file = open(pdf_name, "wb")
#pdfファイルを書き込み
file.write(cov_pdf)

open()関数は、指定したパスのファイルが存在しなければ、指定したファイルパスで新規にファイルを作成するようになっています。

file = open(引数1:ファイルパス, 引数2:入出力方法)

引数2の入出力方法に関しては、以下の通りです。

ファイル開く説明
読み込みopen(ファイル名,"rb")ファイルを読み込み用として開く
書き込みopen(ファイル名,"wb")ファイルを書き込み用として開く

 

複数のpdfファイルを結合する

merge = PyPDF2.PdfFileMerger()
for j in os.listdir(pdf_path):
    merge.append(pdf_path + "/" + j)

merge.write(pdf_path + "/" + "sample.pdf")
merge.close()

merge = PyPDF2.PdfFileMerger()でクラスのオブジェクトを作成

この関数に作成したpdfファイルを1つずつappend()関数で追加していきます。

最後に、同様にwrite()関数で書き込みをして、終了処理close()を実行してください。

最後の結果を以下に表示します。

 

4.最後に

今回は、大量の画像データをpdfファイルにして結合したい!って思い、なんとかpythonで一連のプログラムをできないかと思い挑戦しました。

皆さんの、業務効率等に繋がればいいと思います。

コメント

タイトルとURLをコピーしました