PDF - 设置受密码保护的打印、复制、粘贴选项?

2024-04-05

我正在寻找一个 Python 库,它允许我在现有 PDF 文件上设置受密码保护的打印、复制、粘贴选项。

我尝试过的

我查看了reportlab pdfencrypt模块:这正是我需要的选项,但是开源版本受到严格限制 - 甚至无法设置真正的密码,并且许可证不是一个选项(超过1000英镑/年) - 这将是数量相对较低(每年处理


你(就像我一样)一定想过——WTF"-3904"来自凯文的answer https://stackoverflow.com/a/36016018/7797962.

请放心 - 我有答案)。

我在 PDF 1.6 参考中找到了它。你可以在这里得到它:https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdf_reference_archive/PDFReference16.pdf https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdf_reference_archive/PDFReference16.pdf

3.5节,第99页:

32 位整数,包含一组指定哪个访问的标志 当用户打开文档时应授予权限 使用权。表 3.20 显示了这些标志的含义。位位置 标志字内的编号从 1(低位)到 32 (高阶)。任意位置的 1 位启用相应的访问 允许。哪些位是有意义的,以及在某些情况下它们是如何有意义的 解释,取决于安全处理程序的修订号 (在加密字典的 R 条目中指定)。

*注意:PDF 整数对象在内部以带符号的二进制补码形式表示。由于所有保留的高阶标志位 加密字典的P值要求为1,该值 必须指定为负整数。例如,假设 安全处理程序的修订版 2,值 -44 允许打印和 复制但不允许修改内容和注释。

So, P是许可!请检查该文件中的表格。-44 is 11010100以位表示。

我是这样写的(允许打印和复制,但不允许修改内容和注释):

from hashlib import md5

from PyPDF4 import PdfFileReader, PdfFileWriter
from PyPDF4.generic import NameObject, DictionaryObject, ArrayObject, \
    NumberObject, ByteStringObject
from PyPDF4.pdf import _alg33, _alg34, _alg35
from PyPDF4.utils import b_


def encrypt(writer_obj: PdfFileWriter, user_pwd, owner_pwd=None, use_128bit=True):
    """
    Encrypt this PDF file with the PDF Standard encryption handler.

    :param str user_pwd: The "user password", which allows for opening
        and reading the PDF file with the restrictions provided.
    :param str owner_pwd: The "owner password", which allows for
        opening the PDF files without any restrictions.  By default,
        the owner password is the same as the user password.
    :param bool use_128bit: flag as to whether to use 128bit
        encryption.  When false, 40bit encryption will be used.  By default,
        this flag is on.
    """
    import time, random
    if owner_pwd == None:
        owner_pwd = user_pwd
    if use_128bit:
        V = 2
        rev = 3
        keylen = int(128 / 8)
    else:
        V = 1
        rev = 2
        keylen = int(40 / 8)
    # permit copy and printing only:
    P = -44
    O = ByteStringObject(_alg33(owner_pwd, user_pwd, rev, keylen))
    ID_1 = ByteStringObject(md5(b_(repr(time.time()))).digest())
    ID_2 = ByteStringObject(md5(b_(repr(random.random()))).digest())
    writer_obj._ID = ArrayObject((ID_1, ID_2))
    if rev == 2:
        U, key = _alg34(user_pwd, O, P, ID_1)
    else:
        assert rev == 3
        U, key = _alg35(user_pwd, rev, keylen, O, P, ID_1, False)
    encrypt = DictionaryObject()
    encrypt[NameObject("/Filter")] = NameObject("/Standard")
    encrypt[NameObject("/V")] = NumberObject(V)
    if V == 2:
        encrypt[NameObject("/Length")] = NumberObject(keylen * 8)
    encrypt[NameObject("/R")] = NumberObject(rev)
    encrypt[NameObject("/O")] = ByteStringObject(O)
    encrypt[NameObject("/U")] = ByteStringObject(U)
    encrypt[NameObject("/P")] = NumberObject(P)
    writer_obj._encrypt = writer_obj._addObject(encrypt)
    writer_obj._encrypt_key = key


unmeta = PdfFileReader('my_pdf.pdf')

