Почему я должен конвертировать байты из BytesIO, а затем конвертировать обратно в BytesIO, чтобы он мог быть прочитан как ответ файла PDF? - PullRequest
0 голосов
/ 22 октября 2018

Я использую 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, чтобы вернуть объединенный 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, но он выводит файл размером 0 КБ.

Поэтому я преобразую экземпляр _byteIO в bytes, а затем создаю еще один экземпляр BytesIO в APIView.чтобы заставить его работать.

Как я могу упростить код?

1 Ответ

0 голосов
/ 22 октября 2018

В вашей функции mergePDF вместо возврата

return _byteIo.getvalue()

Сделайте что-нибудь с эффектом

_byteIo.seek(0)
return _byteIo

Сначала я возвращаю экземпляр _byteIO, затем напрямую передаюэкземпляр в FileWrapper, но он выводит файл размером 0 КБ.

Проблема заключается в том, что при записи в файлоподобный объект курсор устанавливается на последний байт.Просто переместите его обратно в начало, иначе это будет похоже на чтение из пустого файла.

...