如何用Python下载并合并PDF?现有代码生成损坏无法打开的PDF
问题原因
直接将多个PDF的二进制内容拼接在一起会导致文件损坏,因为每个PDF都有独立的文件结构(包括文件头、交叉引用表、尾注等),简单的二进制拼接会破坏这些结构,PDF阅读器无法识别这种混乱的格式。
正确实现方案
下面提供两种可靠的PDF下载与合并方法,使用专业的PDF处理库:
方法1:使用PyPDF2库
PyPDF2是专门用于PDF操作的Python库,支持合并、拆分等基础功能。
步骤1:安装依赖
pip install PyPDF2 requests
步骤2:实现代码
import requests from PyPDF2 import PdfMerger from io import BytesIO # 初始化PDF合并器 merger = PdfMerger() links_to_announcement = ["pdf_url_1", "pdf_url_2"] # 替换为你的实际URL列表 for pdf_link in links_to_announcement: # 下载PDF到内存流 response = requests.get(pdf_link) if response.status_code == 200: pdf_stream = BytesIO(response.content) # 将PDF添加到合并队列 merger.append(pdf_stream) else: print(f"下载失败:{pdf_link},状态码:{response.status_code}") # 保存合并后的文件 with open("joined_pdfs.pdf", "wb") as output_file: merger.write(output_file) # 关闭合并器释放资源 merger.close()
方法2:使用PyMuPDF(fitz)库
PyMuPDF处理PDF的兼容性更强,性能更优,适合处理复杂或不同版本的PDF文件。
步骤1:安装依赖
pip install pymupdf requests
步骤2:实现代码
import requests import fitz from io import BytesIO # 创建空的输出PDF文档 output_pdf = fitz.open() links_to_announcement = ["pdf_url_1", "pdf_url_2"] # 替换为你的实际URL列表 for pdf_link in links_to_announcement: response = requests.get(pdf_link) if response.status_code == 200: # 读取下载的PDF内容 input_pdf = fitz.open("pdf", BytesIO(response.content)) # 将所有页面插入到输出PDF output_pdf.insert_pdf(input_pdf) input_pdf.close() else: print(f"下载失败:{pdf_link},状态码:{response.status_code}") # 保存合并结果 output_pdf.save("joined_pdfs.pdf") output_pdf.close()
注意事项
- 必须验证下载状态:添加
response.status_code检查,避免把错误页面(如404、500的HTML内容)当作PDF合并,导致最终文件损坏。 - 处理大文件时,建议将PDF临时保存到本地磁盘,避免内存占用过高。
内容的提问来源于stack exchange,提问作者KawaiKx
相关产品推荐
相关产品推荐

