为什么我必须从 BytesIO 转换字节,然后转换回 BytesIO,以便它可以作为 PDF 文件响应读取?



我使用PyPDF4来合并pdf文件,然后我使用合并的pdf作为HttpResponse。 我使用BytesIOPdfFileMerger中获取结果。

我用这段代码让它工作

def mergePDF(listOfPDFFile):
merger = PdfFileMerger()
for file in listOfPDFFile:
merger.append(PdfFileReader(file))
_byteIo = BytesIO()
merger.write(_byteIo)
return _byteIo.getvalue()

然后,当我使用APIView中的方法将合并的 pdf 作为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对象才能使其正常工作? 最初我返回_byteIO实例,然后直接将实例传递给FileWrapper但它输出 0Kb 文件。

因此,我将_byteIO实例转换为bytes然后在 APIView 中创建另一个BytesIO实例以使其正常工作。

如何简化代码?

在你的mergePDF函数中,而不是返回

return _byteIo.getvalue()

做一些事情,大意是

_byteIo.seek(0)
return _byteIo

最初我返回_byteIO实例,然后直接传递 实例到文件包装器,但它输出 0Kb 文件。

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

最新更新