iText设置创建日期& sandbox.stamper.SuperImpose.java中的修改日期

时间:2016-05-09 08:19:24

标签: pdf itext itextpdf

我试图设置创建日期& Superimposing content from one PDF into another PDF示例中的修改日期sandbox.stamper.SuperImpose.java。

原则是(我认为)明确:

使用getInfo()&然后做

info.put(PdfName.CREATIONDATE, new PdfDate(calendar));

info.put("CreationDate", "D:20160508090344+02'00'");

取决于HashMap<String, String>或PdfDictionary是否可用。

但是在哪里?我似乎无法找到插入代码的正确位置......我也无法覆盖原始的Title属性。

1 个答案:

答案 0 :(得分:2)

请查看以下文件state.pdfstate_metadata.pdf

前者的元数据如下所示:

enter image description here

后者的元数据如下所示:

enter image description here

您可以看到标题和日期已更改。

现在看一下ChangeMetadata示例,了解如何完成此操作:

public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
    PdfReader reader = new PdfReader(src);
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
    Map info = reader.getInfo();
    info.put("Title", "New title");
    info.put("CreationDate", new PdfDate().toString());
    stamper.setMoreInfo(info);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    XmpWriter xmp = new XmpWriter(baos, info);
    xmp.close();
    stamper.setXmpMetadata(baos.toByteArray());
    stamper.close();
    reader.close();
}

更改标题很简单:

info.put("Title", "New title");

更改创建日期需要您使用特定的日期格式,这就是我使用PdfDate对象的原因:

info.put("CreationDate", new PdfDate().toString());

旧版iText可能不允许更改创建日期,因此请确保您使用的是最近的iText版本。

修改日期会自动更改。使用当前日期,您无法覆盖此日期。

以下行仅更改信息词典中的元数据:

Map info = reader.getInfo();
info.put("Title", "New title");
info.put("CreationDate", new PdfDate().toString());
stamper.setMoreInfo(info);

如果您使用旧版本的Adobe Reader,您将看到更改,但更新的PDF查看器会优先考虑存储在XMP元数据流中的元数据。这意味着您还必须创建一个新的XMP流:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
XmpWriter xmp = new XmpWriter(baos, info);
xmp.close();
stamper.setXmpMetadata(baos.toByteArray());

当您说您已更改信息词典中的标题并且您没有看到更改时,您应该尝试更改XMP元数据。在某些情况下(例如,当您需要满足PDF / A合规性时),具有两组彼此矛盾的不同元数据的PDF被视为无效PDF。