使用itextsharp 5.5.9从XMP读取自定义属性值

时间:2016-05-25 16:58:56

标签: c# itextsharp

我在使用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的存在和价值?

2 个答案:

答案 0 :(得分:1)

我最终得到了这个解决方案。

它需要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;

答案 1 :(得分:0)

如果我没弄错,您希望获得pdf文件元数据的自定义属性。 如果是,你可以这样做:

PdfReader reader = new PdfReader(inFile);
string myProperty = reader.Info.Where(x => x.Key == "MyProperty").Select(x => x.Value).FirstOrDefault();