PyPDF2按页拆分pdf

2024-05-12 20:49:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用PyPDF2分割pdf文件。

net中的所有示例都太难或不起作用,或者总是给出错误“attribute error:”PdfFileWriter“object has no attribute'stream'”

有人能帮忙吗?需要分离成三个不同的文件一个3页的pdf文件。

我从这个开始:

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)

因为英语不好。

编辑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)

所有功能都正常工作,但有点困难。


Tags: 文件namepdfaswithpagesopenout
2条回答

我使用了一个名为xpdf的工具来完成这类任务,它工作得非常好。你可以下载它here

这是一个可以从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')

页面由formfeed字符分隔,因此您将得到一个页面列表。

您可以使用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对象,添加单个页面。然后写出一个不断递增的文件名,或者有其他方案来决定输出文件名?

相关问题 更多 >