C#:元数据提取器无法读取从 Aspose Imaging 创建的 XMP

问题描述

我打算使用这些 XMP 元数据属性处理程序来存储我的加密密钥,以便我的程序读取它(出于安全目的)。我已经对 PDF 文件做了一些工作,现在我正在尝试添加对图像和 MS Word 文件的加密密钥支持

我正在使用 Aspose Imaging 将任何图像转换为 TIFF 并向其添加自定义元数据,但似乎来自 github https://github.com/drewnoakes/metadata-extractorMetadata Extractor 无法读取我导入的内容。>

通过 Aspose Imaging 导入 XMP:

            using (TiffImage image = (TiffImage)Aspose.Imaging.Image.Load(imagepath))
            {
                
                XmpHeaderPi xmpHeader = new XmpHeaderPi("Company Metadata");

                XmpTrailerPi xmpTrailer = new XmpTrailerPi(true);

                XmpMeta xmpMeta = new XmpMeta();

                xmpMeta.AddAttribute("Company","Some Company Inc.");
                xmpMeta.AddAttribute("EncryptionKey",cryptography.Encrypt(Guid.NewGuid().ToString(),"somekey"));

                XmpPacketWrapper xmpData = new XmpPacketWrapper(xmpHeader,xmpTrailer,xmpMeta);

                image.XmpData = xmpData;
                image.Save();

              
            }

来自MetadataExtractor的结果

enter image description here

我导入元数据的方式有误吗?或者有没有什么库可以读取这个而不是使用Aspose Imaging来读取?

解决方法

最终通过创建 Dublin Core Schema 而不是自定义 XMP 解决了我的问题。也许这个想法是创建一个现有的模式,然后从中添加任何自定义值,如加密密钥的处理程序。 (例如dc:encryptionkey

DublinCorePackage dublinCorePackage = new DublinCorePackage();
dublinCorePackage.SetAuthor("AUTHOR_HERE");
dublinCorePackage.SetTitle("Encrypted Image File");

//property handler for the encrypted key
dublinCorePackage.AddValue("dc:encryptionkey","ENCRYPTION_KEY");

XmpPacketWrapper xmpData = new XmpPacketWrapper(xmpHeader,xmpTrailer,xmpMeta);

// Add dublinCore Package into XMP metadata
xmpData.AddPackage(dublinCorePackage);

然后使用Metadata-Extractor搜索创建的属性

private void ReadMetadata(string path)
    {
        var xmpDirectory = ImageMetadataReader.ReadMetadata(path).OfType<XmpDirectory>()?.FirstOrDefault();

        if (xmpDirectory == null) return;

        var query = xmpDirectory.XmpMeta.Properties.Where(e => e.Path == "dc:encryptionkey").FirstOrDefault();

        if (query != null)
        {
            var key = query.Value;
            var decrypt = cryptography.Decrypt(key,"SOME_KEY");
            Console.WriteLine(decrypt);
        }

    }

调试结果:

enter image description here

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...