public static StreamToken GenerateXmpStream(PdfDocumentBuilder.DocumentInformationBuilder builder, decimal version, PdfAStandard standard) { XNamespace xmpMeta = XmpMetaNamespace; XNamespace rdf = RdfNamespace; var emptyRdfAbout = new XAttribute(rdf + "about", string.Empty); var rdfDescriptionElement = new XElement(rdf + "Description", emptyRdfAbout); // Dublin Core Schema AddElementsForSchema(rdfDescriptionElement, DublinCorePrefix, DublinCoreNamespace, builder, new List <SchemaMapper> { new SchemaMapper("format", b => "application/pdf"), new SchemaMapper("creator", b => b.Author), new SchemaMapper("description", b => b.Subject), new SchemaMapper("title", b => b.Title) }); // XMP Basic Schema AddElementsForSchema(rdfDescriptionElement, XmpBasicPrefix, XmpBasicNamespace, builder, new List <SchemaMapper> { new SchemaMapper("CreatorTool", b => b.Creator) }); // Adobe PDF Schema AddElementsForSchema(rdfDescriptionElement, AdobePdfPrefix, AdobePdfNamespace, builder, new List <SchemaMapper> { new SchemaMapper("PDFVersion", b => "1.7"), new SchemaMapper("Producer", b => b.Producer) }); var pdfAIdContainer = GetVersionAndConformanceLevelIdentificationElement(rdf, emptyRdfAbout, standard); var document = new XDocument( new XElement(xmpMeta + "xmpmeta", GetNamespaceAttribute(XmpMetaPrefix, XmpMetaNamespace), new XAttribute(xmpMeta + "xmptk", Xmptk), new XElement(rdf + "RDF", GetNamespaceAttribute("rdf", rdf), rdfDescriptionElement, pdfAIdContainer ) ) ); var xml = document.ToString(SaveOptions.None).Replace("\r\n", "\n"); xml = $"<?xpacket begin=\"\ufeff\" id=\"W5M0MpCehiHzreSzNTczkc9d\"?>\n{xml}\n<?xpacket end=\"r\"?>"; var bytes = Encoding.UTF8.GetBytes(xml); return(new StreamToken(new DictionaryToken(new Dictionary <NameToken, IToken> { { NameToken.Type, NameToken.Metadata }, { NameToken.Subtype, NameToken.Xml }, { NameToken.Length, new NumericToken(bytes.Length) } }), bytes)); }
private static void AddElementsForSchema(XElement parent, string prefix, string ns, PdfDocumentBuilder.DocumentInformationBuilder builder, List <SchemaMapper> mappers) { var xns = XNamespace.Get(ns); parent.Add(GetNamespaceAttribute(prefix, xns)); foreach (var mapper in mappers) { var value = mapper.ValueFunc(builder); if (value == null) { continue; } parent.Add(new XElement(xns + mapper.Name, value)); } }