问题标签 [pikepdf]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
12620 浏览

python - 从加密的 PDF 中提取 Python 数据

我是一名刚毕业的纯数学专业的毕业生,只上过很少的基础编程课程。我正在实习,并且有一个内部数据分析项目。我必须分析过去几年的内部 PDF。PDF 是“安全的”。换句话说,它们是加密的。我们没有 PDF 密码,更重要的是,我们不确定密码是否存在。但是,我们拥有所有这些文件,我们可以手动阅读它们。我们也可以打印它们。我们的目标是用 Python 阅读它们,因为这是我们有一些想法的语言。

首先,我尝试使用一些 Python 库来阅读 PDF。但是,我发现的 Python 库不读取加密的 PDF。当时,我也无法使用 Adob​​e Reader 导出信息。

其次,我决定解密 PDF。我成功使用了 Python 库 pykepdf。Pykepdf效果很好!但是,解密后的 PDF 也无法使用前一点的 Python 库(PyPDF2Tabula)读取。此时,我们做了一些改进,因为使用 Adob​​e Reader 我可以从解密的 PDF 中导出信息,但目标是使用 Python 完成所有工作。

我展示的代码完美适用于未加密的 PDF,但不适用于加密的 PDF。它也不适用于使用 pykepdf 获得的解密 PDF。

我没有写代码。我在 Python 库PykepdfTabula的文档中找到了它。PyPDF2 解决方案是由Al Sweigart在他的书“用 Python 自动化无聊的东西”中编写的,我强烈推荐这本书。我还检查了代码是否工作正常,具有我之前解释的限制。

第一个问题,如果程序使用从未加密的文件,为什么我无法读取解密的文件?

第二个问题,我们可以用 Python 读取解密的文件吗?哪个图书馆可以做到或不可能?所有解密的 PDF 都可以提取吗?

感谢您的时间和帮助!!!

我使用 Python 3.7、Windows 10、Jupiter Notebooks 和 Anaconda 2019.07 找到了这些结果。

使用 Tabula,我收到消息“输出文件为空”。

使用 PyPDF2,我只得到 '/n'

更新 2019 年 10 月 3 日 Pdfminer.six(2018 年 11 月版本)

使用DuckPuncher发布的解决方案,我得到了更好的结果。对于解密的文件,我得到了标签,但没有得到数据。加密文件也是如此。对于从未加密过的文件来说,它是完美的。由于我需要加密或解密文件的数据和标签,因此此代码对我不起作用。对于该分析,我使用了 pdfminer.six,它是 2018 年 11 月发布的 Python 库。Pdfminer.six 包含一个库 pycryptodome。根据他们的文档“ PyCryptodome是一个自包含的 Python 低级加密原语包..”

代码在堆栈交换问题中: Extracting text from a PDF file using PDFMiner in python?

如果你想重复我的实验,我会很高兴。这是描述:

1) 使用任何从未加密的 PDF 运行此问题中提到的代码。

2) 对 PDF“安全”(这是 Adob​​e 使用的术语)执行相同操作,我将其称为加密 PDF。使用可通过 Google 找到的通用表单。下载后,您需要填写字段。否则,您将检查标签,而不是字段。数据在字段中。

3) 使用 Pykepdf 解密加密的 PDF。这将是解密的 PDF。

4) 使用解密的 PDF 再次运行代码。

更新 2019 年 10 月 4 日 Camelot(2019 年 7 月版)

我找到了 Python 库 Camelot。请注意,您需要camelot-py 0.7.3。

它非常强大,适用于 Python 3.7。此外,它非常易于使用。首先,您还需要安装Ghostscript。否则,它将无法正常工作。您还需要安装Pandas不要使用 pip install camelot-py。而是使用pip install camelot-py[cv]

该程序的作者是 Vinayak Mehta。Frank Du 在 YouTube 视频“使用 Python 使用 Camelot 从 PDF 中提取表格数据”中分享了此代码。

我检查了代码,它正在处理未加密的文件。但是,它不适用于加密和解密文件,这就是我的目标

Camelot 旨在从 PDF 中获取表格。

这是代码:

