web-dev-qa-db-ja.com

PyPDF2はPDFをページごとに分割

PyPDF2を使用してPDFファイルを分割したい。

ネット内のすべての例は難しすぎるか、機能しないか、常にエラーが発生します「AttributeError: 'PdfFileWriter'オブジェクトに属性 'stream'がありません」

誰かがそれを手伝うことができますか? 3ページの1つのPDFを3つの異なるファイルに分離する必要があります。

私はそれから始めています:

pdfFileObj = open(r"D:\BPO\act.pdf", 'rb')
pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
pdfWriter = PyPDF2.PdfFileWriter()
pdfWriter.addPage(pdfReader.getPage(0))

しかし、次に何をすべきかわからない:(

編集#1

分割のためにループを実行しようとしましたが、問題があります。PdfFileWriterは、3つのファイルを1ページで1つ、2つ目で2つ、3つ目で3つ作成します。次のコードの私の間違いはどこにありますか?

act_sub_pages_name = ['p01.pdf', 'p02.pdf', 'p03.pdf']
with open(r"D:\BPO\act.pdf", 'rb') as act_mls:
    reader = PdfFileReader(act_mls)
    writer = PdfFileWriter()
    if reader.numPages == 3:
        counter = 0
        for x in range(3):
            path = '\\'.join(['D:\\BPO\\act sub pages', act_sub_pages_name[counter]])
            counter += 1
            writer.addPage(reader.getPage(x))
            with open(path, 'wb') as outfile: writer.write(outfile)

悪い英語を探してください。

編集#2

ポールルーニーによる私の解決策は答えます:

act_pdf_file = 'D:\\BPO\\act.pdf'
act_sub_pages_name = ['p01.pdf', 'p02.pdf', 'p03.pdf']

def pdf_splitter(index, src_file):
    with open(src_file, 'rb') as act_mls:
        reader = PdfFileReader(act_mls)
        writer = PdfFileWriter()
        writer.addPage(reader.getPage(index))
        out_file = os.path.join('D:\\BPO\\act sub pages', act_sub_pages_name[index])
        with open(out_file, 'wb') as out_pdf: writer.write(out_pdf)

for x in range(3): pdf_splitter(x, act_pdf_file)

関数を使用すると、すべて正常に機能しますが、少し難しくなります。

5
Acamori

writePdfFileWriterメソッドを使用して、ファイルに書き出すことができます。

from PyPDF2 import PdfFileReader, PdfFileWriter

with open("input.pdf", 'rb') as infile:

    reader = PdfFileReader(infile)
    writer = PdfFileWriter()
    writer.addPage(reader.getPage(0))

    with open('output.pdf', 'wb') as outfile:
        writer.write(outfile)

入力ファイルのページをループし、新しいライターオブジェクトを作成し、単一のページを追加することをお勧めします。次に、増え続けるファイル名に書き出すか、出力ファイル名を決定するための他のスキームがありますか?

19
Paul Rooney

私はこの種のタスクにxpdfというツールを使用しましたが、それは本当にうまく機能します。ダウンロードできます こちら

これは、Pythonから呼び出すことができるコマンドラインユーティリティです。コマンドラインから呼び出すことができるように、パスに追加されていることを確認してください。

subprocessを使用して、Pythonからインターフェースする方法は次のとおりです。

import subprocess

text, _ = subprocess.Popen('pdftotext -fixed 0 -clip D:\\BPO\\act.pdf', 
                           Shell=True, 
                           stdout=subprocess.PIPE).communicate()

pages = text.decode('latin-1').split('\f')

ページは改ページ文字で区切られているため、ページのリストが表示されます。

1
cs95