2 votes

Comment crypter un fichier PDF sous macOS par programmation ?

Mon logiciel génère des fichiers PDF en utilisant les API intégrées (PDFKit).

J'ai maintenant besoin de créer un fichier PDF protégé par mot de passe (par cryptage) à partir de ce fichier, de manière programmatique. PDFKit ne semble pas le supporter.

J'avais espéré pouvoir utiliser AppleScript pour demander à Aperçu d'ouvrir le PDF et de l'enregistrer avec un mot de passe, mais il semble que le dictionnaire AppleScript d'Aperçu ne propose pas d'option pour cela.

Quelles sont mes options ?

5voto

benwiggy Points 288

Si vous êtes déjà familiarisé avec les API PDFKit d'Apple, le chiffrement d'un PDF est très facile.

Créez un dictionnaire auxiliaire avec des clés/valeurs pour des éléments tels que kCGPDFContextOwnerPassword y kCGPDFContextAllowsCopying . Ensuite, utilisez PDFDocument 's writeToFile:withOptions méthode.

https://developer.apple.com/documentation/pdfkit/pdfdocument/1436053-writetofile?language=objc

Voici un script en python qui crypte les PDF, mais il devrait être très facile de le traduire en Swift ou ObjC. Le dictionnaire est nommé ' options '.

Sur la ligne de commande, fournissez les noms de fichiers PDF comme arguments. Vous pouvez également l'utiliser dans une action Automator "Run Shell script".

#!/usr/bin/python
# coding: utf-8

import os, sys
from Quartz import PDFDocument, kCGPDFContextAllowsCopying, kCGPDFContextAllowsPrinting, kCGPDFContextUserPassword, kCGPDFContextOwnerPassword
from CoreFoundation import (NSURL)

copyPassword = "12345678" # Password for copying and printing
openPassword = copyPassword # Password to open the file.
# Set openPassword as '' to allow opening with no password.

def encrypt(filename):
    filename =filename.decode('utf-8')
    if not filename:
        print 'Unable to open input file'
        sys.exit(2)
    shortName = os.path.splitext(filename)[0]
    outputfile = shortName+" locked.pdf"
    pdfURL = NSURL.fileURLWithPath_(filename)
    pdfDoc = PDFDocument.alloc().initWithURL_(pdfURL)
    if pdfDoc :
        options = { 
            kCGPDFContextAllowsCopying: False, 
            kCGPDFContextAllowsPrinting: False, 
            kCGPDFContextOwnerPassword: copyPassword,
            kCGPDFContextUserPassword: openPassword}
        pdfDoc.writeToFile_withOptions_(outputfile, options)
    return

if __name__ == "__main__":
    for filename in sys.argv[1:]:
        encrypt(filename)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X