使用 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 中的文本