下载pdf并使用python加入它们

  • 本文关键字:python pdf 下载 python
  • 更新时间 :
  • 英文 :


我有一个名为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()

最新更新