caerp-sign-pdf 2024.1.2__tar.gz → 2024.1.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (20) hide show
  1. caerp_sign_pdf-2024.1.4/CURRENT_VERSION +1 -0
  2. {caerp_sign_pdf-2024.1.2 → caerp_sign_pdf-2024.1.4}/PKG-INFO +2 -1
  3. caerp_sign_pdf-2024.1.4/requirements.txt +1 -0
  4. {caerp_sign_pdf-2024.1.2 → caerp_sign_pdf-2024.1.4}/src/caerp_sign_pdf/public.py +36 -21
  5. {caerp_sign_pdf-2024.1.2 → caerp_sign_pdf-2024.1.4}/src/caerp_sign_pdf.egg-info/PKG-INFO +3 -2
  6. caerp_sign_pdf-2024.1.4/src/caerp_sign_pdf.egg-info/requires.txt +1 -0
  7. caerp_sign_pdf-2024.1.2/CURRENT_VERSION +0 -1
  8. caerp_sign_pdf-2024.1.2/requirements.txt +0 -1
  9. caerp_sign_pdf-2024.1.2/src/caerp_sign_pdf.egg-info/requires.txt +0 -1
  10. {caerp_sign_pdf-2024.1.2 → caerp_sign_pdf-2024.1.4}/LICENSE.txt +0 -0
  11. {caerp_sign_pdf-2024.1.2 → caerp_sign_pdf-2024.1.4}/MANIFEST.in +0 -0
  12. {caerp_sign_pdf-2024.1.2 → caerp_sign_pdf-2024.1.4}/README.rst +0 -0
  13. {caerp_sign_pdf-2024.1.2 → caerp_sign_pdf-2024.1.4}/setup.cfg +0 -0
  14. {caerp_sign_pdf-2024.1.2 → caerp_sign_pdf-2024.1.4}/setup.py +0 -0
  15. {caerp_sign_pdf-2024.1.2 → caerp_sign_pdf-2024.1.4}/src/caerp_sign_pdf/__init__.py +0 -0
  16. {caerp_sign_pdf-2024.1.2 → caerp_sign_pdf-2024.1.4}/src/caerp_sign_pdf/models.py +0 -0
  17. {caerp_sign_pdf-2024.1.2 → caerp_sign_pdf-2024.1.4}/src/caerp_sign_pdf.egg-info/SOURCES.txt +0 -0
  18. {caerp_sign_pdf-2024.1.2 → caerp_sign_pdf-2024.1.4}/src/caerp_sign_pdf.egg-info/dependency_links.txt +0 -0
  19. {caerp_sign_pdf-2024.1.2 → caerp_sign_pdf-2024.1.4}/src/caerp_sign_pdf.egg-info/not-zip-safe +0 -0
  20. {caerp_sign_pdf-2024.1.2 → caerp_sign_pdf-2024.1.4}/src/caerp_sign_pdf.egg-info/top_level.txt +0 -0
@@ -0,0 +1 @@
1
+ 2024.1.4
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: caerp_sign_pdf
3
- Version: 2024.1.2
3
+ Version: 2024.1.4
4
4
  Summary: caerp_sign_pdf
5
5
  Home-page: https://framagit.org/caerp/caerp_sign_pdf
6
6
  Author: Kilya
@@ -14,6 +14,7 @@ Classifier: Topic :: Internet :: WWW/HTTP
14
14
  Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application
15
15
  Description-Content-Type: text/x-rst
16
16
  License-File: LICENSE.txt
17
+ Requires-Dist: pyHanko[image-support,opentype,pkcs11,xmp]==0.25.1
17
18
 
18
19
  CAERP Sign PDF
19
20
  ======================================================
@@ -0,0 +1 @@
1
+ pyHanko[pkcs11,image-support,opentype,xmp]==0.25.1
@@ -4,11 +4,12 @@ import hashlib
4
4
 
5
5
  from io import BytesIO
6
6
  from pyhanko.pdf_utils.incremental_writer import IncrementalPdfFileWriter
7
+ from pyhanko.pdf_utils.xref import ObjectHeaderReadError
7
8
  from pyhanko.sign import fields, signers
8
9
  from pyhanko.sign.general import SigningError
9
10
  from pyhanko.stamp import TextStampStyle
10
- from PyPDF4.pdf import PdfFileReader, PdfFileWriter, utils
11
- from pyramid.httpexceptions import HTTPInternalServerError
11
+ from PyPDF4.pdf import PdfFileReader, PdfFileWriter
12
+ from pyramid.httpexceptions import HTTPUnsupportedMediaType
12
13
 
13
14
  from caerp.views.files.controller import FileData
14
15
 
@@ -18,6 +19,14 @@ from .models import PDFSignatureHistory
18
19
  logger = logging.getLogger(f"caerp.{__name__}")
19
20
 
20
21
 
22
+ ERROR_LOAD_CERTIFICATE_MSG = "Impossible de charger le certificat à utiliser \
23
+ pour signer numériquement le fichier. Veuillez contacter le support."
24
+
25
+ ERROR_PDF_FORMAT_MSG = "Le fichier PDF ne peut pas être signé numériquement \
26
+ car son format n'est pas correct. Vous pouvez essayer de l'imprimer dans un \
27
+ nouveau fichier PDF avant de le recharger."
28
+
29
+
21
30
  class SignPDFService(object):
22
31
  def __init__(self, context, request):
23
32
  self.context = context
@@ -89,11 +98,11 @@ class SignPDFService(object):
89
98
  passphrase=self._get_certificate_passphrase().encode(),
90
99
  )
91
100
  if not signer:
92
- raise Exception(
101
+ logger.error(
93
102
  "Unable to load certificate for signing PDF files (check \
94
- 'caerp.sign_certificate_path' and 'caerp.sign_certificate_passphrase' \
95
- in config)"
103
+ 'caerp.sign_certificate_path' and 'caerp.sign_certificate_passphrase' in config)"
96
104
  )
105
+ raise Exception(ERROR_LOAD_CERTIFICATE_MSG)
97
106
 
98
107
  # Prepare stamp (if needed)
99
108
  stamp = None
@@ -109,21 +118,18 @@ in config)"
109
118
  border_width=0,
110
119
  )
111
120
 
112
- # Clean PDF before signing
121
+ # Open original PDF
113
122
  try:
114
123
  pdf_data.data = self._get_safe_pdf(pdf_data.data)
124
+ pdf_writer = IncrementalPdfFileWriter(pdf_data.data, strict=False)
115
125
  except Exception as error:
116
- logger.error(f"Unknown error while cleaning original PDF file : {error}")
117
- raise HTTPInternalServerError(
118
- "Le fichier PDF ne peut pas être traité car son format n'est pas \
119
- correct. Vous pouvez essayer de le réimprimer dans un nouveau fichier PDF."
120
- )
126
+ logger.error(f"Error while opening original PDF file : {error}")
127
+ raise HTTPUnsupportedMediaType(ERROR_PDF_FORMAT_MSG)
121
128
 
122
- # Sign PDF
123
- w = IncrementalPdfFileWriter(pdf_data.data, strict=False)
129
+ # Add signature field on the PDF
124
130
  try:
125
131
  fields.append_signature_field(
126
- w,
132
+ pdf_writer,
127
133
  sig_field_spec=fields.SigFieldSpec(
128
134
  "SignatureCAERP", box=(445, 800, 580, 830)
129
135
  ),
@@ -131,13 +137,22 @@ correct. Vous pouvez essayer de le réimprimer dans un nouveau fichier PDF."
131
137
  except SigningError:
132
138
  logger.warn("File is already signed, nothing to do")
133
139
  return True
134
- meta = signers.PdfSignatureMetadata(field_name="SignatureCAERP")
135
- pdf_signer = signers.PdfSigner(
136
- meta,
137
- signer=signer,
138
- stamp_style=stamp,
139
- )
140
- pdf_data.data = pdf_signer.sign_pdf(w)
140
+ except ObjectHeaderReadError as error:
141
+ logger.error(f"Error while reading Xref header : {error}")
142
+ raise HTTPUnsupportedMediaType(ERROR_PDF_FORMAT_MSG)
143
+
144
+ # Sign PDF
145
+ try:
146
+ meta = signers.PdfSignatureMetadata(field_name="SignatureCAERP")
147
+ pdf_signer = signers.PdfSigner(
148
+ meta,
149
+ signer=signer,
150
+ stamp_style=stamp,
151
+ )
152
+ pdf_data.data = pdf_signer.sign_pdf(pdf_writer)
153
+ except Exception as error:
154
+ logger.error(f"Error while signing PDF file : {error}")
155
+ raise HTTPUnsupportedMediaType(ERROR_PDF_FORMAT_MSG)
141
156
  logger.info(
142
157
  "File '{}' signed successfully by {} !".format(
143
158
  pdf_data.name, signer.subject_name
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
- Name: caerp-sign-pdf
3
- Version: 2024.1.2
2
+ Name: caerp_sign_pdf
3
+ Version: 2024.1.4
4
4
  Summary: caerp_sign_pdf
5
5
  Home-page: https://framagit.org/caerp/caerp_sign_pdf
6
6
  Author: Kilya
@@ -14,6 +14,7 @@ Classifier: Topic :: Internet :: WWW/HTTP
14
14
  Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application
15
15
  Description-Content-Type: text/x-rst
16
16
  License-File: LICENSE.txt
17
+ Requires-Dist: pyHanko[image-support,opentype,pkcs11,xmp]==0.25.1
17
18
 
18
19
  CAERP Sign PDF
19
20
  ======================================================
@@ -0,0 +1 @@
1
+ pyHanko[image-support,opentype,pkcs11,xmp]==0.25.1
@@ -1 +0,0 @@
1
- 2024.1.2
@@ -1 +0,0 @@
1
- pyHanko[pkcs11,image-support,opentype,xmp]==0.25.0
@@ -1 +0,0 @@
1
- pyHanko[image-support,opentype,pkcs11,xmp]==0.25.0