我下载了一系列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文件?
答案 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]
。