pyPdf PdfFileReader vs PdfFileWriter

时间:2015-02-17 23:31:21

标签: python pypdf

我有以下代码:

import os
from pyPdf import PdfFileReader, PdfFileWriter

path = "C:/Real Python/Course materials/Chapter 12/Practice files"

input_file_name = os.path.join(path, "Pride and Prejudice.pdf")
input_file = PdfFileReader(file(input_file_name, "rb"))
output_PDF = PdfFileWriter()

for page_num in range(1, 4):
    output_PDF.addPage(input_file.getPage(page_num))

output_file_name = os.path.join(path, "Output/portion.pdf")
output_file = file(output_file_name, "wb")
output_PDF.write(output_file)
output_file.close()

直到现在我只是从Pdfs读书,后来学会了从Pdf写到txt ...但现在这...... 为什么PdfFileReaderPdfFileWriter

的区别很大

有人可以解释一下吗?我希望有类似的东西:

import os
from pyPdf import PdfFileReader, PdfFileWriter

path = "C:/Real Python/Course materials/Chapter 12/Practice files"

input_file_name = os.path.join(path, "Pride and Prejudice.pdf")
input_file = PdfFileReader(file(input_file_name, "rb"))

output_file_name = os.path.join(path, "out Pride and Prejudice.pdf")
output_file = PdfFileWriter(file(output_file_name, "wb"))

for page_num in range(1,4):
    page = input_file.petPage(page_num)
    output_file.addPage(page_num)
    output_file.write(page)

任何帮助??? 感谢

编辑0: .addPage()做什么?

for page_num in range(1, 4):
        output_PDF.addPage(input_file.getPage(page_num))

它是否只创建3个BLANK页面?

编辑1:有人可以解释在以下情况发生的事情:

1)output_PDF = PdfFileWriter()

2)output_PDF.addPage(input_file.getPage(page_num))

3)output_PDF.write(output_file)

第3个将JUST CREATED(!)对象传递给output_PDF,为什么?

2 个答案:

答案 0 :(得分:1)

问题基本上是PDF交叉引用表。

对于页面,字体,对象,元素的引用,这是一个有点纠结的意大利面怪物,这些都需要链接在一起以允许随机访问。

每次更新文件时,都需要重建此表。该文件首先在内存中创建,因此只需执行一次,并进一步降低焚烧文件的可能性。

output_PDF = PdfFileWriter()

这将为PDF创建内存空间。 (从旧的pdf中提取)

output_PDF.addPage(input_file.getPage(page_num))

将输入pdf中的页面添加到内存中创建的PDF文件(您想要的页面)。

output_PDF.write(output_file)

最后,这会将存储在内存中的对象写入文件,构建标题,交叉引用表,并将所有内容链接在一起,这些都是hunky dunky。

编辑:据推测,JUST CREATED标志表示PyPDF开始构建适当的表并将事物链接在一起。

-

回应为什么vs .txt和csv:

当您从文本或CSV文件进行复制时,没有现成的数据结构可以理解并移动以确保格式化,图像放置和表单数据(输入部分等)之类的内容保存并正确创建。

答案 1 :(得分:0)

很有可能,因为PDF不完全是线性的 - “标题”实际上位于文件的末尾。

如果每次更改时都将文件写入磁盘,则计算机需要继续在磁盘上推送该数据。相反,模块(可能)将有关文档的信息存储在对象(PdfFileWriter)中,然后在请求时将该数据转换为实际的PDF文件。