2017年08月15日

楽天BooksのISBNデータを用いてPythonによるPDFファイル名の変換

結構前に本があふれて困っているという話をしましたが、売却するのではなく手元にデータだけでも残しておきたい本は「ScanSnapとかで自分でSCANをする」or「BOOKSCANなどの業者に頼む」などの対応が必要となります。実はS1500は持っているのですがSCAN後のPDFデータのDefaultの名前は日時が割り当てられますし、BOOKSCANでもタイトル変更には追加料金がかかります。

このあたりの手間を何とかできないかなというので楽天BOOKSのデータを用いたPDFファイル名の変換になります。ちなみに注意点としてはOCRでISBNが文字化されている前提での処理となります。

実行結果

というわけで結果からですが、下記の通り、ISBNがPDF内部に見つけられて、楽天BookSのページでタイトルが見つかった本に関してはファイル名が変更されています。

実行前
20170712_python_0.jpg

実行後
20170712_python_1.jpg

ちなみにDebug用の出力は下記の通りです。
> python.exe chPdfFile.py bookdata
[Input File] : 0000.pdf [Result] ISBN:9784873113265, Title:CとGNU開発ツールによる組み込みシステムプログラミング
[Input File] : 0001.pdf [Result] ISBN information wasn't found
[Input File] : 0002.pdf [Result] ISBN:4839919844, Title:OS自作入門30日でできる!
[Input File] : 0003.pdf [Result] ISBN:9784063107937, Title:げんしけん(11)二代目の弐(アフタヌーンKC)
[Input File] : 0004.pdf [Result] ISBN:9784757521421, Title:ちょこっとヒメ(3)(ガンガンWINGコミックス)
[Input File] : 0005.pdf [Result] ISBN:9784088707211, Title:食戟のソーマ(1)(ジャンプコミックス)
続いて、環境とソースになります。

使用するモジュール

使用するモジュールはPyPDF2になります。下記でインストールしています。
> pip install PyPDF2

ソースコード

ソースは下記の様な感じで、最後のページから辿って行ってISBNを見つけにいきます。ISBNが見つかったら楽天BOOKSのサイトから本のタイトルが見つかる場合にはPDFファイル名を変換し、見つからない場合にはそのままにします。
import PyPDF2
import sys
import re
import requests
import bs4
import os
import shutil

def pdf2title(pdfFile):
# read pdf file
pdfFileObj = open(pdfFile,'rb')
pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
for i in range(pdfReader.numPages):
# select the last page to check ISBN
pageObj = pdfReader.getPage(pdfReader.numPages-1-i)

# get isbn number
bookIsbnPre = re.search(r"ISBN([0-9\-]+) ",pageObj.extractText())
if bookIsbnPre:
bookIsbn = re.sub('[-]+','',str(bookIsbnPre.group(1)))
# access rakuten books to get the title of the book from ISBN
res = requests.get('http://books.rakuten.co.jp/search/nm?b=1&g=007&sitem='+ bookIsbn)
soup = bs4.BeautifulSoup(res.text, "lxml")
allTitles = soup.select('.rbcomp__item-list__item__title')
if allTitles:
titleAfterSub = re.sub('[ \n\t\s]+','',str(allTitles[0]))
bookTitle = re.search(r">(.*)<",titleAfterSub)
if(bookTitle):
# Debug information
print("[Result] ISBN:" + str(bookIsbn) +', Title:'+ str(bookTitle.group(1)))
pdfFileObj.close()
return([True,str(bookTitle.group(1))])

pdfFileObj.close()
return([False,""])

if (len(sys.argv) != 2):
print ("Usage: phtyon chPdfFile.py <pdf file dir>")
else:
# get pdf file list
pdfFileList = []
for filename in os.listdir(sys.argv[1]):
if filename.endswith('.pdf'):
pdfFileList.append(filename)

for filename in pdfFileList:
print("[Input File] : " + filename + " " ,end='')
srcFilePath = str(sys.argv[1]) + '\\' + filename
result = pdf2title(srcFilePath)
if result[0] == True:
# Change pdf file name
dstFilePath = str(sys.argv[1]) + '\\' + result[1] + '.pdf'
shutil.move(srcFilePath,dstFilePath)
else:
# pdf file name wasn't changed when ISBN wasn't found
print("[Result] ISBN information wasn't found")

というわけで前の「Python + pyzbar + OpenCVを用いたバーコードSCANによる駿河屋買取価格確認」と合わせて、「退屈なことはPythonにやらせよう」の13章ぐらいまでは進めた感じです。

スポンサーリンク
posted by くまなべ at 21:24 | Comment(0) | TrackBack(0) | Python
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/180303228
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック