caerp-sign-pdf 2024.1.0__tar.gz → 2024.1.2__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.2/CURRENT_VERSION +1 -0
  2. {caerp_sign_pdf-2024.1.0 → caerp_sign_pdf-2024.1.2}/PKG-INFO +19 -5
  3. {caerp_sign_pdf-2024.1.0 → caerp_sign_pdf-2024.1.2}/README.rst +18 -4
  4. caerp_sign_pdf-2024.1.2/requirements.txt +1 -0
  5. {caerp_sign_pdf-2024.1.0 → caerp_sign_pdf-2024.1.2}/src/caerp_sign_pdf/public.py +32 -6
  6. {caerp_sign_pdf-2024.1.0 → caerp_sign_pdf-2024.1.2}/src/caerp_sign_pdf.egg-info/PKG-INFO +19 -5
  7. caerp_sign_pdf-2024.1.2/src/caerp_sign_pdf.egg-info/requires.txt +1 -0
  8. caerp_sign_pdf-2024.1.0/CURRENT_VERSION +0 -1
  9. caerp_sign_pdf-2024.1.0/requirements.txt +0 -1
  10. caerp_sign_pdf-2024.1.0/src/caerp_sign_pdf.egg-info/requires.txt +0 -1
  11. {caerp_sign_pdf-2024.1.0 → caerp_sign_pdf-2024.1.2}/LICENSE.txt +0 -0
  12. {caerp_sign_pdf-2024.1.0 → caerp_sign_pdf-2024.1.2}/MANIFEST.in +0 -0
  13. {caerp_sign_pdf-2024.1.0 → caerp_sign_pdf-2024.1.2}/setup.cfg +0 -0
  14. {caerp_sign_pdf-2024.1.0 → caerp_sign_pdf-2024.1.2}/setup.py +0 -0
  15. {caerp_sign_pdf-2024.1.0 → caerp_sign_pdf-2024.1.2}/src/caerp_sign_pdf/__init__.py +0 -0
  16. {caerp_sign_pdf-2024.1.0 → caerp_sign_pdf-2024.1.2}/src/caerp_sign_pdf/models.py +0 -0
  17. {caerp_sign_pdf-2024.1.0 → caerp_sign_pdf-2024.1.2}/src/caerp_sign_pdf.egg-info/SOURCES.txt +0 -0
  18. {caerp_sign_pdf-2024.1.0 → caerp_sign_pdf-2024.1.2}/src/caerp_sign_pdf.egg-info/dependency_links.txt +0 -0
  19. {caerp_sign_pdf-2024.1.0 → caerp_sign_pdf-2024.1.2}/src/caerp_sign_pdf.egg-info/not-zip-safe +0 -0
  20. {caerp_sign_pdf-2024.1.0 → caerp_sign_pdf-2024.1.2}/src/caerp_sign_pdf.egg-info/top_level.txt +0 -0
@@ -0,0 +1 @@
1
+ 2024.1.2
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: caerp_sign_pdf
3
- Version: 2024.1.0
3
+ Version: 2024.1.2
4
4
  Summary: caerp_sign_pdf
5
5
  Home-page: https://framagit.org/caerp/caerp_sign_pdf
6
6
  Author: Kilya
@@ -37,21 +37,35 @@ L'API publique est configurable dans CAERP au travers du fichier de configuratio
37
37
  caerp_sign_pdf
38
38
 
39
39
 
40
- ** Configurez le service `caerp.interfaces.ISignPDFService` **
40
+ ** Configurez le service **
41
41
 
42
42
  .. code-block:: console
43
43
 
44
- caerp.interfaces.ISignPDFService = caerp_sign_pdf.public.SignPDFService
44
+ caerp.services.sign_pdf_service = caerp_sign_pdf.public.SignPDFService
45
45
 
46
46
 
47
47
  ** Configurez le chemin vers le certificat à utiliser pour signer et sa clé secrète **
48
48
 
49
49
  .. code-block:: console
50
50
 
51
- caerp.sign_certificate_path=/path/to/certificate.pfx
52
- caerp.sign_certificate_passphrase=**************************
51
+ caerp.sign_certificate_path = /path/to/certificate.p12
52
+ caerp.sign_certificate_passphrase = **************************
53
53
 
54
54
 
55
55
  ** Configurez les journaux de `caerp_sign_pdf` **
56
56
 
57
57
  Voir la [documentation sur le module Python `logging`](https://docs.python.org/2/library/logging.html) pour le détail ainsi que les exemples dans le fichier development.ini.sample.
58
+
59
+
60
+
61
+ Vérification de la signature d'un document
62
+ ------------------------------------------
63
+
64
+ La plupart des clients PDF permettent de visualiser et contrôler la signature numérique des documents, mais pas tous : les navigateurs web ne les affichent pas par défaut, de même pour certaines applications mobiles ou volontairement très simple.
65
+
66
+ Sous linux la signature d'un document PDF peut être vérifiée facilement en ligne de commande grâce à l'utilitaire `pdfsig` de la librairie `poppler-utils` :
67
+
68
+ .. code-block:: console
69
+
70
+ pdfsig <monfichierpdf.pdf>
71
+
@@ -20,21 +20,35 @@ L'API publique est configurable dans CAERP au travers du fichier de configuratio
20
20
  caerp_sign_pdf
21
21
 
22
22
 
23
- ** Configurez le service `caerp.interfaces.ISignPDFService` **
23
+ ** Configurez le service **
24
24
 
25
25
  .. code-block:: console
26
26
 
27
- caerp.interfaces.ISignPDFService = caerp_sign_pdf.public.SignPDFService
27
+ caerp.services.sign_pdf_service = caerp_sign_pdf.public.SignPDFService
28
28
 
29
29
 
30
30
  ** Configurez le chemin vers le certificat à utiliser pour signer et sa clé secrète **
31
31
 
32
32
  .. code-block:: console
33
33
 
34
- caerp.sign_certificate_path=/path/to/certificate.pfx
35
- caerp.sign_certificate_passphrase=**************************
34
+ caerp.sign_certificate_path = /path/to/certificate.p12
35
+ caerp.sign_certificate_passphrase = **************************
36
36
 
37
37
 
38
38
  ** Configurez les journaux de `caerp_sign_pdf` **
39
39
 
40
40
  Voir la [documentation sur le module Python `logging`](https://docs.python.org/2/library/logging.html) pour le détail ainsi que les exemples dans le fichier development.ini.sample.
41
+
42
+
43
+
44
+ Vérification de la signature d'un document
45
+ ------------------------------------------
46
+
47
+ La plupart des clients PDF permettent de visualiser et contrôler la signature numérique des documents, mais pas tous : les navigateurs web ne les affichent pas par défaut, de même pour certaines applications mobiles ou volontairement très simple.
48
+
49
+ Sous linux la signature d'un document PDF peut être vérifiée facilement en ligne de commande grâce à l'utilitaire `pdfsig` de la librairie `poppler-utils` :
50
+
51
+ .. code-block:: console
52
+
53
+ pdfsig <monfichierpdf.pdf>
54
+
@@ -0,0 +1 @@
1
+ pyHanko[pkcs11,image-support,opentype,xmp]==0.25.0
@@ -4,12 +4,11 @@ import hashlib
4
4
 
5
5
  from io import BytesIO
6
6
  from pyhanko.pdf_utils.incremental_writer import IncrementalPdfFileWriter
7
- from pyhanko.sign import (
8
- fields,
9
- signers,
10
- )
7
+ from pyhanko.sign import fields, signers
11
8
  from pyhanko.sign.general import SigningError
12
9
  from pyhanko.stamp import TextStampStyle
10
+ from PyPDF4.pdf import PdfFileReader, PdfFileWriter, utils
11
+ from pyramid.httpexceptions import HTTPInternalServerError
13
12
 
14
13
  from caerp.views.files.controller import FileData
15
14
 
@@ -20,7 +19,6 @@ logger = logging.getLogger(f"caerp.{__name__}")
20
19
 
21
20
 
22
21
  class SignPDFService(object):
23
-
24
22
  def __init__(self, context, request):
25
23
  self.context = context
26
24
  self.request = request
@@ -52,6 +50,19 @@ class SignPDFService(object):
52
50
  """
53
51
  return hashlib.md5(file_data.getvalue()).hexdigest()
54
52
 
53
+ def _get_safe_pdf(self, file_data: BytesIO) -> str:
54
+ """
55
+ Create a new clean PDF buffer from the original
56
+ to avoid some format errors
57
+ """
58
+ writer = PdfFileWriter()
59
+ reader = PdfFileReader(file_data, strict=False)
60
+ num_pages = reader.getNumPages()
61
+ for page in range(num_pages):
62
+ writer.addPage(reader.getPage(page))
63
+ writer.write(file_data)
64
+ return file_data
65
+
55
66
  def sign(
56
67
  self, pdf_data: FileData, node_id: int = None, with_stamp: bool = False
57
68
  ) -> bool:
@@ -92,8 +103,23 @@ in config)"
92
103
  stamp_text="Signé par: %(signer)s\nLe: %(ts)s",
93
104
  border_width=2,
94
105
  )
106
+ else:
107
+ stamp = TextStampStyle(
108
+ stamp_text="",
109
+ border_width=0,
110
+ )
111
+
112
+ # Clean PDF before signing
113
+ try:
114
+ pdf_data.data = self._get_safe_pdf(pdf_data.data)
115
+ 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
+ )
95
121
 
96
- # Sign
122
+ # Sign PDF
97
123
  w = IncrementalPdfFileWriter(pdf_data.data, strict=False)
98
124
  try:
99
125
  fields.append_signature_field(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: caerp-sign-pdf
3
- Version: 2024.1.0
3
+ Version: 2024.1.2
4
4
  Summary: caerp_sign_pdf
5
5
  Home-page: https://framagit.org/caerp/caerp_sign_pdf
6
6
  Author: Kilya
@@ -37,21 +37,35 @@ L'API publique est configurable dans CAERP au travers du fichier de configuratio
37
37
  caerp_sign_pdf
38
38
 
39
39
 
40
- ** Configurez le service `caerp.interfaces.ISignPDFService` **
40
+ ** Configurez le service **
41
41
 
42
42
  .. code-block:: console
43
43
 
44
- caerp.interfaces.ISignPDFService = caerp_sign_pdf.public.SignPDFService
44
+ caerp.services.sign_pdf_service = caerp_sign_pdf.public.SignPDFService
45
45
 
46
46
 
47
47
  ** Configurez le chemin vers le certificat à utiliser pour signer et sa clé secrète **
48
48
 
49
49
  .. code-block:: console
50
50
 
51
- caerp.sign_certificate_path=/path/to/certificate.pfx
52
- caerp.sign_certificate_passphrase=**************************
51
+ caerp.sign_certificate_path = /path/to/certificate.p12
52
+ caerp.sign_certificate_passphrase = **************************
53
53
 
54
54
 
55
55
  ** Configurez les journaux de `caerp_sign_pdf` **
56
56
 
57
57
  Voir la [documentation sur le module Python `logging`](https://docs.python.org/2/library/logging.html) pour le détail ainsi que les exemples dans le fichier development.ini.sample.
58
+
59
+
60
+
61
+ Vérification de la signature d'un document
62
+ ------------------------------------------
63
+
64
+ La plupart des clients PDF permettent de visualiser et contrôler la signature numérique des documents, mais pas tous : les navigateurs web ne les affichent pas par défaut, de même pour certaines applications mobiles ou volontairement très simple.
65
+
66
+ Sous linux la signature d'un document PDF peut être vérifiée facilement en ligne de commande grâce à l'utilitaire `pdfsig` de la librairie `poppler-utils` :
67
+
68
+ .. code-block:: console
69
+
70
+ pdfsig <monfichierpdf.pdf>
71
+
@@ -0,0 +1 @@
1
+ pyHanko[image-support,opentype,pkcs11,xmp]==0.25.0
@@ -1 +0,0 @@
1
- 2024.1.0
@@ -1 +0,0 @@
1
- pyHanko[pkcs11,image-support,opentype,xmp]==0.20.1
@@ -1 +0,0 @@
1
- pyHanko[image-support,opentype,pkcs11,xmp]==0.20.1