Esempio n. 1
0
        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));
        }
Esempio n. 2
0
        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));
            }
        }