質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.36%
PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

Q&A

解決済

1回答

3027閲覧

Python:ディレクトリ内のPDFに別のPDFを挿入したい。

monopoly_man

総合スコア9

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

0グッド

0クリップ

投稿2021/11/11 03:06

編集2021/11/17 09:58

挿入前フォルダ内にある各PDFファイルの3ページ目に、「A].PDFを挿入して
ファイル名を挿入前と同じファイル名で保存したい。
連続処理を行いたいのですが、エラーとなってしまい悩んでおります。

ご教授いただければ幸いです。

python

1 2import glob 3import PyPDF2 4 5files = glob.glob(r'C:\PDF挿入\挿入前*.pdf') 6merger = PyPDF2.PdfFileMerger(strict=False) 7 8for i in files: 9 merger.append(i) 10 merger.merge(2, 'C:\PDF挿入\A.pdf') 11 12 merger.write(r'C:\PDF挿入\挿入後****.pdf') #←挿入前と同じPDFファイル名で保存させたい。 13 merger.close()

エラー内容は下記となります。
addpageの引数がエラーとなっています。
ファイルが一つしかない場合は、この引数にファイルパスを入力すればよいのですが、
ディレクトリ内の複数あるPDFにはエラーとなってしまうようです。

保存先に関しては、C:\PDF挿入\挿入後フォルダに挿入前と同じファイル名で保存したいのですが、その方法が分からないため※※※※で表記してあります。

python

1--------------------------------------------------------------------------- 2AttributeError Traceback (most recent call last) 3<ipython-input-3-72ca3ec7b122> in <module> 4 3 merger.merge(2, 'C:\PDF挿入\A.pdf') 5 4 6----> 5 merger.write(r'C:\PDF挿入\挿入後\000.pdf') 7 6 merger.close() 8 7 9 10~\anaconda3\lib\site-packages\PyPDF2\merger.py in write(self, fileobj) 11 218 # The commented out line below was replaced with the two lines below it to allow PdfFileMerger to work with PyPdf 1.13 12 219 for page in self.pages: 13--> 220 self.output.addPage(page.pagedata) 14 221 page.out_pagedata = self.output.getReference(self.output._pages.getObject()["/Kids"][-1].getObject()) 15 222 #idnum = self.output._objects.index(self.output._pages.getObject()["/Kids"][-1].getObject()) + 1 16 17AttributeError: 'NoneType' object has no attribute 'addPage'

下記のコードで元のPDFを挿入後、元のファイル名で保存することに成功しましたが、成功するのは最初のPDFのみで、
ディレクトリ内にある2番目以降のPDFは上手く処理できませんでした。

python

1import glob 2import PyPDF2 3 4files = glob.glob(r'C:\PDF挿入\挿入前*.pdf') 5merger = PyPDF2.PdfFileMerger(strict=False) 6 7for i in files: 8 merger.append(i) 9 merger.merge(2, 'C:\PDF挿入\A.pdf') 10 11 file_name = r'C:\PDF挿入\挿入後' + "/" + os.path.basename(i) 12 13 merger.write(file_name) 14 merger.close()

エラーは下記です。解決方法が分からず悩んでおります。

python

1--------------------------------------------------------------------------- 2AttributeError Traceback (most recent call last) 3<ipython-input-3-6deca51f3d5a> in <module> 4 12 5 13 6---> 14 merger.write(file_name) 7 15 merger.close() 8 16 9 10~\anaconda3\lib\site-packages\PyPDF2\merger.py in write(self, fileobj) 11 218 # The commented out line below was replaced with the two lines below it to allow PdfFileMerger to work with PyPdf 1.13 12 219 for page in self.pages: 13--> 220 self.output.addPage(page.pagedata) 14 221 page.out_pagedata = self.output.getReference(self.output._pages.getObject()["/Kids"][-1].getObject()) 15 222 #idnum = self.output._objects.index(self.output._pages.getObject()["/Kids"][-1].getObject()) + 1 16 17AttributeError: 'NoneType' object has no attribute 'addPage'

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AkiFuku

2021/11/11 09:40

実際のソースでも merger.write(r'C:\PDF挿入\挿入後\****.pdf') というコードで保存しようとしているのでしょうか?そうでない場合、実際のソースで書いているままにした方が良いかと思います。 また、どういったエラーが表示されるかも併記しておくと回答が得られやすいかと思います。
guest

回答1

0

ベストアンサー

ファイルが一つの場合はうまくいって、merger.write(r'C:\PDF挿入\挿入後****.pdf')だと上手くいかないというのは、このファイル名の指定の方法が良くないのではと思います。
os.path.basename(i)
でパスの中からファイル名のみが取り出せますので、これをもとに以下のように保存先のパスを作成し、保存を実行すれば良さそうな気がします。

python

1newname = r'C:\PDF挿入\挿入後' + "/" + os.path.basename(i) 2merger.write(newname)

参考:「python パス ファイル名のみ」などで検索するとこういった記事が見つかるかと思います。
https://note.nkmk.me/python-os-basename-dirname-split-splitext/


【追記】
merger = PyPDF2.PdfFileMerger(strict=False)
をfor文の前ではなく、for文の中で宣言してみてください。
for文の中でこれをClose()しているため、二度目ではClose()済みのmergerで実行しようとしてエラーになっているのだと思われます、

投稿2021/11/12 00:53

編集2021/11/18 07:28
AkiFuku

総合スコア129

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

monopoly_man

2021/11/18 10:29

解決出来ました!初心者のくだらないご質問にお付き合い頂き感謝しております。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問