更新 10/7/2019 我发现了一个技巧。如果我使用 Adob​​e Reader 打开受保护的 pdf,然后使用 Microsoft 将其打印为 PDF,并将其另存为 PDF,则可以使用该副本提取数据。我还可以将 PDF 文件转换为 JSON、Excel、SQLite、CSV、HTML 和其他格式。这是我的问题的可能解决方案。但是,我仍然在寻找一种不使用该技巧的选项,因为目标是 100% 使用 Python 来完成。我还担心,如果使用更好的加密方法,这个技巧可能不会奏效。有时您需要多次使用 Adob​​e Reader 才能获得可提取的副本。

2019 年 10 月 8 日更新。第三个问题。 我现在有第三个问题。所有安全/加密的 pdf 都受密码保护吗?为什么 pikepdf 不起作用?我的猜测是当前版本的 pikepdf 可以破坏某些类型的加密,但不是全部。@constt 提到 PyPDF2 可以破坏某种类型的保护。但是,我回复他说,我发现一篇文章说 PyPDF2 可以破解使用 Adob​​e Acrobat Pro 6.0 进行的加密,但不能破解后期版本。

0 投票
4 回答
5098 浏览

python - 当我的脚本导入模块 pikepdf 和 pdfminer3 时,如何修复 pyinstaller 'no module named...' 错误?

我已经使用 PikePDF 和 PDFminer3 构建了一个工作 py 脚本,它将从我的桌面上删除一个 PDF 并从可用的单词中创建一个 txt 文件。

这样做的目的是帮助我的团队在工作中修改法律文件,这些文件通常无法复制粘贴进行修改(因此必须手动输入)。由于我的大多数同事都不愿意设置 anaconda 和使用 python,所以我想使用 pyinstaller 将我的脚本变成 .exe。

当我运行 pyinstaller 创建的应用程序时,我可以在收到此错误之前完成一些初步输入:

在 pyinstaller 的编译过程中,我还收到很多与缺少 anaconda3 dll 文件有关的连续警告:

我做了一些挖掘并在其他线程上应用了一些解决方案但没有成功,包括运行:

底层代码很短(并且工作正常),仅从 pikepdf、pdfminer 和 os 导入:

如果它对提供的信息有任何进一步的用途,pyinstaller 进程的完整日志在这里:

0 投票
2 回答
8377 浏览

python - 找不到 Python Visual Studio 代码模块

已安装 Python 3.7.6 并尝试在 Visual Studio Code 中编写代码

使用:import pikepdf

得到我的错误ModuleNotFoundError: No module named 'pikepdf'

但是,我运行“pip install pikepdf”并得到:

已满足要求:c:\users\ME\appdata\local\packages\pythonsoftwarefoundation.python.3.7_qbz5n2kfra8p0\localcache\local-packages\python37\site-packages (1.8.2) 中的 pikepdf 已满足要求:lxml>=4.0在 c:\users\ME\appdata\local\packages\pythonsoftwarefoundation.python.3.7_qbz5n2kfra8p0\localcache\local-packages\python37\site-packages (来自 pikepdf)(4.4.2)

我的 Python 安装路径是: C:\Users\ME\AppData\Local\Programs\Python\Python38

并试图改变“Python:Python Path”中的某些内容会让我犯更多错误。

0 投票
2 回答
468 浏览

python - 为什么 pikepdf 在使用 Acrobat DC 创建的 PDF 中填写某些 PDF 字段而不填写其他字段

我有一个 PDF,其中包含我的客户使用 Acrobat DC 创建的表单域。使用 Python pikepdf 我以编程方式填充这些字段。奇怪的问题是某些字段已填写,而其他字段未填写。我用 Acrobat DC 检查并再次检查:所有字段都具有完全相同的文本字段属性,名称显然是唯一的。Python 代码使用正确的名称对字段进行寻址。所以我怀疑这个问题可能与我的客户创建字段的方式有关。使用 Acrobat DC,我删除了有问题的字段并创建了具有与显示为已填写的字段相同的文本字段属性的全新字段——但无济于事。

