我有一个名为links_to_announcement的列表,其中包含不同pdf文件的url。
我如何下载它们并将它们连接在一起?我的代码生成了一个损坏的pdf,在pdf阅读器中根本无法打开。
with open('joined_pdfs.pdf', 'wb') as f:
for l in links_to_announcement:
response = requests.get(l)
f.write(response.content)
许多文件格式都有特定的结构化格式(而不是简单的任意文本行),附加它们是不够的!
相反,在这个(写PDF)和许多其他格式中,有必要用理解其上下文的东西重写它们
举一个简单的例子,如果盲目地追加了两个CSV,第二个CSV的标题将被拼接到新文档的中间,任何不精确的列将无法正确解析或被误解,即使删除了损坏的行
file1.csv
colA,colB
1,2
file2.csv
colC,colD,colA
3,4,5
盲目追加两个文件
colA,colB
1,2
colC,colD,colA
3,4,5
这个文档应该如何解释?
相反,上下文感知解析器可以正确地合并文档
colA,colB,colC,colD
1,2,,
5,,3,4
@esqew, PDF文件可以合并逻辑,如合并PDF文件
你展示了如何下载文件,但它可能明显更快地解包每个web请求到一个BytesIO
,并将它们全部合并在内存中(python请求返回文件类对象流)
注意,这将挫败尝试重新启动失败的请求后,你应该考虑写入每个PDF中间到磁盘和检查你是否有文件在你的本地缓存之前再次下载,如果你发现频繁失败的请求
import requests # aiohttp might be better to asyncio.gather()
from pypdf import PdfMerger
merger = PdfMerger()
with open("links_to_announcement.txt") as fh:
for url in fh:
r = request.get(url, stream=True)
# TODO error handling: .raise_for_status(), backoff, etc.
r.raw.decode_content = True # possibly fix encoding issues
merger.append(r.raw) # probably an io.BytesIO
merger.write("combined.pdf")
merger.close()