我使用 itextsharp v. 5.5.9 从 PDF 文件的 XMP 部分读取特定的自定义属性时遇到困难。
当我尝试使用 XmpReader 类时,它被标记为过时,并且它不包含任何似乎对读取目的有用的公共方法。
我可以将元数据部分转换为 XML,然后以某种方式解析它(解决方法包括使用 XmpCore 库,该库具有按名称读取属性的便捷方法),但我确定我错过了一些东西......
我认为应该可以用一个库访问一些属性。
PdfReader reader = new PdfReader(inFile);
PdfStamper stamper = new PdfStamper(reader, new FileStream(outFile, FileMode.Create));
MemoryStream ms = null;
if (reader.Metadata != null)
ms = new MemoryStream(reader.Metadata);
else
{
stamper.CreateXmpMetadata();
ms = new MemoryStream();
}
XmpWriter xw = new XmpWriter(ms);
xw.XmpMeta.GetPropertyString(XmpConst.NS_DC, "MyProperty"); // -> not found, but it's ok for the first time...
xw.SetProperty(XmpConst.NS_DC, "MyProperty", "MyValue"); // -> OK
xw.XmpMeta.GetPropertyString(XmpConst.NS_DC, "MyProperty"); // -> OK
xw.Close();
stamper.XmpMetadata = ms.ToArray();
stamper.Close();
reader.Close();
如果我在同一文件上运行程序两次(因此该属性保存在文件中),则仍然找不到该属性。
如何读取 MyProperty 的存在和价值?
我最终得到了这个解决方案。
它需要 XmpCore 库,但它实现起来既简单又快速,避免了许多细节的显式管理,例如编码:
string result = null;
iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(inFile);
if (reader.Metadata != null)
{
XmpCore.IXmpMeta meta = XmpCore.XmpMetaFactory.ParseFromBuffer(reader.Metadata);
result = meta.GetPropertyString(XmpConst.NS_DC, "MyProperty");
}
reader.Close();
return result;
如果我没弄错,您想获取pdf文件元数据的自定义属性。如果是,您可以这样做:
PdfReader reader = new PdfReader(inFile);
string myProperty = reader.Info.Where(x => x.Key == "MyProperty").Select(x => x.Value).FirstOrDefault();