感谢您的澄清。根据您对如何使用 Acrobat 添加所需数据的描述,我们现在知道您指的是元数据。
我使用 Acrobat 添加了一个名为“Test”的自定义元数据条目,其值为“test”,当您查看该文件时,您可以看到该键/值对出现在两个位置(标有红色点):
- 它出现在 Info 字典中,这是存储元数据的传统地方。
- 它在 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 字典中存在这样的值。