2017-07-17 77 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