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文件

问题是,当您写入类似文件的对象时,光标被设置为最后一个字节。只需将其移回开头,否则将像从空文件中读取一样