Как использовать данные PyFPDF в формате PDF без необходимости экспортировать (выводить) их в формате PDF?

Я использую PyFPDF для автоматического создания пользовательских PDF-документов, когда пользователь регистрируется с помощью моего специально созданного приложения Django. PDF-файлы содержат информацию о регистрации этого человека. Я не хочу сохранять PDF-файл в виде отдельного PDF-файла для каждого зарегистрировавшегося человека - я хочу отправить его PDF-файл по почте сразу после его форматирования.

pdf = FPDF()
pdf.add_page()
pdf.image(file_path, 0, 0, 210)
pdf.set_text_color(1, 164, 206)
pdf.set_font("helvetica", size=26)
pdf.ln(142)
pdf.cell(0, 0, txt=name, ln=4, align="C")

Это то, что у меня есть сейчас для форматирования PDF, где name - значение, полученное при регистрации каждого отдельного пользователя.

Это то, что идет сразу после, и то, что я хочу заменить:

val = uuid.uuid4().hex
pdf.output(val+".pdf")

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

Я бы предпочел использовать pdf переменную непосредственно при отправке каждого электронного письма, как показано ниже:

finalEmail = EmailMessage(
    subject,
    plain_message,
    from_email,
    [email]
)
finalEmail.attach("Registration.pdf", pdf)
finalEmail.send()

Однако Django не принимает это как допустимый тип вложения, поскольку это по-прежнему переменная FPDF.

ожидаемый байтовый объект, а не FPDF

Как мне это сделать?

4 ответа

Решение

В документации вы можете увидеть параметрS что дает его как строку байтов

content = pdf.output(val+".pdf", 'S')

и теперь вы можете использовать content создать вложение в электронном письме.

Работает на меня: content = BytesIO(bytes(pdf.output(dest = 'S'), encoding='latin1'))

Я изменяю ответ от IX8 следующим образом:

content = io.BytesIO(bytes(pdf.output(dest = 'S'), encoding='latin1'))
with open("Registration.pdf", "wb") as temp_file:
temp_file.write(content.getvalue())
теперь вы можете использовать Registration.pdf там, где хотите.

fpdf2является поддерживаемой альтернативой старому fpdf.

Установите его через

      pip install fpdf2

Там это работает так:

      from io import BytesIO
from fpdf import FPDF

pdf = FPDF()
pdf.add_page()
pdf.set_font("helvetica", "B", 16)
pdf.cell(40, 10, "Hello World!")
byte_string = pdf.output()
stream BytesIO(byte_string)

вывод все еще имеетdestпараметр, но он устарел

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