Python, JSignature и ReportLab
Я хочу записать подпись в PDF. Я использую JSignature и Reportlab. Мой код успешно работает для записи данных в файл и базу данных. Я просто не могу понять, как записать подпись на холст. Кто-нибудь успешно передавал подпись в холст?
Заранее спасибо.
Вот взгляд на мой код:
pdf.py
import io
from django.core.files.base import ContentFile
from reportlab.lib.units import inch
from reportlab.pdfgen import canvas
from reportlab.lib.utils import ImageReader
def create_pdf(parent):
# create a file-like buffer to receive PDF data
buffer = io.BytesIO()
# create the pdf object, using the buffer as its "file"
p = canvas.Canvas(buffer)
# create text
textobject = p.beginText()
# start text at top left of page
textobject.setTextOrigin(inch, 11*inch)
# set font and size
textobject.setFont("Helvetica-Bold", 18)
textobject.textLine("My Document")
textobject.textLine("")
# write page 1
textobject.setFont("Helvetica", 12)
p_name = f'Name: {participant.first_name} {participant.middle_initial} {participant.last_name}'
textobject.textLine(p_name)
sig = f'Signature:'
textobject.textLine(sig)
----insert signature here----
# write created text to canvas
p.drawText(textobject)
# close the pdf canvas
p.showPage()
p.save()
buffer.seek(0)
# get content of buffer
pdf_data = buffer.getvalue()
# save to django File object
file_data = ContentFile(pdf_data)
# name the file
file_data.name = f'{participant.last_name}.pdf'
#
participant.pdf = file_data
participant.save()
Модель:
class Participant(models.Model):
first_name = models.CharField(max_length=50)
middle_initial = models.CharField(max_length=50, blank=True)
last_name = models.CharField(max_length=50, blank=True)
signature = JSignatureField()
pdf = models.FileField(blank=True, null=True)
Для тех, кто интересуется, как я смог заставить это работать. Основная проблема заключалась в том, что изображение было полностью черным при извлечении его в PDF. Вот что требуется:
Ваш взгляд:
- Используйте функцию Jsignature draw_signature и получите изображение: .
rsr_image = draw_signature(signature)
- сохранить подпись в формате PNG, а затем сохранить
# save signature as png to prevent darkening, save to model
rsr_file_name = str(new_parent.id)+'_rsr.png'
buffer = BytesIO()
rsr_image.save(buffer, 'PNG')
new_parent.rsr_image.save(rsr_file_name, File(buffer))
Создайте следующую функцию, чтобы...
- Откройте изображение, создайте новый фон для изображения и сохраните его.
def get_jpeg_image(new_parent):
# open png image
png_image = Image.open(new_parent.rsr_image)
# create new image with 'RGB' mode which is compatible with jpeg,
# with same size as old and with white(255,255,255) background
bg = Image.new("RGB", png_image.size, (255, 255, 255))
# paste old image pixels in new background
bg.paste(png_image, png_image)
# give image file name
file_name_jpeg = str(new_parent.id)+'.jpg'
bg.save(file_name_jpeg)
return file_name_jpeg
Обратитесь к этой функции внутри вашей функции создания PDF для преобразования PNG в JPG
jpeg_image = get_jpeg_image(participant)
Надеюсь, это кому-нибудь поможет.