当前位置: 首页 > 知识库问答 >
问题:

PDFBox从无密码加密的PDF中提取空白

闽哲
2023-03-14

我怀疑它没有正确解密,因为它能够拉动表单的文本提示,但不能拉动响应本身。在下面的代码中,它从示例PDF中提取地址(街道名称和号码)城市,但不是它们之间的响应。

我正在使用PDFBox2.0,但我也尝试过1.8。

我已经尝试了所有的解密方法,我可以找到的PDFBox,包括不推荐的那些(为什么不)。我得到的结果与完全不尝试解密一样,只是地址和城市提示。

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPageTree;
import org.apache.pdfbox.pdmodel.encryption.StandardDecryptionMaterial;
import org.apache.pdfbox.text.PDFTextStripperByArea;
import java.io.File;
import org.apache.pdfbox.pdmodel.PDPage;
import java.awt.Rectangle;
import java.util.List;


class Scratch {

    private static float pwidth;
    private static float pheight;

    private static int widthByPercent(double percent) {
        return (int)Math.round(percent * pwidth);
    }

    private static int heightByPercent(double percent) {
        return (int)Math.round(percent * pheight);
    }

    public static void main(String[] args) {
        try {
            //Create objects
            File inputStream = new File("ocr/TestDataFiles/i-9_08-07-09.pdf");

            PDDocument document = PDDocument.load(inputStream);

            // Try every decryption method I've found
            if(document.isEncrypted()) {

                // Method 1
                document.decrypt("");

                // Method 2
                document.openProtection(new StandardDecryptionMaterial(""));

                // Method 3
                document.setAllSecurityToBeRemoved(true);

                System.out.println("Removed encryption");
            }

            PDFTextStripperByArea stripper = new PDFTextStripperByArea();

            //Get the page with data on it
            PDPageTree allPages = document.getDocumentCatalog().getPages();
            PDPage page = allPages.get(3);

            pheight = page.getMediaBox().getHeight();
            pwidth = page.getMediaBox().getWidth();

            Rectangle LastName = new Rectangle(widthByPercent(0.02), heightByPercent(0.195), widthByPercent(0.27), heightByPercent(0.1));
            stripper.addRegion("LastName", LastName);
            stripper.setSortByPosition(true);
            stripper.extractRegions(page);
            List<String> regions = stripper.getRegions();

            System.out.println(stripper.getTextForRegion("LastName"));

        } catch (Exception e){
            System.out.println(e.getMessage());
        }
    }
}

共有1个答案

通寂离
2023-03-14

Brunos的评论解释了为什么PDF是加密的,即使您不需要输入密码:

PDF可以用两个密码加密:用户密码和所有者密码。当使用用户密码加密PDF时,如果不输入该密码,就无法在PDF查看器中打开文档。当PDF仅使用所有者密码加密时,每个人都可以在没有该密码的情况下打开PDF,但可能会有一些限制。您可以识别使用所有者密码加密的PDF,因为它们在Adobe Reader中提到了“安全”。

您的PDF仅使用所有者密码加密,即用户密码为空。因此,您可以使用空密码“”对其进行解密,如下所示:

document.decrypt("");
document.openProtection(new StandardDecryptionMaterial(""));

蒂尔曼提案

doc.getDocumentCatalog().getAcroForm().getField("form1[0].#subform[3].address[0]").getValueAsString()

演示如何提取您知道其名称的表单字段的值,在本例中为“Form1[0].#Subform[3].Address[0]”。如果您不知道要从中提取内容的字段的名称,则Doc.GetDocumentCatalog().GetAcroForm()返回的PDAcroForm对象有许多其他方法可以访问字段内容。

顺便说一句,AcroForm定义中类似“form1[0].#subform[3].address[0]”的字段名称表明了PDF的另一个特点:它实际上包含两个表单定义,核心PDF AcroForm定义和更独立的XFA定义。两者都描述了相同的视觉形式。这样的PDF表单称为混合PDF表单。

 类似资料:
  • 主要内容:加密PDF文档,示例在前一章中,我们已经看到了如何在PDF文档中插入图像。 在本章中,我们将学习如何加密PDF文档。 加密PDF文档 使用和类提供的方法加密PDF文档。 类用于通过为其分配访问权限来保护PDF文档。 使用此教程,您可以限制用户执行以下操作。 打印文档 修改文档的内容 复制或提取文档的内容 添加或修改注释 填写交互式表单域 提取文字和图形以便视障人士使用 汇编文件 打印质量下降 类用于向文档添加基于密码

  • 我已经将示例项目放入GitHub:https://github.com/marioosh-net/pdfbox

  • 使用QPDF,您可以简单地从PDF文件中删除限制/加密,如下所示: 我想用Java中的PDFBox做同样的事情: 我已经用尝试过了,但是我不知道所有者密码是什么。QPDF是如何做到这一点的? 示例文档: https://issues.apache.org/jira/secure/attachment/12514714/in.pdf

  • 假设我有一个IP地址,192.168.1.1 我想让我的程序基于这个IP地址创建一个随机的单字字符串,它可以很容易地解密,而无需密钥或密码或额外的安全措施。 例如。 我进入192.168.1.1 程序将其转换为AzlQrEHCSD或其他一些随机字符串 我在程序中输入这个字符串 它被转换回192.168.1.1 有没有简单的算法可以在不生成密钥或其他密码的情况下做到这一点?我知道密钥和密码是加密和解

  • 我正在使用PDFBox从我的pdf(只包含JPG的)中提取图像。 因为我将把这些图像保存在我的数据库中,所以我想先把每个图像直接转换成一个inputstream对象,而不把文件临时放在我的文件系统上。然而,我在这方面遇到了困难。我认为这是因为使用了,就像我在下面的示例中所做的那样: 然而,这是可行的: 知道我如何将每个PDXObjectImage(或我能得到的任何其他对象)转换为InputStre

  • 我理解哈希和加密之间的区别。我正在寻找一种在Python中实现加密/解密字符串的简单方法。我在网上找到的大多数方法都是关于使用散列算法(MD5-SHA-1等)来进行单向散列。但不幸的是,哈希是不可逆的。有什么建议吗?