首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python、JSignature和ReportLab

Python、JSignature和ReportLab
EN

Stack Overflow用户
提问于 2022-07-24 02:49:44
回答 1查看 61关注 0票数 0

我想给PDF写个签名。我正在使用JSignature和Reportlab。我的代码成功地将数据写入文件和数据库。我只是想不出怎么把签名写到画布上。有人把签名成功地传递到画布上了吗?

提前谢谢你。

下面看看我的代码:

pdf.py

代码语言:javascript
复制
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()

型号:

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-04 04:43:38

对那些对我如何发挥作用感兴趣的人来说。最主要的问题是,当将图像拖进PDF时,图像将完全是黑色的。以下是所需的内容:

在你看来:

  • 使用j签名draw_signature函数并获取图像:

代码语言:javascript
复制
rsr_image = draw_signature(signature)

  • 将签名保存为PNG,然后存储

代码语言:javascript
复制
            # 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))

创建以下函数,以便…

  • 打开图像,为图像创建一个新的背景,并保存它。

代码语言:javascript
复制
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

代码语言:javascript
复制
jpeg_image = get_jpeg_image(participant)

希望这能帮上忙。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73095462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档