回答編集履歴
4
表現を修正
    
        answer	
    CHANGED
    
    | @@ -45,7 +45,7 @@ | |
| 45 45 | 
             
            print("すべての処理が正常に完了しました。")
         | 
| 46 46 | 
             
            ```
         | 
| 47 47 | 
             
            追加分:
         | 
| 48 | 
            -
            - PDFファイルの内容により、`PyPDF2.PdfFileReader()`で読み込むさいに「OSError: [Errno 22] Invalid argument」になるものがある。公式のGitHubの以下のページで議論されている(未解決)。
         | 
| 48 | 
            +
            - PDFファイルの内容により、`PyPDF2.PdfFileReader()`で読み込むさいに「OSError: [Errno 22] Invalid argument」になるものがある。PyPDF2公式のGitHubの以下のページで議論されている(未解決)。
         | 
| 49 49 |  | 
| 50 50 | 
             
            [A certain PDF File triggers OSError: [Errno 22] Invalid argument · Issue #530 · mstamy2/PyPDF2](https://github.com/mstamy2/PyPDF2/issues/530)
         | 
| 51 51 |  | 
3
PDFファイル自体に問題があるという補足を追加
    
        answer	
    CHANGED
    
    | @@ -43,4 +43,33 @@ | |
| 43 43 | 
             
            odd_object.close()
         | 
| 44 44 | 
             
            even_object.close()
         | 
| 45 45 | 
             
            print("すべての処理が正常に完了しました。")
         | 
| 46 | 
            -
            ```
         | 
| 46 | 
            +
            ```
         | 
| 47 | 
            +
            追加分:
         | 
| 48 | 
            +
            - PDFファイルの内容により、`PyPDF2.PdfFileReader()`で読み込むさいに「OSError: [Errno 22] Invalid argument」になるものがある。公式のGitHubの以下のページで議論されている(未解決)。
         | 
| 49 | 
            +
             | 
| 50 | 
            +
            [A certain PDF File triggers OSError: [Errno 22] Invalid argument · Issue #530 · mstamy2/PyPDF2](https://github.com/mstamy2/PyPDF2/issues/530)
         | 
| 51 | 
            +
             | 
| 52 | 
            +
            先頭の発言の「This file」のリンクからダウンロードした`NTB - LOI.pdf`(印刷された書類をスキャンしたっぽい内容)を`PyPDF2.PdfFileReader()`で読み込むと、確かに「OSError(以下略)」が発生する。質問者がスキャンで作成したPDFファイルも、これと同じ問題が起きている可能性が高い。なお、こちらで検証に使っていたPDFファイルは、印刷した文書をスキャンしたものではなく、Wordで作成した文書を直接PC上でPDF化したものだった。
         | 
| 53 | 
            +
             | 
| 54 | 
            +
            とりあえずの対策として、上記のスレッドでは、GhostScript(gs)を使ってPDFファイルを書き換えるためのコマンドラインが提案されている。
         | 
| 55 | 
            +
             | 
| 56 | 
            +
            > gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/printer -dNOPAUSE -dQUIET -dBATCH -sOutputFile="出力ファイル名" "入力ファイル名"
         | 
| 57 | 
            +
             | 
| 58 | 
            +
            あいにくWindowsにGhostScriptを入れていなかったので、仮想Linuxマシンで上記のコマンドラインで変換を行なったところ、
         | 
| 59 | 
            +
            ```terminal
         | 
| 60 | 
            +
            $ gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/printer -dNOPAUSE -dQUIET -dBATCH -sOutputFile="output.pdf" "input.pdf"
         | 
| 61 | 
            +
               **** Error:  An error occurred while reading an XREF table.
         | 
| 62 | 
            +
               **** The file has been damaged.  This may have been caused
         | 
| 63 | 
            +
               **** by a problem while converting or transfering the file.
         | 
| 64 | 
            +
               **** Ghostscript will attempt to recover the data.
         | 
| 65 | 
            +
               **** However, the output may be incorrect.
         | 
| 66 | 
            +
            ```
         | 
| 67 | 
            +
            とエラーを吐いたものの、変換後のPDFファイルは問題なく`PyPDF2.PdfFileReader()`で読み込むことができた。なお、PDFビューアーアプリでは、どちらのPDFファイルも表示できている。
         | 
| 68 | 
            +
             | 
| 69 | 
            +
            ということで、
         | 
| 70 | 
            +
             | 
| 71 | 
            +
            0. 現在使っているPDFファイルではなく、Wordなどの文書を直接PDF化したものを用意して、コードの動作確認を行なう。
         | 
| 72 | 
            +
            0. 最終目的であるスキャンされたPDFファイルのマージを行なうために、GhostScriptのダウンロードとインストールを行なう。
         | 
| 73 | 
            +
            0. gsコマンドが利用可能になったら、上記のコマンドラインで変換を試み、生成されたPDFファイルを使って(動作確認済みの)コードでマージを行なう。
         | 
| 74 | 
            +
             | 
| 75 | 
            +
            という手順が必要でしょう。
         | 
2
余分なPDFファイルがあっても動作するよう修正
    
        answer	
    CHANGED
    
    | @@ -3,28 +3,29 @@ | |
| 3 3 | 
             
            - `pdfwriter`に書き込みを行なう`addPage()`は代入ではなくメソッド呼び出しなので、それに見合う形にする。
         | 
| 4 4 | 
             
            - 偶数ページのページ数は、奇数ページのページ数と同じか、1ページ少なくなるか(1,3,5ページと2,4ページなど)のどちらかである。1ページ少なくなる場合、`getPage()`しないように`even_pdf.numPages`を使ったif文で処理する。
         | 
| 5 5 |  | 
| 6 | 
            -
            残った問題点は、
         | 
| 6 | 
            +
            ~~残った問題点は、~~
         | 
| 7 | 
            -
            - カレントディレクトリに存在するPDFファイルが2個以外のときの処理。たとえば、1個だけある場合や、3個以上ある場合にどうするか。現在は` | 