writer = PdfFileWriter()
writer.appendPagesFromReader(unmeta)
encrypt(writer, '1', '123')

with open('my_pdf_encrypted.pdf', 'wb') as fp:
    writer.write(fp)

如果您喜欢我的回答,请投票;)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PDF - 设置受密码保护的打印、复制、粘贴选项? 的相关文章

  • 递归 lambda 表达式可能吗?

    我正在尝试编写一个调用自身的 lambda 表达式 但我似乎找不到任何语法 或者即使它是可能的 本质上我想将以下函数传输到以下 lambda 表达式中 我意识到这是一个愚蠢的应用程序 它只是添加 但我正在探索可以在 python 中使用 l
  • 用缺失的日期填充其他列 Nan Pandas DataFrame

    我实际上是从几个 Excel 文件中提取数据来监控我的每日卡路里摄入量 我设法使用列表理解来生成日期 我尝试使用合并或连接 但它不起作用 ValueError 您正在尝试合并对象和 float64 列 date list 2021 05 2
  • 如何检查python xlrd库中的excel文件是否有效

    有什么办法与xlrd库来检查您使用的文件是否是有效的 Excel 文件 我知道还有其他库可以检查文件头 我可以使用文件扩展名检查 但为了多平台性我想知道是否有任何我可以使用的功能xlrd库本身在尝试打开文件时可能会返回类似 false 的内
  • 检查 Python 中的可迭代对象中的所有元素的谓词是否计算为 true

    我很确定有一个常见的习语 但我无法通过谷歌搜索找到它 这是我想做的 用Java Applies the predicate to all elements of the iterable and returns true if all ev
  • 如何在Python中同时运行两只乌龟?

    我试图让两只乌龟一起移动 而不是一只接着另一只移动 例如 a turtle Turtle b turtle Turtle a forward 100 b forward 100 但这只能让他们一前一后地移动 有没有办法让它们同时移动 有没有
  • pyspark 数据框中的自定义排序

    是否有推荐的方法在 pyspark 中实现分类数据的自定义排序 我理想地寻找 pandas 分类数据类型提供的功能 因此 给定一个数据集Speed列 可能的选项是 Super Fast Fast Medium Slow 我想实现适合上下文的
  • 如果未引发异常,则通过 Python 单元测试

    在Python中unittest框架 是否有一种方法可以在未引发异常的情况下通过单元测试 否则会因 AssertRaise 而失败 如果我正确理解你的问题 你could做这样的事情 def test does not raise on va
  • Pandas:如果单元格包含特定文本则删除行

    pandas 中的这段代码不起作用 如果该列包含提供的任何文本 数字 我希望它删除该行 目前 我只能在单元格与我的代码中传递的确切文本匹配时才能使其工作 因为它只删除显示 Fin 的单元格不是金融或金融 df2 df df Team Fin
  • 在没有模型的情况下将自定义页面添加到 django admin

    我正在尝试在没有模型关联的情况下向管理员添加自定义页面 这就是我迄今为止所取得的成就 class MyCustomAdmin AdminSite def get urls self from django conf urls import
  • 在 Django OAuth Toolkit 中安全创建新应用程序

    如何将 IsAdminUser 权限添加到 Django OAuth Toolkit 中的 o applications 视图 REST FRAMEWORK DEFAULT PERMISSION CLASSES rest framework
  • 一段时间后终止线程的最 Pythonic 方法

    我想在线程中运行一个进程 它正在迭代一个大型数据库表 当线程运行时 我只想让程序等待 如果该线程花费的时间超过 30 秒 我想终止该线程并执行其他操作 通过终止线程 我的意思是我希望它停止活动并优雅地释放资源 我认为最好的方法是通过Thre
  • 从扫描文档中提取行表 opencv python

    我想从扫描的表中提取信息并将其存储为 csv 现在我的表提取算法执行以下步骤 应用倾斜校正 应用高斯滤波器进行去噪 使用 Otsu 阈值进行二值化 进行形态学开局 Canny 边缘检测 进行霍夫变换以获得表格行 去除重复行 10像素范围内相
  • Tensorflow 与 Keras 的兼容性

    我正在使用 Python 3 6 和 Tensorflow 2 0 并且有一些 Keras 代码 import keras from keras models import Sequential from keras layers impo
  • 使用Python计算目录的大小?

    在我重新发明这个特殊的轮子之前 有没有人有一个很好的例程来使用 Python 计算目录的大小 如果例程能够很好地以 Mb Gb 等格式格式化大小 那就太好了 这会遍历所有子目录 总结文件大小 import os def get size s
  • 通过索引访问Python字典的元素

    考虑一个像这样的字典 mydict Apple American 16 Mexican 10 Chinese 5 Grapes Arabian 25 Indian 20 例如 我如何访问该字典的特定元素 例如 我想在对 Apple 的第一个
  • 如何在 pandas 中使用 read_fwf 跳过空行?

    I use pandas read fwf http pandas pydata org pandas docs stable generated pandas read fwf htmlPython pandas 0 19 2 中的函数读
  • 在系统托盘中隐藏 tkinter 窗口 [重复]

    这个问题在这里已经有答案了 我正在制作一个程序来提醒我朋友的生日 这样我就不会忘记祝福他们 为此 我制作了两个 tkinter 窗口 1 First one is for entering name and birth date 2 Sec
  • 当数据库不是 Django 模型时,是否可以使用数据库中的表?

    是否可以从应用程序数据库中的表获取查询集 该表不是应用程序中的模型 如果我有一个不是名为 cartable 的模型的表 从概念上讲 我想这样做 myqueryset cartable objects all 有没有相对简单的方法来做到这一点
  • 如何根据第一列创建新列,同时考虑Python Pandas中字母和列表的大小? [复制]

    这个问题在这里已经有答案了 我在 Python Pandas 中有 DataFrame 如下所示 col1 John Simon prd agc Ann White BeN and Ann bad list Ben Wayne 我需要这样做
  • 从 pandas DataFrame 中删除少于 K 个连续 NaN

    我正在处理时间序列数据 我在从数据帧列中删除小于或等于阈值的连续 NaN 时遇到问题 我尝试查看一些链接 例如 标识连续 NaN 出现的位置以及计数 Pandas NaN 孔的游程长度 https stackoverflow com que

