您使用的代码 sn-p 是关于将元数据添加到 从头开始创建的 PDF 文档。您要求从现有 PDF 文档中读取元数据。请查看 iText 网站上的文档,更具体地说是问答条目How to add / delete / retrieve information from a PDF using a custom property?
当然,该问题的答案中使用的代码是用 Java 编写的,但将其移植到 C# 相当容易。这是另一个sn-p:
public byte[] ManipulatePdf(byte[] src) {
PdfReader reader = new PdfReader(src);
using (MemoryStream ms = new MemoryStream()) {
using (PdfStamper stamper = new PdfStamper(reader, ms)) {
Dictionary<String, String> info = reader.Info;
info["Title"] = "Hello World stamped";
info["Subject"] = "Hello World with changed metadata";
info["Keywords"] = "iText in Action, PdfStamper";
info["Creator"] = "Silly standalone example";
info["Author"] = "Also Bruno Lowagie";
stamper.MoreInfo = info;
}
return ms.ToArray();
}
}
您可以通过PdfReader 从现有 PDF 中检索元数据。你会得到一个Dictionary,其中的键与 ISO-32000-1 中信息字典的键相对应。如果要更改元数据,可以使用PdfStamper。
此功能将读取和调整 Info 字典(您在代码 sn-p 中引用的内容)。 PDF 还可以包含 XMP 元数据。
XMP 元数据可以这样读取:
public string ReadXmpMetadata(byte[] src) {
PdfReader reader = new PdfReader(src);
byte[] b = reader.Metadata;
return Encoding.UTF8.GetString(b, 0, b.Length);
}
您可以像这样更改 XMP 元数据:
public byte[] ManipulatePdf(byte[] src) {
PdfReader reader = new PdfReader(src);
using (MemoryStream ms = new MemoryStream()) {
using (PdfStamper stamper = new PdfStamper(reader, ms)) {
Dictionary<String, String> info = reader.Info;
using (MemoryStream msXmp = new MemoryStream()) {
XmpWriter xmp = new XmpWriter(msXmp, info);
xmp.Close();
stamper.XmpMetadata = msXmp.ToArray();
}
}
return ms.ToArray();
}
}
我假设您知道 Info 字典和 PDF 中的 XMP 元数据流之间的区别。