iText 在 sandbox.stamper.SuperImpose.java 中设置创建日期和修改日期
iText setting Creation Date & Modified Date in sandbox.stamper.SuperImpose.java
我正在尝试在 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 属性时也遇到了问题。
请查看以下文件state.pdf and state_metadata.pdf。
前者的元数据如下所示:
后者的元数据如下所示:
可以看到标题和日期都变了。
现在看一下 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
object:
的原因
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 在某些情况下被视为无效 PDF(例如,当您需要满足 PDF/A 合规性时)。
我正在尝试在 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 属性时也遇到了问题。
请查看以下文件state.pdf and state_metadata.pdf。
前者的元数据如下所示:
后者的元数据如下所示:
可以看到标题和日期都变了。
现在看一下 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
object:
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 在某些情况下被视为无效 PDF(例如,当您需要满足 PDF/A 合规性时)。