From 0ec40f66ebf079d0d2a16da6cdd0d48f7c11a3c5 Mon Sep 17 00:00:00 2001 From: Cayo Puigdefabregas Date: Mon, 8 Jan 2024 20:11:41 +0100 Subject: [PATCH] add sign of pdf --- examples/signerDNIe004.pfx | Bin 0 -> 3694 bytes ...Model_Certificat_html_58d7f7eeb828cf29.jpg | Bin 0 -> 16198 bytes ...Model_Certificat_html_7a0214c6fc8f2309.jpg | Bin 0 -> 56367 bytes idhub/user/views.py | 110 ++++++++++++++++++ requirements.txt | 10 ++ 5 files changed, 120 insertions(+) create mode 100644 examples/signerDNIe004.pfx create mode 100644 idhub/static/images/4_Model_Certificat_html_58d7f7eeb828cf29.jpg create mode 100644 idhub/static/images/4_Model_Certificat_html_7a0214c6fc8f2309.jpg diff --git a/examples/signerDNIe004.pfx b/examples/signerDNIe004.pfx new file mode 100644 index 0000000000000000000000000000000000000000..a141358ad278f1743aa6ee8509bef319e2010a40 GIT binary patch literal 3694 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 ZU|q+MQmaBY_B&q_@VZ&uTYnAve*w@4p#A^= literal 0 HcmV?d00001 diff --git a/idhub/static/images/4_Model_Certificat_html_58d7f7eeb828cf29.jpg b/idhub/static/images/4_Model_Certificat_html_58d7f7eeb828cf29.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2a285a9d11cb072745863432d32ab9b826e57f3b GIT binary patch literal 16198 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 Lw)S_Obi)4tI^#pC literal 0 HcmV?d00001 diff --git a/idhub/static/images/4_Model_Certificat_html_7a0214c6fc8f2309.jpg b/idhub/static/images/4_Model_Certificat_html_7a0214c6fc8f2309.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9b954dd560c310a769c91d788577a73174abafed GIT binary patch literal 56367 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 literal 0 HcmV?d00001 diff --git a/idhub/user/views.py b/idhub/user/views.py index e6e28dc..fe6bb60 100644 --- a/idhub/user/views.py +++ b/idhub/user/views.py @@ -1,5 +1,16 @@ +import os +import base64 +import qrcode import logging +import weasyprint +import qrcode.image.svg +from io import BytesIO +from pathlib import Path +from pyhanko.sign import fields, signers +from pyhanko import stamp +from pyhanko.pdf_utils import text +from pyhanko.pdf_utils.incremental_writer import IncrementalPdfFileWriter from django.utils.translation import gettext_lazy as _ from django.views.generic.edit import ( UpdateView, @@ -112,6 +123,105 @@ class CredentialView(MyWallet, TemplateView): class CredentialJsonView(MyWallet, TemplateView): + template_name = "certificates/4_Model_Certificat.html" + subtitle = _('Credential management') + icon = 'bi bi-patch-check-fill' + file_name = "certificate.pdf" + _pss = '123456' + + def get(self, request, *args, **kwargs): + # pk = kwargs['pk'] + # self.object = get_object_or_404( + # VerificableCredential, + # pk=pk, + # user=self.request.user + # ) + # return self.render_to_response(context=self.get_context_data()) + + data = self.build_certificate() + doc = self.insert_signature(data) + import pdb; pdb.set_trace() + response = HttpResponse(doc, content_type="application/pdf") + response['Content-Disposition'] = 'attachment; filename={}'.format(self.file_name) + return response + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + this_folder = str(Path.cwd()) + path_img_sig = "idhub/static/images/4_Model_Certificat_html_58d7f7eeb828cf29.jpg" + img_signature = next(Path.cwd().glob(path_img_sig)) + with open(img_signature, 'rb') as _f: + img_sig = base64.b64encode(_f.read()).decode('utf-8') + + path_img_head = "idhub/static/images/4_Model_Certificat_html_7a0214c6fc8f2309.jpg" + img_header= next(Path.cwd().glob(path_img_head)) + with open(img_header, 'rb') as _f: + img_head = base64.b64encode(_f.read()).decode('utf-8') + + qr = self.generate_qr_code("http://localhost") + context.update({ + # 'object': self.object, + "image_signature": img_sig, + "image_header": img_head, + "qr": qr + }) + return context + + def build_certificate(self): + doc = self.render_to_response(context=self.get_context_data()) + doc.render() + pdf = weasyprint.HTML(string=doc.content) + return pdf.write_pdf() + + def generate_qr_code(self, data): + qr = qrcode.QRCode( + version=1, + error_correction=qrcode.constants.ERROR_CORRECT_L, + box_size=10, + border=4, + ) + qr.add_data(data) + qr.make(fit=True) + img_buffer = BytesIO() + img = qr.make_image(fill_color="black", back_color="white") + img.save(img_buffer, format="PNG") + + return base64.b64encode(img_buffer.getvalue()).decode('utf-8') + + def signer_init(self): + fname = "examples/signerDNIe004.pfx" + # pfx_buffer = BytesIO() + pfx_file= next(Path.cwd().glob(fname)) + s = signers.SimpleSigner.load_pkcs12( + pfx_file=pfx_file, passphrase=self._pss.encode('utf-8') + ) + return s + + def insert_signature(self, doc): + sig = self.signer_init() + _buffer = BytesIO() + _buffer.write(doc) + w = IncrementalPdfFileWriter(_buffer) + fields.append_signature_field( + w, sig_field_spec=fields.SigFieldSpec( + 'Signature', box=(150, 100, 450, 150) + ) + ) + + meta = signers.PdfSignatureMetadata(field_name='Signature') + pdf_signer = signers.PdfSigner( + meta, signer=sig, stamp_style=stamp.QRStampStyle( + stamp_text='Signed by: %(signer)s\nTime: %(ts)s\nURL: %(url)s', + text_box_style=text.TextBoxStyle() + ) + ) + _bf_out = BytesIO() + url = "https://localhost:8000/" + pdf_signer.sign_pdf(w, output=_bf_out, appearance_text_params={'url': url}) + return _bf_out.read() + + +class CredentialJsonView2(MyWallet, TemplateView): def get(self, request, *args, **kwargs): pk = kwargs['pk'] diff --git a/requirements.txt b/requirements.txt index 9b19238..23bc8ec 100644 --- a/requirements.txt +++ b/requirements.txt @@ -13,3 +13,13 @@ jsonref==1.1.0 pyld==2.0.3 more-itertools==10.1.0 dj-database-url==2.1.0 +PyPDF2 +svg2rlg +svglib +cairosvg +pypdf +pyhanko +qrcode +uharfbuzz==0.38.0 +fontTools==4.47.0 +weasyprint==60.2