【问题标题】:How to encrypt a PDF file on macOS programmatically如何以编程方式在 macOS 上加密 PDF 文件
【发布时间】:2019-02-18 02:22:49
【问题描述】:

我的软件使用内置 API (PDFKit) 生成 PDF 文件。

我现在需要以编程方式从中创建一个受密码保护(通过加密)的 PDF 文件。 PDFKit 似乎不支持。

我曾希望我可以使用 AppleScript 来告诉 Preview 打开 PDF,然后用密码保存它,但是 Preview 的 AppleScript 字典似乎没有提供这样的选项。 p>

我有什么选择?

【问题讨论】:

  • 您是否特别需要 PDF 加密(在预览中提供“密码”输入字段的加密),或者您是否可以使用 PGP 之类的东西加密/解密文件?
  • 如果您不想重写您的文档,您可以编译一个现有的解决方案,例如 this one (VersyPDF, just Googled it) 并使用 PDFKit/加载/加密/保存进行保存。缺点当然是临时未加密的中间文件。如果可能,请使用内存存储或其他受保护的存储。另一个缺点可能是额外的内存和处理器使用,但是嘿,也许你有很多。只是在这里思考。
  • 看来我需要澄清为什么我需要加密 PDF 文件:这样我就可以通过电子邮件将其发送给其他人,然后他们可以使用共享密码轻松解密它,而无需特殊软件(例如作为 PGP)。在原始计算机上临时拥有未加密的 PDF 不是问题,或者我没有提到 AppleScript 方法。感谢您提供指向 VersyPDF 的指针。我认为,如果您对此做出回答,那对每个人来说都会比评论更有用。

标签: macos pdf encryption


【解决方案1】:

如果您已经熟悉 Apple 的 PDFKit API,那么加密 PDF 非常简单。

为 kCGPDFContextOwnerPassword 和 kCGPDFContextAllowsCopying 等项目创建一个包含键/值的辅助字典。然后使用PDFDocument的writeToFile:withOptions方法。

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

这是一个可以加密 PDF 的 python 脚本,但它应该很容易将它翻译成 Swift 或 ObjC。字典名为“options”。

在命令行中,提供 PDF 的文件名作为参数。您也可以在 Automator 的“运行 Shell 脚本”操作中使用它。

#!/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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多