Python中合并字节形式PDF失败:仅显示单个文件求助
问题原因与解决方案
问题原因
直接拼接两个PDF的字节对象是错误操作——PDF是具有复杂内部结构的文件格式,每个完整PDF都包含独立的文件头、交叉引用表、目录结构和文件尾标记。PDF阅读器只会解析第一个完整的PDF结构,后续拼接的字节内容会被视为无效数据忽略,因此最终仅显示第一个PDF。
解决方案
必须使用专门处理PDF的Python库来合并文件,以下是两种常用实现方式:
方式1:使用PyPDF2库
from PyPDF2 import PdfMerger import io # 将字节格式PDF转换为可读取的IO对象 pdf1_io = io.BytesIO(pdf1) pdf2_io = io.BytesIO(pdf2) # 初始化合并器并添加待合并PDF merger = PdfMerger() merger.append(pdf1_io) merger.append(pdf2_io) # 将合并结果写入字节流 output_stream = io.BytesIO() merger.write(output_stream) output_stream.seek(0) # 将指针移至流起始位置 # 构建响应返回 response = HttpResponse(output_stream.read(), content_type="application/pdf") response["Content-Disposition"] = 'attachment; filename="merged_form.pdf"'
方式2:使用PyMuPDF(fitz)库
PyMuPDF在PDF处理上性能更优,操作更灵活:
import fitz import io # 从字节流加载PDF文档 doc1 = fitz.open("pdf", pdf1) doc2 = fitz.open("pdf", pdf2) # 创建空文档用于合并 merged_doc = fitz.open() merged_doc.insert_pdf(doc1) merged_doc.insert_pdf(doc2) # 将合并后的文档转为字节流 merged_bytes = merged_doc.tobytes() # 构建响应返回 response = HttpResponse(merged_bytes, content_type="application/pdf") response["Content-Disposition"] = 'attachment; filename="merged_form.pdf"'
注意:使用前需安装对应库,执行pip install pypdf2或pip install pymupdf即可。
内容的提问来源于stack exchange,提问作者ViaTech
相关产品推荐
相关产品推荐

