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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pip

pipとは、Pythonを用いて書かれているパッケージソフトのインストールや管理を行うためのパッケージマネジメントシステムです。pipを使う主なメリットは、コマンドラインインターフェースにて容易にPythonパッケージソフトをインストール可能だという点です。

Q&A

解決済

1回答

1227閲覧

【PyPDF2】forループrange()関数の第2引数の設定の仕方を教えてください。

84zero

総合スコア48

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pip

pipとは、Pythonを用いて書かれているパッケージソフトのインストールや管理を行うためのパッケージマネジメントシステムです。pipを使う主なメリットは、コマンドラインインターフェースにて容易にPythonパッケージソフトをインストール可能だという点です。

0グッド

0クリップ

投稿2018/02/02 06:48

編集2018/02/02 11:07

前提・実現したいこと

既存の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

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

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

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

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

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

guest

回答1

0

ベストアンサー

一般的なPDFで、適切な範囲を指定したところ正常に動作しました。
終了ページを範囲外を指定するとIndexError: list index out of rangeエラーとなりました。
よってソースは特に問題ないと思います。

ただ、"file has not been decrypted" error #51にあげられているPDFにて、同じエラーが再現しました。

すなわち、元PDFではページの抽出などの編集操作が許可されていないと思われます。

投稿2018/02/02 09:00

can110

総合スコア38262

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

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

84zero

2018/02/02 11:08 編集

ありがとうございます!解決しました(^^) おっしゃる通りどうやら、元PDFは保護がかかっていて抽出されないだけみたいでした。 全ページコピーはできたので、プログラム内で一度コピーファイルを作成後、 そのコピーファイルから抽出するようにすれば、 保護がかかっているものでも抽出できるようになりました。 補足情報に変更後のプログラムを追記します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問