Python:无法使用write方法加入/附加PDF

时间:2017-10-04 03:32:04

标签: python pdf merge append

我下载了一系列pdf文件,我想加入它们。我知道PyPDF或类似的模块,但我想知道为什么我不能使用file.write()方法来加入pdf文件。

以下是我用来下载pdf文件的代码。

for i in range(3):
    url = 'http://ncert.nic.in/ncerts/l/leph10{}.pdf'.format(i+1)
    response = requests.get(url)
    with open ('file{}.pdf'.format(i+1), 'wb') as file:
        for chunk in response.iter_content(chunk_size= 1024):
            file.write(chunk)

然后我使用以下代码加入它们。

with open ('combined.pdf', 'ab') as combined:
    for i in range(2,-1,-1 ):
        with open ('file{}.pdf'.format(i+1), 'rb') as file:
            for chunk in file:
                combined.write(chunk)

组合文件仅包含第一个文件,但不包含其余两个文件。但是,组合文件的大小是所有三个文件的大小的总和。

我在这里搜索了许多博客/问题以寻找答案,但是每个人似乎都建议使用PyPDF或类似的模块来处理Python中的PDF。

我的问题是:

i)为什么代码只从第一个文件加入/追加,即使组合文件的实际大小要大得多。我没有得到任何例外/错误。

ii)为什么我不能在Python中使用这样简单的write()方法加入pdf文件?

1 个答案:

答案 0 :(得分:0)

基本上,因为PDF文件是非常复杂的东西。每个PDF都有标题,数据和结束部分。所以,如果你将它们中的一些粘在一起,你用来查看它们的阅读器将找到第一个PDF的结尾部分,然后完成阅读,忽略随后的任何信息。

(至少在Unix / Linux中)有几种工具可以让你组合PDF。一个例子是pdfjoin,手册页中写着:

  

pdfjoin连接多个Portable Document的页面   格式化(PDF)文件一起放在一个文件中。

pdfjoin is part of the "PDFjam" package of tools

请注意,即使此类程序也可能遇到问题,因为每个PDF中的数据保存方式可能​​会有冲突。

编辑PDF documents are fairly difficult to decode。只是为了说明一点......这是一个非常最小PDF:只是空页上的工作John。从原始文本文件中的6个字符转换为Postscript,它占用13000多个字符。转换为PDF(使用ps2pdf),它减少到3800+字节。

这是PDF

标题部分的一部分
%PDF-1.4
%.쏢
5 0 obj
<</Length 6 0 R/Filter /FlateDecode>>
stream
-- edited out ---
endstream
endobj
6 0 obj
97
endobj
4 0 obj
<</Type/Page/MediaBox [0 0 612 792]
/Rotate 0/Parent 3 0 R
/Resources<</ProcSet[/PDF /Text]
/ExtGState 10 0 R
/Font 11 0 R
...

请注意,在第4行中,文本的长度已经编码(6),因此您必须在输出文件中重新编码。这是结束部分的一部分:

<</Producer(GPL Ghostscript 9.20)
/CreationDate(D:20171004210838-03'00')
/ModDate(D:20171004210838-03'00')
/Title(john.txt)
/Author()
/Creator(a2ps version 4.14)>>endobj
xref
0 14
0000000000 65535 f
0000000419 00000 n
0000003214 00000 n
0000000360 00000 n
0000000200 00000 n
0000000015 00000 n
0000000182 00000 n
0000000484 00000 n
0000000585 00000 n
0000000820 00000 n
0000000525 00000 n
0000000555 00000 n
0000001081 00000 n
0000001733 00000 n
trailer
<< /Size 14 /Root 1 0 R /Info 2 0 R
/ID [<EF5D1976DF3773944878D6157BCEE651><EF5D1976DF3773944878D6157BCEE651>]
>>
startxref
3392
%%EOF

原始文本在PDF中甚至不具有可读形式:它可能已被重新编码为矢量格式左右。

我不是说这是不可能的,但我建议你至少使用某种类型的库来反汇编原始PDF,并为输出重新编码。请查看'Manipulating PDFs with Python'[PDFMiner][4]