Python 为什么我必须将字节从BytesIO转换成BytesIO,然后再转换回BytesIO,这样它就可以作为PDF文件响应读取?
我使用Python 为什么我必须将字节从BytesIO转换成BytesIO,然后再转换回BytesIO,这样它就可以作为PDF文件响应读取?,python,django-rest-framework,pypdf2,Python,Django Rest Framework,Pypdf2,我使用PyPDF4合并pdf文件,然后将合并后的pdf用作HttpResponse。 我使用BytesIO从PdfFileMerger获取结果 我用这个代码工作 def mergePDF(listOfPDFFile): merger = PdfFileMerger() for file in listOfPDFFile: merger.append(PdfFileReader(file)) _byteIo = BytesIO() merger.wr
PyPDF4
合并pdf文件,然后将合并后的pdf用作HttpResponse
。
我使用BytesIO
从PdfFileMerger
获取结果
我用这个代码工作
def mergePDF(listOfPDFFile):
merger = PdfFileMerger()
for file in listOfPDFFile:
merger.append(PdfFileReader(file))
_byteIo = BytesIO()
merger.write(_byteIo)
return _byteIo.getvalue()
然后,当我使用APIView
中的方法以HttpResponse
class DocumentBundlePDFView(APIView):
def get(self, request, format=None):
'''
here goes a process to assign list of document to documentList
'''
pdfBytes = mergePDF(documentList)
pdfFile = io.BytesIO(pdfBytes)
response = HttpResponse(FileWrapper(pdfFile), content_type='application/pdf')
return response
但是,为什么我必须创建两次BytesIO
对象才能让它工作呢?
最初,我返回\u byteIO
实例,然后直接将该实例传递给文件包装器
,但它会输出0Kb的文件
因此,我将\u byteIO
实例转换为字节
,然后在APIView中创建另一个BytesIO
实例以使其工作
如何简化代码 在
mergePDF
函数中,而不是返回
return _byteIo.getvalue()
做一些对…有影响的事
_byteIo.seek(0)
return _byteIo
最初,我返回_byteIO实例,然后直接传递
实例到FileWrapper,但它输出0Kb文件
问题是,当您写入类似文件的对象时,光标被设置为最后一个字节。只需将其移回开头,否则将像从空文件中读取一样