Используйте AWS Chalice для создания PDF

Я ищу создание внутренних API-интерфейсов для меня, которые бы генерировали PDF-файлы как вызов API и использовали чашу для развертывания как безсерверные. Пока у меня есть код, который я застрял с ошибкой 500, что я не могу отладить:

from chalice import Chalice, Response

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
from reportlab.lib.pagesizes import landscape

from io import BytesIO

app = Chalice( app_name = 'printago' )


@app.route( '/' )
def index( ) :

    buff = BytesIO( )
    # p = canvas.Canvas( 'someName.pdf', pagesize = landscape( letter ) )
    p = canvas.Canvas( buff, pagesize = landscape( letter ) )

    p.setFont( 'Helvetica', 40, leading = None )
    p.drawCentredString( 415, 300, 'Hallo YOU' )
    p.showPage( )
    p.save( )

    pdf = buff.getvalue( )
    buff.close( )

    return Response( pdf, status_code = 200, headers = { 'Content-Type' : 'application/pdf' } )

Что я делаю неправильно?

У меня есть виртуальная среда для этого проекта, в нем установлена ​​reportlab через pip, и после включения отладки возникает ошибка Невозможно импортировать модуль

'app': No module named reportlab.pdfgen

И я смог передать ошибку "Нет модуля", добавив reportlab в файл Requirments.txt, однако после этого появилась другая ошибка, связанная с сериализацией JSON и utf-8.

An error occurred during JSON serialization of response: 'utf8' codec can't decode byte 0x93 in position 10: invalid start byte

Я хотел бы добавить, что работает должным образом при локальном тестировании с командой chalice local

1 ответ

Мы также получили can't decode byte 0x93 in position 10: invalid start byte ошибка, которая оказалась заголовком, помещенным в сам сгенерированный PDF с помощью reportlab. Первые две строки PDF-файла при открытии в vim выглядят так:

%PDF-1.4
%<93><8c><8b><9e> ReportLab Generated PDF document http://www.reportlab.com

Наш обходной путь состоял в том, чтобы изменить способ отправки PDF клиенту в нашем скрипте cgi на основе python:

import codecs
print(codecs.open("/full/path/to/some.pdf", "r", encoding="utf-8", errors="ignore").read())

и ключ там был errors="ignore"... что уродливо и плохо, и мы сделали это приоритетом для замены.

Другие вопросы по тегам