Как программно зашифровать файл PDF на macOS - PullRequest
0 голосов
/ 13 февраля 2019

Мое программное обеспечение генерирует файлы PDF с использованием встроенных API-интерфейсов (PDFKit).

Теперь мне нужно создать из него PDF-файл, защищенный паролем (посредством шифрования), программным путем.PDFKit, кажется, не поддерживает это.

Я надеялся, что смогу использовать AppleScript, чтобы сказать Preview, чтобы открыть PDF, а затем сохранить его с паролем, но, похоже, словарь Preview в AppleScript не предоставляетвариант для этого.

Какие у меня варианты?

1 Ответ

0 голосов
/ 17 февраля 2019

Если вы уже знакомы с API Apple PDFKit, то шифрование PDF очень просто.

Создать вспомогательный словарь с ключом / значениями для таких элементов, как kCGPDFContextOwnerPassword и kCGPDFContextAllowsCopying.Затем используйте метод PDFDocument writeToFile:withOptions.

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

Вот скрипт на python, который будет шифровать PDF-файлы, но его очень легко перевести на Swift или ObjC.Словарь называется 'options'.

В командной строке укажите имена файлов PDF в качестве аргументов.Вы также можете использовать это в действии 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...