我想使用PyPDF2分割pdf文件。
net中的所有示例都太难或不起作用或总是出错“AttributeError:'PdfFileWriter'对象没有属性'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)
Sry因为英语不好。
修改#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)
功能正常,但有点困难。
答案 0 :(得分:14)
您可以使用write
的{{1}}方法写出文件。
PdfFileWriter
您可能希望循环输入文件的页面,创建新的编写器对象,添加单个页面。然后写出一个永远递增的文件名?
答案 1 :(得分:1)
我已经使用了一个名为xpdf
的工具来完成这类任务,它确实非常有效。您可以下载here。
这是一个可以从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')
页面由换页字符分隔,因此您将获得一个页面列表。