现在我用 Acrobat Reader 检查了 pikepdf 生成的 PDF,所有填写的字段都显示了它们的值,sigh!但是,所有 Linux PDF 查看器都不会在显示其他一些字段的内容时显示违规字段的内容。我尝试了 Okular、Atril、XFCE4 的文档查看器和 LibreOffice Draw。这似乎表明了 Acrobat 方面的问题。有任何想法吗?

0 投票
0 回答
1422 浏览

python - 如何修复我的 Python pikepdf 导入错误?

我正在尝试安装该pikepdf软件包,但运行时收到以下错误:import pikepdf.

为了正确导入 pikepdf,我需要修复什么?

0 投票
0 回答
1072 浏览

python - 错误:恢复损坏文件时无法找到预告片字典

PyPDF2 有时会因解密某些 PDF 文件而失败,我正在尝试使用pikepdf解密它们, 但出现此错误:在恢复损坏的文件时无法找到预告片字典有 什么想法吗?

0 投票
1 回答
193 浏览

c++ - Cygwin 下的 gcc 9.3.0 预处理器:cmdline -Dname 但名称似乎未定义

我正在尝试在 Cygwin 下构建 OCRmyPDF 并遇到了一堵砖墙。虽然我的整个职业生涯都是一名开发人员,但我主要使用 Java 工作,对 Python 内部结构和 C++ 知之甚少。对于这些领域的专家来说,这个问题可能很明显,但我很难过。

Linux 上的 OCRmyPDF 作为一组“轮子”包安装。我收集了一个轮子是一个预先构建的依赖包。出于某种原因,在 Cygwin 下,pip 安装程序认为它不能使用轮子包并希望从源代码进行重建。尝试重建 pikepdf 包时会出现问题。

这是错误:

所以它似乎pybind11.h需要strdup()但它不可用。 strdup()在 中声明/usr/include/string.h,其中包含:

所以我尝试-D__MISC_VISIBLE在命令行中添加一个显式,看看是否能解决问题,但它不起作用(如上所示)。我捕获了预处理器的输出,-E发现即使-D__MISC_VISIBLE它的行为就像未定义该宏一样。只_strdup_r出现:

这就是我卡住的地方。我似乎无法让编译器包含strdup(). 我不确定下一步如何进行,并欢迎任何建议。

0 投票
0 回答
279 浏览

python - 无法从家庭 brew 安装包中的“lxml”导入名称“etree”,但在 python shell 中很好

我正在尝试运行通过自制软件安装的 ocrmypdf,但我的本地版本的 lxml(版本 4.2.4)存在问题:

如果我打开一个 python shell,我可以很好地导入:

我的蟒蛇路径:

我不确定为什么自制软件包没有拾取模块文件,即使它说它指向同一个站点包文件夹。

0 投票
1 回答
416 浏览

python - pikepdf - 如何从 django 视图返回内存中的 pdf 对象

我目前有以下代码:

我在网上找不到任何描述如何从 django 视图返回内存中 pdf 对象的地方。

0 投票
1 回答
589 浏览

python - 使用 Pikepdf 编辑元数据

任何有使用 pikepdf 编辑 pdf 元数据的经验的人?

我安装了这个库,因为其他库似乎在目录和/或书签方面存在一些问题。我也尝试过 pdfrw,但是这个库无法覆盖现有值,所以现在我正在尝试 pikepdf。

文档说:

在 with 块中打开元数据以将其打开以进行编辑。退出块时,将提交更改(更新 XMP 和 Document Info 字典)并附加到 PDF 对象。PDF 仍然必须保存。如果块中发生异常,则丢弃更改。

我已经尝试过这种方法,使用一个函数:

保存后,什么都没有改变。我在这里遗漏了一些明显的东西吗?

如果我在函数中添加断点并尝试检查现有值,则会收到未找到键的错误。所以我想这是问题的一部分——我无法访问正确的键,但我如何才能看到 open_metadata() 返回的对象中存在哪些键值对?如果我按原样打印“元”对象,我会得到以下信息:

print(meta.keys())--> KeysView(<pikepdf.models.metadata.PdfMetadata object at 0x000001E4024306A0>)

list(meta.keys())-->[]

有人可以指出我正确的方向吗?如何更改值“未知”和“用户 ID,SDFG-12345678”?