# ■■■ スキャンで生成されたpdfファイルの各ページから画像抽出、QRコード内容名のpdfファイルにする。
# ■■■ ファイルパスはWindows形式、Desktop上での操作にしてある。●●のところを適宜修正されたし。
# ■手順1 初期設定
# ■手順2 PDFのコピーを保存する
# ■手順3 コピーされたPDFのページ数を得る
# ■手順4 PDF各ページのJPEG画像を抽出する
# ■手順5 JPEG画像にあるQRコードを読む。各ページで一番左上にあるQRコードがリストの最初になる
# ■手順6 コピーしたPDFのファイル名を「1つ目のQRコード内容&PDFページ数」に変更する


# ■手順1 初期設定

# pip install PyPDF4
# pip install 
# pip install pyzbar
# input

from PyPDF4 import PdfFileReader
from PIL import Image
import shutil
import pyzbar.pyzbar
#import cv2 #CV2では各ページにQRコード複数あるとデータが読めない。かわりにpyzbarを使う。


# ■手順2 PDFのコピーを保存する

# 画像抽出用PDFを取得(バイナリモード)
name_dir_pdf = "C:/Users/●●/Desktop/"
name_pdf_target = "pdf_qrcode"
name_ext_file = ".pdf"
path_pdf_origin = name_dir_pdf + name_pdf_target + name_ext_file
#pdf = open("C:/Users/●●/Desktop/pdf_qrcode.pdf", 'rb')

#もとのPDFをコピー保存する
path_pdf_copy = name_dir_pdf + name_pdf_target + "_copy" + name_ext_file
path_old = path_pdf_origin
path_new = path_pdf_copy
shutil.copyfile(path_old, path_new)
print("file copyed") 

# ■手順3 コピーされたPDFのページ数を得る

pdf = open(path_pdf_copy, 'rb')
reader = PdfFileReader(pdf)
#print("Now pdf is opened")

# Page数を取得
pgnum = reader.getNumPages() 
print("ページ数=",pgnum)


# ■手順4 PDF各ページのJPEG画像を抽出する

# Pageオブジェクトを取得・・・ドキュメントスキャナC4473の場合、PDFにすると、画像はJPEGになっているのでJPEGを抽出する。
name_images=[]
for i in range(pgnum):
    pg = reader.getPage(i) 

# Pageオブジェクトの探索
    if '/XObject' in pg['/Resources']:  # (1)
        xobjs = pg['/Resources']['/XObject']
        
        for key, obj in xobjs.items():
            item = obj.getObject()
            
            if item['/Subtype'] == '/Image':   # (2)
                if '/Filter' in item and item['/Filter'] == '/DCTDecode':

# PageオブジェクトからJPEGファイルのバイナリデータを取得・出力
                    data = item.getData()
                    name_image=key[1:]+".jpg"
                    img = open(name_image, 'wb')
                    #print(i,name_image)
                    name_images.append(name_image) #リストへの要素追加は()でくくる!
                    img.write(data)
                    img.close()

pdf.close()
print("pdf was closed")

# ■手順5 JPEG画像にあるQRコードを読む。各ページで一番左上にあるQRコードがリストの最初になる

data_qrcodes = []
for name_image in name_images:
    qr = pyzbar.pyzbar.decode(Image.open(name_image))
    #print(qr)
    num_qr = len(qr)
    print(name_image,"に含まれるQRコードの数は",num_qr,"です。")
    for i in range(0,num_qr):
        data_qrcode = qr[i].data.decode()
        #print(data_qrcode)
        data_qrcodes.append(data_qrcode)
print(data_qrcodes)

# ■手順6 コピーしたPDFのファイル名を「1つ目のQRコード内容&PDFページ数」に変更する

name_pdf_destination = data_qrcodes[0] + "_" + str(pgnum) + "pages"
path_pdf_destination = name_dir_pdf + name_pdf_destination + name_ext_file
res = shutil.move(path_pdf_copy, path_pdf_destination)
print("ファイル名:",path_pdf_destination,"が保存されました")