下記の様にフォルダ階層毎にJPEGファイルがあるとして、それらJPEGをPDFに変換し、1つのファイルに結合したいです。
結合後のファイル名は、そのファイルが格納されているフォルダ名にしたいです。(成果物はどこにできても構いません)
【実行前】
root/
├─ A/
│ ├─ D/
│ | ├─ 005.jpg
│ | └─ 006.jpg
│ └─ E/
│ ├─ 007.jpg
│ └─ 008.jpg
├─ B/
│ └─ F/
│ ├─ 009.jpg
│ └─ 010.jpg
├─ C/
│ ├─ 003.jpg
│ └─ 004.jpg
├─ 001.jpg
└─ 002.jpg
【実行後】
root/
├─ A/
│ ├─ D/
│ | └─ D.pdf
│ └─ E/
│ └─ E.pdf
├─ B/
│ └─ F/
│ └─ F.pdf
├─ C/
│ └─ C.pdf
└─ root.pdf
Python
1import os 2import glob 3import img2pdf 4 5os.chdir(r'C:\root\A') 6cur_dir = os.getcwd() 7dirs = os.listdir(cur_dir) 8 9for f in dirs: 10 if os.path.isdir(os.path.join(cur_dir, f)): 11 files = glob.glob(os.path.join(cur_dir, f, r"*.jpg")) 12 with open(os.path.join(cur_dir, f, f"{f}.pdf"), "wb") as f1: 13 f1.write(img2pdf.convert([file for file in files]))
上記の様にos.chdir()に「A/」を指定すれば「D」と「E」のフォルダ直下に結合されたPDFを作ることができたので、「階層を上げて更にfor文の中でfor文を回せばできるだろう」と思ってやってもうまくいかず。
以下のコードだとエラーを吐かれてしまいます。
Python
1cur_dir = os.getcwd(r'C:\root') 2dirs = os.listdir(cur_dir) 3 4for f in dirs: 5 if os.path.isdir(os.path.join(cur_dir, f)): 6 for sf in os.listdir(os.path.join(cur_dir,f)): 7 if os.path.isdir(os.path.join(cur_dir, f, sf)): 8 files = glob.glob(os.path.join(cur_dir, f, sf, r"*.jpg")) 9 with open(os.path.join(cur_dir, f, sf, f"{sf}.pdf"), "wb") as f1: 10 f1.write(img2pdf.convert([file for file in files])) 11 12 files = glob.glob(os.path.join(cur_dir, f, r"*.jpg")) 13 with open(os.path.join(cur_dir, f, f"{f}.pdf"), "wb") as f1: 14 f1.write(img2pdf.convert([file for file in files]))
###Error
IndexError Traceback (most recent call last)
<ipython-input-25-b6702d2f1074> in <module>
18 files = glob.glob(os.path.join(cur_dir, f, r"*.jpg"))
19 with open(os.path.join(cur_dir, f, f"{f}.pdf"), "wb") as f1:
---> 20 f1.write(img2pdf.convert([file for file in files]))
C:\ProgramData\Anaconda3\lib\site-packages\img2pdf.py in convert(*images, **kwargs)
2082 return
2083
-> 2084 return pdf.tostring()
2085
2086
C:\ProgramData\Anaconda3\lib\site-packages\img2pdf.py in tostring(self)
953 def tostring(self):
954 stream = BytesIO()
--> 955 self.tostream(stream)
956 return stream.getvalue()
957
C:\ProgramData\Anaconda3\lib\site-packages\img2pdf.py in tostream(self, outputstream)
1047 # by default the initial page is the first one
1048 if self.engine == Engine.pikepdf:
-> 1049 initial_page = self.writer.pages[0]
1050 else:
1051 initial_page = self.writer.pagearray[0]
IndexError: Accessing nonexistent PDF page number
さらに「os.walk」を使えばできるかなと思い色々やってみましたが、os.walk()に指定したフォルダ直下のファイルしかPDFにできず。
Python
1for foldername, subfolders, filenames in os.walk(r'C:\root'): 2 files = glob.glob(os.path.join(cur_dir, foldername, r"*.jpg")) 3 with open(os.path.join(cur_dir, foldername, f"{foldername}.pdf"), "wb") as f1: 4 f1.write(img2pdf.convert([file for file in files]))
他にもabspathを使ったり、一度リストにJPEGを格納してみたり、PyPDF2でやってみたりと。
大体上記エラー「IndexError: Accessing nonexistent PDF page number(存在しないPDFページ番号へのアクセス)」で詰まってしまいます。
長い期間考えて、いろいろ試行錯誤して参りましたが、自分の頭では解決する事ができませんでした。
長くなってしまい申し訳ありませんが、知恵をお借りできれば幸いです。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/16 02:35 編集
2021/01/16 02:45
2021/01/17 01:17