【问题标题】:Add / delete / retrieve information from a PDF using a custom property使用自定义属性从 PDF 添加/删除/检索信息
【发布时间】:2014-11-06 15:27:02
【问题描述】:

对不起,我昨天发布的问题不清楚。我想在自定义属性中存储 2 个字符串(string1 和 string2),以便字符串与 pdf 一起使用。我已经有了字符串,但我不知道如何将其存储在自定义属性区域下。自定义属性区指的是 FILE--->Properties---->Custom ---->Custom properties ,其中“Name”和“Value”成对出现。我希望 string1 存储在“Value”中,而 string2 存储在“Name”中。

稍后,我想检索/删除自定义属性区域中的字符串。 请问如何用itext实现?

感谢和问候,

布赖恩

【问题讨论】:

    标签: java pdf itext


    【解决方案1】:

    感谢您的澄清。根据您对如何使用 Acrobat 添加所需数据的描述,我们现在知道您指的是元数据。

    我使用 Acrobat 添加了一个名为“Test”的自定义元数据条目,其值为“test”,当您查看该文件时,您可以看到该键/值对出现在两个位置(标有红色点):

    1. 它出现在 Info 字典中,这是存储元数据的传统地方。
    2. 它在 XMP 元数据流中作为名为 Test 的标记存在,前缀为 pdfx(用于自定义标记)。

    使用 iText 时,向 Info 字典添加额外的值很容易。也可以更新 XMP 元数据,但您必须自己创建 XMP 流,在您的情况下这可能有点过头了。也许您的 PDF 只有一个 Info 字典,没有 XMP。

    此外:您说拥有该键的目的是检索其值并随后删除自定义条目。在这种情况下,在 Info 字典中添加额外的条目就足够了。

    根据您是要将自定义条目添加到 Info 字典还是添加到从头创建的 PDF 或现有 PDF,您需要以下示例之一:

    CustomMetaEntry 中,我们为标题添加一个标准元数据条目和一个名为Test 的自定义条目:

    public void createPdf(String dest) throws IOException, DocumentException {
        Document document = new Document();
        PdfWriter.getInstance(document, new FileOutputStream(dest));
        document.addTitle("Some example");
        document.add(new Header("Test", "test"));
        document.open();
        Paragraph p = new Paragraph("Hello World");
        document.add(p);
        document.close();
    }
    

    如您所见,iText 有addX() 方法来添加标题、作者、... 元数据。但是,如果要添加自定义条目,则需要使用add() 方法添加Header 实例。您需要在打开文档之前添加元数据

    如果您想在现有 PDF 的信息字典中添加条目,可以从我的book 中举一个例子,例如MetadataPdf

    public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
        PdfReader reader = new PdfReader(src);
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
        Map<String, String> info = reader.getInfo();
        info.put("Title", "Hello World stamped");
        info.put("Subject", "Hello World with changed metadata");
        info.put("Keywords", "iText in Action, PdfStamper");
        info.put("Creator", "Silly standalone example");
        info.put("Author", "Also Bruno Lowagie");
        stamper.setMoreInfo(info);
        stamper.close();
        reader.close();
    }
    

    在本例中,我们使用getInfo() 方法从PdfReader 实例中获取信息字典。

    这也回答了如何从 PDF 中检索自定义数据。如果Map 包含带有键Test 的条目,您可以像这样获取它的值:

    String test = info.get("Test");
    

    您现在可以向此Map 添加额外的Strings 对。 在示例中,我们为元数据添加了标准键,但您也可以使用自定义键。

    从现有 PDF 文件中删除条目的方式与添加条目相同。添加null 值就足够了。例如:

    info.put("Test", null);
    

    这将删除一个名为 Test 的自定义条目,以防您的 Info 字典中存在这样的值。

    【讨论】:

    • 我可以要求代码检索字符串对吗,假设我保存在自定义属性中的是名称(测试)和值(测试),我知道名称是测试,如何获取回价值?谢谢
    • 另一件事是,当我在添加自定义属性(测试、测试)之前对 pdf 进行哈希处理时,我得到字符串 a。
    • 但是,当我使用方法 info.put("Test", null) 删除自定义属性时。删除自定义属性后,我再次对 pdf 进行哈希处理,得到另一个字符串 b。这两个字符串不一样。我怎样才能让他们得到相同的哈希结果?我使用的哈希算法 MD5
    • 不要使用 cmets 提出额外的问题。关于散列:如果您阅读 ISO-32000-1,您应该知道没有两个 PDF 是相等的。如果您更新 PDF 以添加某些内容,则会更改 ID。如果您更新 PDF 以将其删除一段时间,则 ID 将再次更改。但是:它永远不会更改为原始 ID(该 ID 丢失)。此外:对象的组织方式是随机的,这是 PDF 固有的。您使用哈希的用例违反了 PDF 标准。
    • 好的,非常感谢!下次我不会在 cmets 中问额外的问题。
    猜你喜欢
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    • 2012-01-13
    • 2023-04-07
    相关资源
    最近更新 更多