前提・実現したいこと
既存のPDFファイルから任意のページを抜き出して、
新しいPDFファイルとして保存するプログラムを作成しています。
発生している問題・エラーメッセージ
pipのモジュールのPyPDF2において、forループ文を用いるときに、
変数start_page,finish_pageに整数値を渡して
for page_num in range(start_page,finish_page):
と引数に設定したところエラーが発生しました。
PdfReadWarning: Xref table not zero-indexed. ID numbers for objects will be corrected. [pdf.py:1736] Traceback (most recent call last): File "C:/MyPythonScripts/PDF編集プログラム/指定したページのみを抜き出すプログラム改.py", line 23, in <module> page_obj = pdf1_reader.getPage(page_num) File "C:\Users\hashi\AppData\Local\Programs\Python\Python36-32\lib\site-packages\PyPDF2\pdf.py", line 1176, in getPage self._flatten() File "C:\Users\hashi\AppData\Local\Programs\Python\Python36-32\lib\site-packages\PyPDF2\pdf.py", line 1505, in _flatten catalog = self.trailer["/Root"].getObject() File "C:\Users\hashi\AppData\Local\Programs\Python\Python36-32\lib\site-packages\PyPDF2\generic.py", line 516, in __getitem__ return dict.__getitem__(self, key).getObject() File "C:\Users\hashi\AppData\Local\Programs\Python\Python36-32\lib\site-packages\PyPDF2\generic.py", line 178, in getObject return self.pdf.getObject(self).getObject() File "C:\Users\hashi\AppData\Local\Programs\Python\Python36-32\lib\site-packages\PyPDF2\pdf.py", line 1617, in getObject raise utils.PdfReadError("file has not been decrypted") PyPDF2.utils.PdfReadError: file has not been decrypted
該当のソースコード
python
1#! python3 2# PDFファイルの指定したページを抜き出すプログラム 3#『退屈なことはパイソンにやらせよう』の340ページ参考 4# file1.pdfをカレントディレクトリに保存しおておくこと 5 6import PyPDF2 7print('編集するファイル名を入力してください。例)file1.pdf') 8file1 = input() 9print('指定したファイルのページを抜き出します。') 10print('抜き出す最初のページを入力してください') 11start_page = int(input())-1 12print('抜き出す最後のページを入力してください') 13finish_page = int(input()) 14print('出力するファイル名を入力してください。例)file2.pdf') 15file2 = input() 16 17pdf1_file = open(file1,'rb')#ファイル1を開く 18pdf1_reader = PyPDF2.PdfFileReader(pdf1_file)#ファイル1を読み込む 19pdf_writer = PyPDF2.PdfFileWriter()#新しい白紙のPDFファイルを作成 20 21#ファイル1の指定したページをコピーして、コピーしたページを白紙のPDFに書き込む 22for page_num in range(start_page,finish_page):#←エラーの原因と思われる個所(22行目) 23 page_obj = pdf1_reader.getPage(page_num) 24 pdf_writer.addPage(page_obj) 25 26pdf_output_file = open(file2,'wb')#出力するファイル2を作成 27pdf_writer.write(pdf_output_file)#ファイル2に出力 28pdf_output_file.close()#ファイル2を閉じる 29pdf1_file.close()#ファイル1を閉じる
試したこと
22行目の
for page_num in range(start_page,finish_page):
を
for page_num in range(start_page,pdf1_reader.numPages):
に書き換えたら、指定したページから最後のページまでは抜き出せます。
ただ、その場合も下記のようなよく分からない警告がつきます。
PdfReadWarning: Xref table not zero-indexed. ID numbers for objects will be corrected. [pdf.py:1736]
range()の第2引数の設定が上手くいっていないようです。
第2引数を変数ではなく、数字で入力した場合も同じようなエラーが発生します。
補足情報(FW/ツールのバージョンなど)
ご回答宜しくお願いします。
できれば、上記警告文の対応策も教えていただければ助かります。
バージョン Python 3.6
解決しました。解決後のプログラムは以下の通りです。
python
1#! python3 2# PDFファイルの指定したページを抜き出すプログラム 3#『退屈なことはパイソンにやらせよう』の340ページ参考 4# file1.pdfをカレントディレクトリに保存しおておくこと 5 6import PyPDF2 7print('編集するファイル名を入力してください。例)file1.pdf') 8file1 = input() 9print('指定したファイルのページを抜き出します。') 10print('抜き出す最初のページを入力してください') 11start_page = int(input())-1 12print('抜き出す最後のページを入力してください') 13finish_page = int(input()) 14print('出力するファイル名を入力してください。例)file2.pdf') 15file2 = input() 16 17pdf1_file = open(file1,'rb')#ファイル1を開く 18pdf1_reader = PyPDF2.PdfFileReader(pdf1_file)#ファイル1を読み込む 19pdf_copy = PyPDF2.PdfFileWriter()#新しい白紙のPDFファイルを作成 20pdf_writer = PyPDF2.PdfFileWriter()#新しい白紙のPDFファイルを作成 21 22#ファイル1をコピーして、コピーしたページを白紙のPDFに書き込む 23for page_num in range(0,pdf1_reader.numPages): 24 page_obj = pdf1_reader.getPage(page_num) 25 pdf_copy.addPage(page_obj) 26 27#ファイル1の指定したページをコピーして、コピーしたページを白紙のPDFに書き込む 28for page_num in range(start_page,finish_page): 29 page_obj = pdf_copy.getPage(page_num) 30 pdf_writer.addPage(page_obj) 31 32pdf_output_file = open(file2,'wb')#出力するファイル2を作成 33pdf_writer.write(pdf_output_file)#ファイル2に出力 34pdf_output_file.close()#ファイル2を閉じる 35pdf1_file.close()#ファイル1を閉じる 36
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/02 11:08 編集