| 7 | 
            +
            - ~~カレントディレクトリに存在するPDFファイルが2個以外のときの処理。たとえば、1個だけある場合や、3個以上ある場合にどうするか。現在は`os.listdir()`の末尾2個だけが処理される。~~
         | 
| 8 8 |  | 
| 9 | 
            +
            globを使って「even_*.pdf」と「odd_*.pdf」をそれぞれ別個にリストに読み込み、それぞれのリストの要素が1のときだけ続く処理を行なうように変更した。これで、他のPDFファイル(以前作成したmerged.pdfなど)が存在しても動作する。
         | 
| 10 | 
            +
             | 
| 9 11 | 
             
            ```Python
         | 
| 12 | 
            +
            import glob
         | 
| 13 | 
            +
            import sys
         | 
| 10 14 | 
             
            import PyPDF2
         | 
| 11 | 
            -
            import os
         | 
| 12 15 |  | 
| 13 | 
            -
            pdflist = []
         | 
| 14 | 
            -
             | 
| 16 | 
            +
            even_list = glob.glob("even_*.pdf")
         | 
| 15 | 
            -
             | 
| 17 | 
            +
            odd_list = glob.glob("odd_*.pdf")
         | 
| 16 | 
            -
             | 
| 18 | 
            +
            if len(even_list) != 1 or len(odd_list) != 1:
         | 
| 19 | 
            +
                print("1組のPDFファイル(even_*.pdf, odd_*pdf)になっていません")
         | 
| 20 | 
            +
                sys.exit(1)
         | 
| 17 21 |  | 
| 18 | 
            -
            pdflist.reverse()
         | 
| 19 | 
            -
            print(pdflist)
         | 
| 20 | 
            -
             | 
| 21 | 
            -
            odd_file_name =  | 
| 22 | 
            +
            odd_file_name = odd_list[0]
         | 
| 22 | 
            -
            print(odd_file_name)
         | 
| 23 | 
            +
            print("odd file: " + odd_file_name)
         | 
| 23 24 | 
             
            odd_object = open(odd_file_name, "rb")
         | 
| 24 25 | 
             
            odd_pdf = PyPDF2.PdfFileReader(odd_object)
         | 
| 25 26 |  | 
| 26 | 
            -
            even_file_name =  | 
| 27 | 
            +
            even_file_name = even_list[0]
         | 
| 27 | 
            -
            print(even_file_name)
         | 
| 28 | 
            +
            print("even file: " + even_file_name)
         | 
| 28 29 | 
             
            even_object = open(even_file_name, "rb")
         | 
| 29 30 | 
             
            even_pdf = PyPDF2.PdfFileReader(even_object)
         | 
| 30 31 |  | 
| @@ -39,5 +40,7 @@ | |
| 39 40 | 
             
            pdfoutput = open(r"merged.pdf", "wb")
         | 
| 40 41 | 
             
            pdfwriter.write(pdfoutput)
         | 
| 41 42 | 
             
            pdfoutput.close()
         | 
| 43 | 
            +
            odd_object.close()
         | 
| 44 | 
            +
            even_object.close()
         | 
| 42 45 | 
             
            print("すべての処理が正常に完了しました。")
         | 
| 43 46 | 
             
            ```
         | 
1
補足を追加
    
        answer	
    CHANGED
    
    | @@ -1,3 +1,11 @@ | |
| 1 | 
            +
            - 質問へのコメントでも指摘されているように、`odd_object`と`even_object`のモードは`"rb"にしないと読み込めません。
         | 
| 2 | 
            +
            - forループで`maxpagenum`という変数が突然出てくる。(偶数ページと奇数ページを比較して、より長くなる可能性がある)`odd_pdf.numPages`に代える。
         | 
| 3 | 
            +
            - `pdfwriter`に書き込みを行なう`addPage()`は代入ではなくメソッド呼び出しなので、それに見合う形にする。
         | 
| 4 | 
            +
            - 偶数ページのページ数は、奇数ページのページ数と同じか、1ページ少なくなるか(1,3,5ページと2,4ページなど)のどちらかである。1ページ少なくなる場合、`getPage()`しないように`even_pdf.numPages`を使ったif文で処理する。
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            残った問題点は、
         | 
| 7 | 
            +
            - カレントディレクトリに存在するPDFファイルが2個以外のときの処理。たとえば、1個だけある場合や、3個以上ある場合にどうするか。現在は`ps.listdir()`の末尾2個だけが処理される。
         | 
| 8 | 
            +
             | 
| 1 9 | 
             
            ```Python
         | 
| 2 10 | 
             
            import PyPDF2
         | 
| 3 11 | 
             
            import os
         | 
