使用 pdfBox 禁用 pdf 文本搜索

Posted

技术标签:

【中文标题】使用 pdfBox 禁用 pdf 文本搜索【英文标题】:Disable pdf-text searching with pdfBox 【发布时间】:2018-03-27 07:49:30 【问题描述】:

我有一个 pdf 文档(无表单),我想在其中禁用使用 pdfBox (java) 的文本搜索。 我可以想象以下几种可能性:

扁平化文本 删除文本信息(不删除文本本身) 向文档添加叠加层。

目前我不知道如何实现它。有谁知道如何解决这个问题?

【问题讨论】:

虽然我的第一个问题是您为什么要这样做,但一个简单的解决方案可能是只为您的文本制作图像。你仍然可以图像 -> 文本它无论如何并搜索它。如果没有视觉混淆,你无法真正阻止这种情况,所以除了给搜索过程增加不必要的复杂层之外,我看不出它在哪里做任何事情。 该请求的原因是 pdf 包含不应向用户显示的关键信息。因此,我们添加了一个隐藏这些信息的框。但只有有了这个盒子,信息仍然是可搜索的。现在我正在寻找一种解决方案如何防止这种情况发生。 您应该使用实际的编辑,而不仅仅是用矩形覆盖。 【参考方案1】:

非常感谢您在这里的帮助。我想我找到了一种符合要求的方法。 (老实说,不是很干净):

    将矩形添加到地址部分 将 PDF 转换为图像 将图像转换回 pdf。

在丢失所有文本信息时,用户无法再看到关键信息。由于这个原因,这只是为了显示(最初的 PDF 文档不会改变),现在可以。

【讨论】:

我最终应用了这个完全相同的解决方案。不幸的是,代价是完全失去了文本导航(无法在页面中搜索,无法选择文本等)......现在就足够了。【参考方案2】:

这取决于你的目标:

避免在某些文本上使用任何东西:打印、用黑色墨水标记,然后再次扫描;

删除敏感文本:您必须扫描内部文本,然后删除/替换它(使用 pdfbox),但有风险(某些文本被拆分);

为查看器屏蔽一些文本:查找文本并添加一个黑色矩形(带有 pdfbox),但这不是很安全。您可以删除矩形,或使用其他工具来阅读文本。通常,如果里面有文字,一些工具可以找到它;

避免复制/粘贴文本(但不是搜索/查看):使用安全选项,带密码:

见:https://pdfbox.apache.org/2.0/cookbook/encryption.html

PDDocument doc = PDDocument.load(new File("filename.pdf"));

// Define the length of the encryption key.
// Possible values are 40, 128 or 256.
int keyLength = 128;
// 256 => plante

AccessPermission ap = new AccessPermission();

// disable printing, everything else is allowed
ap.setCanPrint(false);

ap.setCanExtractContent(false);
ap.setCanExtractForAccessibility(false);

// Owner password (to open the file with all permissions) is "12345"
// User password (to open the file but with restricted permissions, is empty here)
StandardProtectionPolicy spp = new StandardProtectionPolicy("12345", "", ap);
spp.setEncryptionKeyLength(keyLength);
spp.setPermissions(ap);
doc.protect(spp);

doc.save("filename-encrypted2.pdf");
doc.close();

【讨论】:

以上是关于使用 pdfBox 禁用 pdf 文本搜索的主要内容,如果未能解决你的问题,请参考以下文章

使用 PDFBOX 生成的 PDF 中未正确显示已保存的文本字段值

用 Java 中的 PDFbox 替换或删除 PDF 中的文本

使用 PDFBox 解析 PDF 文件(尤其是表格)

java中使用pdfbox对pdf文件进行操作时,如何实现插入文本的自动换行操作?

过滤 ListView 时如何禁用搜索文本弹出窗口?

如何使用 PDFBox 使文本居中