【问题标题】:PyPDF2 split pdf by pagesPyPDF2 按页面拆分 pdf
【发布时间】:2017-07-17 12:21:51
【问题描述】:

我想使用 PyPDF2 拆分 pdf 文件。

net 中的所有示例都太难或不起作用或总是报错“AttributeError: '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

根据 Paul Rooney 的回答,我的解决方案:

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)

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

【问题讨论】:

  • 您想使用 pypdf,还是愿意接受其他替代方案?
  • Ofc 如果它们与 python 3.6.1 兼容

标签: python pypdf2


【解决方案1】:

您可以使用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)

您可能想要遍历输入文件的页面,创建一个新的编写器对象,添加一个页面。然后写出一个不断增加的文件名或有其他方案来决定输出文件名?

【讨论】:

  • 是的,拆分后我需要为每个文件取一个新名称,例如 act1、act2、act3。
【解决方案2】:

我已经使用了一个名为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')

页面由换页符分隔,因此您将获得页面列表。

【讨论】:

  • 谢谢!会尝试使用它。
猜你喜欢
  • 2017-02-13
  • 2023-03-31
  • 1970-01-01
  • 2012-01-26
  • 2020-03-04
  • 1970-01-01
  • 2014-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多