前回までのあらすじ
本当にある前回「電子書籍をazw3にしたりepubにしたりpdfにしたりするのとかいろいろ(前編)」で、
Calibreを使って、いろんな形式の電子書籍に変換するのをやりました。
ただ、一部のpdfで、表紙になるはずのページが一番最後になる不具合が出ます。
これの原因は、わかりませんが、
基本的に、コンピューターには、どのページが表紙なのかを見抜けません。
出来上がりを人間が最終確認するだけ。

・・・だって、表紙の形って、毎回違うから、よっぽどディープラーニングしておかないと、
見抜けないし、それでも画集や写真集となると、どれも同じようなふいんきのページだし、
下手するとタイトルすら表示されていない画集や写真集もあったりするし。
そんな状況なので、にわかプログラム程度では無理。

pdfは誰のためにあるの?
pdfは、Adobeの人たちが考えた、電子書籍用のファイル形式で、
けっこう昔から使われているし、今でも便利なので、よく使われています。
そのpdfを読むのは、おもに人間で、
コンピューターがpdfを読む機会は、せいぜいスクレイピングの何かの対象になる程度。

表紙の形は、不規則なので、コンピューターに認識させるのは、とても難儀だし、
人間用のpdfを作るのが目的なので、出来上がったpdfが気に食わない場合限定で、
ここから話を進めさせていただきます。

2024/2/29削除および追記 スクリプト差し替え
もともとは、poppler、img2pdf、pdf2img、pillowを使って、
PDFの各ページを画像変換してから、画像の順番を変えて、つなげていく方法をやっていました。
この方法だと、作るのがめんどくさいし、時間がかかります。
そして、作ったスクリプトを事故でなくしちゃったので、
もう、かつての姿で復元できなくなってしまいました。

その代わり、もっといい方法が見つかったので、それに差し替えます。
前回のスクリプトを使って、電子書籍を何とかすること前提だけど、
PyPDF2を使って、最後のページを最初のページにつなげなおします。
それだけ。余計な画像加工は一切しておりません。

下準備は、PyPDF2をインストールすること。
pip install PyPDF2
それではどうぞ。

from PyPDF2 import *
import os,shutil

moto="./順番を変えたいPDF入れ/"
dekita="./できあがり/"
itizi="./せわfこえwj/"

if os.path.isdir(dekita)==False:
    os.mkdir(dekita)
if os.path.isdir(moto)==False:
    os.mkdir(moto)

tanehon=[]
for current_dir,sub_dirs,files_list in os.walk(moto):
    for file_name in files_list:
        tanehon.append(os.path.join(current_dir,file_name))

i=0
while i<len(tanehon):
    if tanehon[i].endswith(".pdf")==True:
        if os.path.isdir(itizi)==False:
            os.mkdir(itizi)
        else:
            shutil.rmtree(itizi)
            os.mkdir(itizi)
        hon=PdfReader(tanehon[i])

        unko = PdfMerger()
        unko.append(tanehon[i], pages=PageRange(':'+str(len(hon.pages)-1)))
        unko.write(itizi+'けつ.pdf')
        unko.close()
        unko = PdfMerger()
        unko.append(tanehon[i], pages=PageRange(str(len(hon.pages)-1)+':'))
        unko.write(itizi+'あたま.pdf')
        unko.close()
        unko = PdfMerger()
        unko.append(itizi+'あたま.pdf')
        unko.append(itizi+'けつ.pdf')
        unko.write(itizi + os.path.basename(tanehon[i]))
        shutil.copy2(itizi + os.path.basename(tanehon[i]), dekita)
        unko.close()
        shutil.rmtree(itizi)
        os.remove(tanehon[i])
        print("「{}」を直した。".format(os.path.basename(tanehon[i])))
    i+=1
print('全部やっつけた。')



参考文献

Python, pypdfでPDFを結合・分割(ファイル全体・個別ページ)(note.nkmk.me)
https://note.nkmk.me/python-pypdf2-pdf-merge-insert-split/

【Python】PDFのページ数を取得するには? (ばすにっきTips)
https://takabus.com/tips/2283/

【Python】拡張子を判別する4つの方法を簡単に解説(trends. by CodeCamp)
https://trends.codecamp.jp/blogs/media/column23

Poppler : PDFのコマンドラインツール(PDF)
http://pdf-file.nnn2.com/?p=863

LinuxでPDFを画像に変換したりテキストを抽出する方法(Pentan.info)
https://pentan.info/server/linux/poppler.html

Mac環境でPDFから画像を書き出す最も簡単な方法(ゲームエンジニアの雑記ブログ)
https://eng.shibuya24.info/entry/pdf2jpg

【Python】写真(画像)をPDF化するimg2pdfのインストール(ジコログ)
https://self-development.info/【Python】写真(画像)をPDF化するimg2pdfのインストール/

Pythonでファイル名一覧を取得
https://qiita.com/reiko_s/items/98ed21051dcda295c452

Pythonでディレクトリ(フォルダ)を作成するmkdir,makedirs(note.nkmk.me)
https://note.nkmk.me/python-os-mkdir-makedirs/

Pythonでファイル・ディレクトリを削除するos.remove,shutil.rmtreeなど(note.nkmk.me)
https://note.nkmk.me/python-os-remove-rmdir-removedirs-shutil-rmtree/

PythonでZIPファイルを圧縮・解凍するzipfile(note.nkmk.me)
https://note.nkmk.me/python-zipfile/

Pythonでファイル、ディレクトリ(フォルダ)の存在確認(note.nkmk.me)
https://note.nkmk.me/python-os-exists-idfile-isdir/

Python-サブディレクトリを含めたディレクトリ配下の全ファイル一覧を取得する方法(liquid jumper)
https://liquidjumper.com/programming/python/python_os-walk_subdirectory_get-files

【Python】ファイルの拡張子を取得する(鎖プログラム)
https://pg-chain.com/python-endswith

Pythonで文字列を検索(〜を含むか判定、位置取得)(note.nkmk.me)
https://note.nkmk.me/python-str-search/

Python で文字列から最後の文字を削除する方法(DelftStack)
https://delftstack.com/ja/howto/python/how-to-remove-last-character-from-string-in-python/

Python で文字列から最初の文字を削除する方法(DelftStack)
https://delftstack.com/ja/howto/python/how-to-remove-first-character-from-string-python/

【python】ファイルを移動する方法【shutil、os】(Pythonアカデミー)
https://python-academia.com/file-transfer/

img2pdfを使用しPythonで画像をPDFファイルに変換する(メン・オブ・レターズ)
https://laboratory.kazuuu.net/convert-images-to-pdf-files-in-python-using-img2pdf/

Python でファイルをコピーする方法
https://delfstack.com/ja/howto/python/how-to-copy-a-file-in-python/

【Python】ファイル名などのリストを数値でソート(順番に整列)する方法:natsort(OFFICE54)
https://office54.net/python/module/sort-file-natsorted