2017-07-17 114 views
1

我想使用PyPDF2分割pdf文件。PyPDF2 split pdf

在網上,所有的例子是太困難或不工作或總是給錯誤「AttributeError的:‘PdfFileWriter’對象有沒有屬性‘流’」

能有人幫助?需要將3頁的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個文件之一與一個頁面,第二個 - 兩個,第三個與三個。我的錯誤代碼如下:

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) 

Sry對英語不好。

編輯#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) 

對於功能都正常工作,但它有點困難。

+0

你想使用pypdf,還是打開其他選擇? –

+0

Ofc如果與python兼容3.6.1 – Acamori

回答

4

您可以使用PdfFileWriterwrite方法寫出文件。

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) 

您可能想要遍歷輸入文件的頁面,創建一個新的writer對象,添加一個頁面。然後寫出一個不斷增加的文件名呢?

+0

是的,分裂後我需要每個文件的新名稱,如act1,act2,act3。 – Acamori

0

我爲這種任務使用了一種名爲xpdf的工具,它的工作真的很好。你可以下載它here

這是一個命令行工具,你可以從python調用。確保將它添加到路徑中,以便可以從命令行調用它。

這裏是如何從Python接口它,使用subprocess

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') 

頁面被換頁字符分隔,所以你會得到的頁面的列表。

+0

謝謝!將嘗試使用它。 – Acamori