Как использовать данные 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
параметр, но он устарел