随机推荐

  • OpenXML - Cell.DateType 为 null

    我无法确定单元格何时是日期 我注意到 DataType 为空 所以我无法区分它是否是日期数字 我正在使用下一个代码来提取单元格 WorksheetPart worksheetPart WorksheetPart workbookPart G
  • Scala 的 '::' 运算符,它是如何工作的?

    在 Scala 中 我可以创建一个案例类 case class Foo x Int 然后将其放入列表中 如下所示 List Foo 42 现在 这里没什么奇怪的了 以下内容对我来说很奇怪 运营商 是列表上的函数 对吗 对于 Scala 中任
  • 如何加密配置文件、grails [和 java] 中的密码

    我正在寻找如何在 grails 中逐步保护配置文件中的密码 这意味着保护 Config groovy 和 DataSource groovy 中的密码 有很多谷歌结果包含了一些答案 但没有关于如何做到这一点的简明指南 有人可以指出我正确的方
  • PowerShell ScriptBlock 和多个函数

    我编写了以下代码 cls function GetFoo function GetBar bar bar bar foo foo bar GetBar foo bar cred Get Credential firmwide srabhi
  • 如何检测 NSURLConnection 的 sendSynchronousRequest:returningResponse:error: 最终是否超时或其他错误

    I use NSURLConnection s sendSynchronousRequest returningResponse error 方法 在单独的NSOperation线程 连接到外部服务器以检索数据 我如何知道操作是否超时结束或
  • 如何保存 JavaFX GUI 状态?

    是否有一种现有的简单方法来持久保存 JavaFX GUI 状态 包括节点的 userData 字段的自定义 反 序列化 None
  • 根据 Django 数据库中的某个字段获取不同的行

    我需要在 Django 中构建一个查询 我想知道这是否可能 它可能非常明显 但我错过了 我有一个正常的查询Model objects filter x True 5 它可以返回这样的结果 FirstName LastName Country
  • 为什么 jQuery.cssRule 插件必须向所有样式表添加规则?

    我尝试使用 cssRule 插件 http plugins jquery com project jquerycssrule并发现在 FireBug 中调试这些规则很不方便 因为每个规则似乎都附加到我的页面上加载的每个 css 文件 因此定
  • 从非托管 C++ 调用托管代码 (c#) 的最佳方法

    我们开发了一个软件架构 由用 C 开发的一组对象组成 他们广泛使用事件来通知客户端状态变化等 最初的目的是允许遗留代码通过 COM 互操作服务使用这些托管对象 这在设计规范中很容易编写 但我发现实际实现它会遇到更多问题 我已经搜索了很多小时
  • python 2.6+ (win32) 上的 mysqldb

    我目前正在使用 python 2 6 我想使用 win32 mysqldb 模块 不幸的是 它似乎需要 2 5 版本的 Python 有什么方法可以消除版本号中的这种不匹配并使用 python 2 6 安装 mysqldb 吗 有适用于 p
  • 使用 Java 从 Google Drive 获取列表文件 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有关您编写的代码的问题必须描述具体问题 and 包含有效代码重现它 在问题本身中 看SSCCE org http sscce org 以获
  • 闪亮的滑块限制释放鼠标左键的反应

    我正在使用 Shiny 应用程序 其中可能需要一些时间才能将滑块设置为正确的值 因此 在尝试将滑块设置为正确的值 并且不释放鼠标左键 时 即我的本地 服务器观察到几个新值并做出相应反应 由于我的服务器对任何新值的响应可能需要几秒钟 如果我可
  • 有没有一种方法可以有效地生成包含数百万个文件的目录中的每个文件?

    我知道os listdir 但据我所知 它将目录中的所有文件名放入内存 然后返回列表 我想要的是一种生成文件名 对其进行处理 然后生成下一个文件名的方法 而不会将它们全部读入内存 有什么办法可以做到这一点吗 我担心使用这种方法更改文件名 添
  • Rails 4.0 中的多个“root to”路线

    我试图让 Rails 根据子域转到不同的控制器 action 这就是我迄今为止在routes rb中所拥有的 Petworkslabs Application routes draw do get to custom show constr
  • R 并排分组箱线图

    我有两种植物气体排放的时间数据 这两种植物都经过了相同的处理 和一些以前的帮助 https stackoverflow com questions 23848186 unify boxplot factor group colours 23
  • Oauth 2.0 - 单个资源服务器但多个客户端应用程序

    问候 我想问以下是否是 Oauth 2 0 的有效用例 授权服务器 单独 单个 或多个 资源服务器 多个客户端应用程序访问同一资源服务器 如果这是一个有效的用例 我们如何使用授权服务器配置多个客户端 无法使用 application pro
  • 如何用 SUBSTITUTE 公式替换 Excel 中的引号?

    我有工作表 其中需要命名范围来对应于另一个单元格的内容 单元格中的文本类似于 Partitions w Studs 16 oc 命名范围不能包含空格 或者最重要的是 不能包含 等特殊字符 因此 该范围的命名如下 PartitionswStu
  • clojure lein(读取行)stdin 问题

    所以常规的 clojure repl 工作得很好 read line 收集输入 然后回显它 使用lein repl但是 它永远不会回显任何输入字符 也不允许我从任何标准输入读取命令返回 我确信这与重新绑定有关in 但想知道是否有解决方法 修
  • Tablayout+view 分页器未在位置 0 显示片段

    我的应用程序有 2 个选项卡 具有两种不同的布局 当我运行应用程序时 应该在 tab1 位置 0 中显示的片段显示在 tab2 中 而应该在 tab2 位置 1 中显示的片段没有显示 此外 当我滑动屏幕时 选项卡布局中的选项卡焦点不会改变
  • PDF - 设置受密码保护的打印、复制、粘贴选项?

    我正在寻找一个 Python 库 它允许我在现有 PDF 文件上设置受密码保护的打印 复制 粘贴选项 我尝试过的 我查看了reportlab pdfencrypt模块 这正是我需要的选项 但是开源版本受到严格限制 甚至无法设置真正的密码 并