private static void SaveHelper(
            [NotNull] Package package,
            [NotNull] PackagePart owner,
            [NotNull] Uri uri,
            [NotNull] string contentType,
            [NotNull] string relationshipType,
            [NotNull] XElement element)
        {
            if (package.PartExists(uri))
            {
                package.DeletePart(uri);
            }

            owner.CreateRelationship(uri, TargetMode.Internal, relationshipType);

            PackagePart part = package.CreatePart(uri, contentType);

            element.WriteTo(part);
        }
Ejemplo n.º 2
0
        private PackagePart CreateDefaultStylesPart(CultureInfo culture, PackagePart documentPart)
        {
            var packagePartUri = new Uri("/word/styles.xml", UriKind.Relative);
            var part           = package.CreatePart(packagePartUri, ContentTypes.Styles, CompressionOption.Normal);

            documentPart.CreateRelationship(packagePartUri, TargetMode.Internal, RelationshipTypes.Styles);
            var content = XmlResourceHelper.GetXmlResource("Wordroller.Packages.Defaults.styles.xml");

            var lang = content.Root
                       ?.Element(XName.Get("docDefaults", Namespaces.w.NamespaceName))
                       ?.Element(XName.Get("rPrDefault", Namespaces.w.NamespaceName))
                       ?.Element(XName.Get("rPr", Namespaces.w.NamespaceName))
                       ?.Element(XName.Get("lang", Namespaces.w.NamespaceName))
                       ?? throw new Exception("The default styles part is corrupt");

            lang.SetAttributeValue(XName.Get("val", Namespaces.w.NamespaceName), culture.ToString());
            PackagePartHelper.SavePackagePart(part, content);
            return(part);
        }
Ejemplo n.º 3
0
        internal static XDocument AddDefaultStylesXml(Package package)
        {
            PackagePart val       = package.CreatePart(new Uri("/word/styles.xml", UriKind.Relative), "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml", CompressionOption.Maximum);
            XDocument   xDocument = DecompressXMLResource("Novacode.Resources.default_styles.xml.gz");
            XElement    xElement  = xDocument.Root.Element(XName.Get("docDefaults", DocX.w.NamespaceName)).Element(XName.Get("rPrDefault", DocX.w.NamespaceName)).Element(XName.Get("rPr", DocX.w.NamespaceName))
                                    .Element(XName.Get("lang", DocX.w.NamespaceName));

            xElement.SetAttributeValue(XName.Get("val", DocX.w.NamespaceName), CultureInfo.CurrentCulture);
            using (TextWriter textWriter = new StreamWriter(new PackagePartStream(val.GetStream(FileMode.Create, FileAccess.Write))))
            {
                xDocument.Save(textWriter, SaveOptions.None);
            }
            PackagePart val2 = (from p in (IEnumerable <PackagePart>)package.GetParts()
                                where p.ContentType.Equals("application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml", StringComparison.CurrentCultureIgnoreCase) || p.ContentType.Equals("application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml", StringComparison.CurrentCultureIgnoreCase)
                                select p).Single();

            val2.CreateRelationship(val.Uri, 0, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles");
            return(xDocument);
        }
Ejemplo n.º 4
0
        Package CreateSpreadsheet(Stream stream)
        {
            Package pack = Package.Open(stream, FileMode.Create);

            // Create package parts.
            PackagePart workbookPart      = pack.CreatePart(new Uri("/xl/workbook.xml", UriKind.Relative), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml");
            PackagePart sharedStringsPart = pack.CreatePart(new Uri("/xl/sharedStrings.xml", UriKind.Relative), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml");

            workbookPart.CreateRelationship(new Uri("/xl/sharedStrings.xml", UriKind.Relative), TargetMode.Internal, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings", "rel1");

            // Load some basic data into the different parts.
            foreach (PackagePart part in package.GetParts())
            {
                using (Stream s = part.GetStream())
                    s.Write(new byte[10], 0, 10);
            }

            return(pack);
        }
Ejemplo n.º 5
0
        private void CreateNewPage(Package filePackage, PackagePart parent,
                                   XDocument partXML, Uri packageLocation, string contentType,
                                   string relationship, string name)
        {
            // Need to check first to see whether the part exists already.

            if (!filePackage.PartExists(packageLocation))
            {
                // Create a new blank package part at the specified URI
                // of the specified content type.
                PackagePart newPackagePart = filePackage.CreatePart(packageLocation,
                                                                    contentType);
                // Create a stream from the package part and save the
                // XML document to the package part.
                using (Stream partStream = newPackagePart.GetStream(FileMode.Create,
                                                                    FileAccess.ReadWrite))
                {
                    partXML.Save(partStream);
                }
            }
            // Add a relationship from the file package to this
            // package part. You can also create relationships
            // between an existing package part and a new part.
            var rel = parent.CreateRelationship(packageLocation,
                                                TargetMode.Internal,
                                                relationship);

            var pagesXml     = GetXMLFromPart(parent);
            var templatePage = pagesXml.Root.Elements().First(ele => ele.Attribute("NameU").Value == "Page-1");
            var pageXML      = new XElement(templatePage);

            pageXML.SetAttributeValue("Name", name);
            pageXML.SetAttributeValue("NameU", name);
            pageXML.SetAttributeValue("IsCustomNameU", "1");
            pageXML.SetAttributeValue("IsCustomName", "1");
            pageXML.SetAttributeValue("ID", templatePage.Parent.Elements().Count());
            XNamespace ns = pagesXml.Root.GetNamespaceOfPrefix("r");

            pageXML.Elements().First(el => el.Name.LocalName == "Rel").SetAttributeValue(ns + "id", rel.Id);
            templatePage.Parent.Add(new XElement(pageXML));
            SaveXDocumentToPart(parent, pagesXml);
        }
Ejemplo n.º 6
0
        /// <summary>
        /// If this document does not contain a /word/styles.xml add the default one generated by Microsoft Word.
        /// </summary>
        /// <param name="package"></param>
        /// <returns></returns>
        internal static XDocument AddDefaultStylesXml(Package package)
        {
            XDocument stylesDoc;
            // Create the main document part for this package
            PackagePart word_styles = package.CreatePart(new Uri("/word/styles.xml", UriKind.Relative), "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml", CompressionOption.Maximum);

            stylesDoc = HelperFunctions.DecompressXMLResource("Novacode.Resources.default_styles.xml.gz");
            XElement lang = stylesDoc.Root.Element(XName.Get("docDefaults", DocX.w.NamespaceName)).Element(XName.Get("rPrDefault", DocX.w.NamespaceName)).Element(XName.Get("rPr", DocX.w.NamespaceName)).Element(XName.Get("lang", DocX.w.NamespaceName));

            lang.SetAttributeValue(XName.Get("val", DocX.w.NamespaceName), CultureInfo.CurrentCulture);

            // Save /word/styles.xml
            using (TextWriter tw = new StreamWriter(new PackagePartStream(word_styles.GetStream(FileMode.Create, FileAccess.Write))))
                stylesDoc.Save(tw, SaveOptions.None);

            PackagePart mainDocumentPart = GetMainDocumentPart(package);

            mainDocumentPart.CreateRelationship(word_styles.Uri, TargetMode.Internal, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles");
            return(stylesDoc);
        }
Ejemplo n.º 7
0
        public Footnotes With([CanBeNull] XElement content = default, [CanBeNull] IEnumerable <HyperlinkInfo> hyperlinks = default)
        {
            Package package = _package.ToPackage(FileAccess.ReadWrite);

            if (package.PartExists(PartUri))
            {
                package.DeletePart(PartUri);
            }

            PackagePart footnotesPart = package.CreatePart(PartUri, ContentType);

            foreach (HyperlinkInfo info in hyperlinks ?? Hyperlinks)
            {
                footnotesPart.CreateRelationship(info.Target, info.TargetMode, HyperlinkInfo.RelationshipType, info.Id);
            }

            (content ?? Content).WriteTo(footnotesPart);

            return(new Footnotes(package));
        }
Ejemplo n.º 8
0
        private void WriteSharedStringsXml(Package package)
        {
            int count = _sheets.Sum(x => x.WordCount);

            Uri uri = PackUriHelper.CreatePartUri(new Uri("xl/sharedStrings.xml", UriKind.Relative));

            //Create the workbook part.
            PackagePart part = package.CreatePart(uri, NS_SHARED_STRINGS, CompressionOption.Maximum);

            using (var writer = XmlWriter.Create(part.GetStream(FileMode.Create, FileAccess.Write), xmlSettings)) {
                writer.WriteStartDocument(true);

                writer.WriteStartElement("sst", SCHEMA_MAIN);
                writer.WriteAttributeString("count", count.ToString(NumberFormatInfo.InvariantInfo));
                writer.WriteAttributeString(
                    "uniqueCount",
                    _sharedStrings.Count.ToString(NumberFormatInfo.InvariantInfo));
                // writer.WriteAttributeString("xmlns", SCHEMA_MAIN);

                foreach (var s in _sharedStrings.OrderBy(x => x.Value))
                {
                    writer.WriteStartElement("si");
                    writer.WriteStartElement("t");
                    writer.WriteString(s.Key);
                    writer.WriteEndElement();
                    writer.WriteEndElement();
                }

                writer.WriteEndElement();
            }

            //Create the relationship for the workbook part.
            Uri         bookUri  = PackUriHelper.CreatePartUri(new Uri("xl/workbook.xml", UriKind.Relative));
            PackagePart bookPart = package.GetPart(bookUri);

            bookPart.CreateRelationship(
                uri,
                TargetMode.Internal,
                RELATIONSHIP_SHAREDSTRINGS,
                "rId" + (_sheets.Count + 1));
        }
Ejemplo n.º 9
0
        /// <summary>
        /// If this document does not contain a /word/numbering.xml add the default one generated by Microsoft Word
        /// when the default bullet, numbered and multilevel lists are added to a blank document
        /// </summary>
        /// <param name="package"></param>
        /// <param name="mainDocumentPart"></param>
        /// <returns></returns>
        internal static XDocument AddDefaultNumberingXml(Package package)
        {
            XDocument numberingDoc;
            // Create the main document part for this package
            PackagePart wordNumbering = package.CreatePart(new Uri("/word/numbering.xml", UriKind.Relative), "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml", CompressionOption.Maximum);

            numberingDoc = DecompressXMLResource("Novacode.Resources.numbering.xml.gz");

            // Save /word/numbering.xml
            using (TextWriter tw = new StreamWriter(wordNumbering.GetStream(FileMode.Create, FileAccess.Write)))
                numberingDoc.Save(tw, SaveOptions.None);

            PackagePart mainDocumentPart = package.GetParts().Single(p => p.ContentType.Equals
                                                                     (
                                                                         "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml",
                                                                         StringComparison.CurrentCultureIgnoreCase
                                                                     ));

            mainDocumentPart.CreateRelationship(wordNumbering.Uri, TargetMode.Internal, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering");
            return(numberingDoc);
        }
Ejemplo n.º 10
0
        public void CreatePackage(string path, string profilePath)
        {
            try
            {
                Uri partUriProfile = PackUriHelper.CreatePartUri(
                    new Uri(Path.GetFileName(profilePath), UriKind.Relative));
                var hbProfileUrls = new Dictionary <string, Uri>();
                GetHbprofiles(profilePath, Professionbuddy.Instance.PbBehavior, hbProfileUrls);
                using (Package package = Package.Open(path, FileMode.Create))
                {
                    // Add the PB profile
                    PackagePart packagePartDocument =
                        package.CreatePart(partUriProfile, MediaTypeNames.Text.Xml, CompressionOption.Normal);
                    using (var fileStream = new FileStream(
                               profilePath, FileMode.Open, FileAccess.Read))
                    {
                        CopyStream(fileStream, packagePartDocument.GetStream());
                    }
                    package.CreateRelationship(packagePartDocument.Uri, TargetMode.Internal, PackageRelationshipType);

                    foreach (var kv in hbProfileUrls)
                    {
                        PackagePart packagePartHbProfile =
                            package.CreatePart(kv.Value, MediaTypeNames.Text.Xml, CompressionOption.Normal);

                        using (var fileStream = new FileStream(kv.Key, FileMode.Open, FileAccess.Read))
                        {
                            CopyStream(fileStream, packagePartHbProfile.GetStream());
                        }
                        packagePartDocument.CreateRelationship(kv.Value, TargetMode.Internal, ResourceRelationshipType);
                    }
                }
            }
            catch (Exception ex)
            {
                Professionbuddy.Err(ex.ToString());
            }
        }
        private void AppendImageToElement(KeyValuePair <string, ImageElement> placeholder, OpenXmlElement element, WordprocessingDocument wordprocessingDocument)
        {
            string imageExtension = ImageHandler.GetImageTypeFromMemStream(placeholder.Value.memStream);

            MainDocumentPart mainPart = wordprocessingDocument.MainDocumentPart;

            Uri imageUri = new Uri("/word/media/" +
                                   placeholder.Key + _imageCounter + "." + imageExtension, UriKind.Relative);

            // Create "image" part in /word/media
            // Change content type for other image types.
            PackagePart packageImagePart =
                wordprocessingDocument.Package.CreatePart(imageUri, "Image/" + imageExtension);


            // Feed data.
            placeholder.Value.memStream.Position = 0;
            byte[] imageBytes = placeholder.Value.memStream.ToArray();// File.ReadAllBytes(fileName);
            packageImagePart.GetStream().Write(imageBytes, 0, imageBytes.Length);

            PackagePart documentPackagePart =
                mainPart.OpenXmlPackage.Package.GetPart(new Uri("/word/document.xml", UriKind.Relative));

            // URI to the image is relative to relationship document.
            PackageRelationship imageRelationshipPart = documentPackagePart.CreateRelationship(
                new Uri("media/" + placeholder.Key + _imageCounter + "." + imageExtension, UriKind.Relative),
                TargetMode.Internal, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image");


            //AddImageToBody(wordprocessingDocument, imageRelationshipPart.Id);


            var imgTmp = ImageHandler.GetImageFromStream(placeholder.Value.memStream);

            var drawing = GetImageElement(imageRelationshipPart.Id, placeholder.Key, "picture", imgTmp.Width, imgTmp.Height, placeholder.Value.Dpi);

            element.AppendChild(drawing);
        }
Ejemplo n.º 12
0
        private void RemoveTemplate()
        {
            package.DeletePart(page.Uri);

            var pagesXML = GetXMLFromPart(pages);

            pagesXML.Root.Elements().First(ele => ele.Attribute("NameU").Value == "Page-1").Remove();


            Uri    pagesURI    = pages.Uri;
            string contentType = pages.ContentType;

            var relationships = pages.GetRelationships().Where(rel => rel.Id != "rId1");

            package.DeletePart(pages.Uri);
            PackagePart newPages = package.CreatePart(pagesURI, contentType);

            foreach (var relationship in relationships)
            {
                newPages.CreateRelationship(relationship.TargetUri, TargetMode.Internal, relationship.RelationshipType, relationship.Id);
            }
            SaveXDocumentToPart(newPages, pagesXML);
        }
Ejemplo n.º 13
0
        internal static PackagePart CreateOrGetSettingsPart(Package package)
        {
            Uri         uri = new Uri("/word/settings.xml", UriKind.Relative);
            PackagePart val;

            if (!package.PartExists(uri))
            {
                val = package.CreatePart(uri, "application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml", CompressionOption.Maximum);
                PackagePart val2 = ((IEnumerable <PackagePart>)package.GetParts()).Single((PackagePart p) => p.ContentType.Equals("application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml", StringComparison.CurrentCultureIgnoreCase) || p.ContentType.Equals("application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml", StringComparison.CurrentCultureIgnoreCase));
                val2.CreateRelationship(uri, 0, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings");
                XDocument xDocument = XDocument.Parse("<?xml version='1.0' encoding='utf-8' standalone='yes'?>\r\n                <w:settings xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:r='http://schemas.openxmlformats.org/officeDocument/2006/relationships' xmlns:m='http://schemas.openxmlformats.org/officeDocument/2006/math' xmlns:v='urn:schemas-microsoft-com:vml' xmlns:w10='urn:schemas-microsoft-com:office:word' xmlns:w='http://schemas.openxmlformats.org/wordprocessingml/2006/main' xmlns:sl='http://schemas.openxmlformats.org/schemaLibrary/2006/main'>\r\n                  <w:zoom w:percent='100' />\r\n                  <w:defaultTabStop w:val='720' />\r\n                  <w:characterSpacingControl w:val='doNotCompress' />\r\n                  <w:compat />\r\n                  <w:rsids>\r\n                    <w:rsidRoot w:val='00217F62' />\r\n                    <w:rsid w:val='001915A3' />\r\n                    <w:rsid w:val='00217F62' />\r\n                    <w:rsid w:val='00A906D8' />\r\n                    <w:rsid w:val='00AB5A74' />\r\n                    <w:rsid w:val='00F071AE' />\r\n                  </w:rsids>\r\n                  <m:mathPr>\r\n                    <m:mathFont m:val='Cambria Math' />\r\n                    <m:brkBin m:val='before' />\r\n                    <m:brkBinSub m:val='--' />\r\n                    <m:smallFrac m:val='off' />\r\n                    <m:dispDef />\r\n                    <m:lMargin m:val='0' />\r\n                    <m:rMargin m:val='0' />\r\n                    <m:defJc m:val='centerGroup' />\r\n                    <m:wrapIndent m:val='1440' />\r\n                    <m:intLim m:val='subSup' />\r\n                    <m:naryLim m:val='undOvr' />\r\n                  </m:mathPr>\r\n                  <w:themeFontLang w:val='en-IE' w:bidi='ar-SA' />\r\n                  <w:clrSchemeMapping w:bg1='light1' w:t1='dark1' w:bg2='light2' w:t2='dark2' w:accent1='accent1' w:accent2='accent2' w:accent3='accent3' w:accent4='accent4' w:accent5='accent5' w:accent6='accent6' w:hyperlink='hyperlink' w:followedHyperlink='followedHyperlink' />\r\n                  <w:shapeDefaults>\r\n                    <o:shapedefaults v:ext='edit' spidmax='2050' />\r\n                    <o:shapelayout v:ext='edit'>\r\n                      <o:idmap v:ext='edit' data='1' />\r\n                    </o:shapelayout>\r\n                  </w:shapeDefaults>\r\n                  <w:decimalSymbol w:val='.' />\r\n                  <w:listSeparator w:val=',' />\r\n                </w:settings>");
                XElement  xElement  = xDocument.Root.Element(XName.Get("themeFontLang", DocX.w.NamespaceName));
                xElement.SetAttributeValue(XName.Get("val", DocX.w.NamespaceName), CultureInfo.CurrentCulture);
                using (TextWriter textWriter = new StreamWriter(new PackagePartStream(val.GetStream())))
                {
                    xDocument.Save(textWriter);
                }
            }
            else
            {
                val = package.GetPart(uri);
            }
            return(val);
        }
Ejemplo n.º 14
0
        private Relationship AddRelationship(string location, string relationshipType, string parentLocation, TargetMode mode)
        {
            if (!this._relationships.ContainsKey(parentLocation) || this._relationships[parentLocation] == null)
            {
                this._relationships[parentLocation] = new List <Relationship>();
            }
            else
            {
                foreach (Relationship item in this._relationships[parentLocation])
                {
                    if (item.RelatedPart == location)
                    {
                        return(item);
                    }
                }
            }
            Relationship relationship = new Relationship();

            relationship.RelatedPart      = location;
            relationship.RelationshipId   = this.NextRelationshipId();
            relationship.RelationshipType = relationshipType;
            relationship.Mode             = mode;
            this._relationships[parentLocation].Add(relationship);
            Uri targetUri = (relationship.Mode != 0) ? new Uri(relationship.RelatedPart, UriKind.Absolute) : new Uri(WordOpenXmlUtils.CleanName(relationship.RelatedPart), UriKind.Relative);

            if (parentLocation == "/")
            {
                this._package.CreateRelationship(targetUri, relationship.Mode, relationship.RelationshipType, relationship.RelationshipId);
            }
            else
            {
                PackagePart part = this._package.GetPart(new Uri(WordOpenXmlUtils.CleanName(parentLocation), UriKind.Relative));
                part.CreateRelationship(targetUri, relationship.Mode, relationship.RelationshipType, relationship.RelationshipId);
            }
            return(relationship);
        }
Ejemplo n.º 15
0
        /// <summary>
        /// Gets the package stream from range.
        /// </summary>
        /// <param name="range">The range.</param>
        /// <returns></returns>
        public static byte[] GetPackageStream(this Word.Document document)
        {
            XDocument  doc = XDocument.Parse(document.WordOpenXML);
            XNamespace pkg =
                "http://schemas.microsoft.com/office/2006/xmlPackage";
            XNamespace rel =
                "http://schemas.openxmlformats.org/package/2006/relationships";
            Package InmemoryPackage = null;

            byte[] output = null;

            using (MemoryStream memStream = new MemoryStream())
            {
                using (InmemoryPackage = Package.Open(memStream, FileMode.Create))
                {
                    // add all parts (but not relationships)
                    foreach (var xmlPart in doc.Root
                             .Elements()
                             .Where(p =>
                                    (string)p.Attribute(pkg + "contentType") !=
                                    "application/vnd.openxmlformats-package.relationships+xml"))
                    {
                        string name        = (string)xmlPart.Attribute(pkg + "name");
                        string contentType = (string)xmlPart.Attribute(pkg + "contentType");
                        if (contentType.EndsWith("xml"))
                        {
                            Uri         u    = new Uri(name, UriKind.Relative);
                            PackagePart part = InmemoryPackage.CreatePart(u, contentType,
                                                                          CompressionOption.Normal);
                            using (Stream str = part.GetStream(FileMode.Create))
                                using (XmlWriter xmlWriter = XmlWriter.Create(str))
                                    xmlPart.Element(pkg + "xmlData")
                                    .Elements()
                                    .First()
                                    .WriteTo(xmlWriter);
                        }
                        else
                        {
                            Uri         u    = new Uri(name, UriKind.Relative);
                            PackagePart part = InmemoryPackage.CreatePart(u, contentType,
                                                                          CompressionOption.Normal);
                            using (Stream str = part.GetStream(FileMode.Create))
                                using (BinaryWriter binaryWriter = new BinaryWriter(str))
                                {
                                    string base64StringInChunks =
                                        (string)xmlPart.Element(pkg + "binaryData");
                                    char[] base64CharArray = base64StringInChunks
                                                             .Where(c => c != '\r' && c != '\n').ToArray();
                                    byte[] byteArray =
                                        System.Convert.FromBase64CharArray(base64CharArray,
                                                                           0, base64CharArray.Length);
                                    binaryWriter.Write(byteArray);
                                }
                        }
                    }
                    foreach (var xmlPart in doc.Root.Elements())
                    {
                        string name        = (string)xmlPart.Attribute(pkg + "name");
                        string contentType = (string)xmlPart.Attribute(pkg + "contentType");
                        if (contentType ==
                            "application/vnd.openxmlformats-package.relationships+xml")
                        {
                            // add the package level relationships
                            if (name == "/_rels/.rels")
                            {
                                foreach (XElement xmlRel in
                                         xmlPart.Descendants(rel + "Relationship"))
                                {
                                    string id         = (string)xmlRel.Attribute("Id");
                                    string type       = (string)xmlRel.Attribute("Type");
                                    string target     = (string)xmlRel.Attribute("Target");
                                    string targetMode =
                                        (string)xmlRel.Attribute("TargetMode");
                                    if (targetMode == "External")
                                    {
                                        InmemoryPackage.CreateRelationship(
                                            new Uri(target, UriKind.Absolute),
                                            TargetMode.External, type, id);
                                    }
                                    else
                                    {
                                        InmemoryPackage.CreateRelationship(
                                            new Uri(target, UriKind.Relative),
                                            TargetMode.Internal, type, id);
                                    }
                                }
                            }
                            else
                            // add part level relationships
                            {
                                string directory    = name.Substring(0, name.IndexOf("/_rels"));
                                string relsFilename = name.Substring(name.LastIndexOf('/'));
                                string filename     =
                                    relsFilename.Substring(0, relsFilename.IndexOf(".rels"));
                                PackagePart fromPart = InmemoryPackage.GetPart(
                                    new Uri(directory + filename, UriKind.Relative));
                                foreach (XElement xmlRel in
                                         xmlPart.Descendants(rel + "Relationship"))
                                {
                                    string id         = (string)xmlRel.Attribute("Id");
                                    string type       = (string)xmlRel.Attribute("Type");
                                    string target     = (string)xmlRel.Attribute("Target");
                                    string targetMode =
                                        (string)xmlRel.Attribute("TargetMode");
                                    if (targetMode == "External")
                                    {
                                        fromPart.CreateRelationship(
                                            new Uri(target, UriKind.Absolute),
                                            TargetMode.External, type, id);
                                    }
                                    else
                                    {
                                        fromPart.CreateRelationship(
                                            new Uri(target, UriKind.Relative),
                                            TargetMode.Internal, type, id);
                                    }
                                }
                            }
                        }
                    }

                    InmemoryPackage.Flush();
                }

                memStream.Position = 0;
                output             = new byte[memStream.Length];
                memStream.Read(output, 0, output.Length);
            }

            return(output);
        }
Ejemplo n.º 16
0
        public static void SaveDOCX(Stream fileStream, string BodyText, bool IncludeHTML)
        {
            // use the Open XML namespace for WordprocessingML:
            string WordprocessingML = "http://schemas.openxmlformats.org/wordprocessingml/2006/main";

            // create a new package (Open XML document) ...
            Package pkgOutputDoc = null;

            pkgOutputDoc = Package.Open(fileStream, FileMode.OpenOrCreate, FileAccess.ReadWrite);

            // create the start part, set up the nested structure ...
            XmlDocument xmlStartPart = new XmlDocument();
            XmlElement  tagDocument  = xmlStartPart.CreateElement("w:document", WordprocessingML);

            xmlStartPart.AppendChild(tagDocument);
            XmlElement tagBody = xmlStartPart.CreateElement("w:body", WordprocessingML);

            tagDocument.AppendChild(tagBody);
            if (IncludeHTML)
            {
                string relationshipNamespace = "http://schemas.openxmlformats.org/officeDocument/2006/relationships";

                XmlElement   tagAltChunk = xmlStartPart.CreateElement("w:altChunk", WordprocessingML);
                XmlAttribute RelID       = tagAltChunk.Attributes.Append(xmlStartPart.CreateAttribute("r:id", relationshipNamespace));
                RelID.Value = "rId2";
                tagBody.AppendChild(tagAltChunk);
            }
            else
            {
                XmlElement tagParagraph = xmlStartPart.CreateElement("w:p", WordprocessingML);
                tagBody.AppendChild(tagParagraph);
                XmlElement tagRun = xmlStartPart.CreateElement("w:r", WordprocessingML);
                tagParagraph.AppendChild(tagRun);
                XmlElement tagText = xmlStartPart.CreateElement("w:t", WordprocessingML);
                tagRun.AppendChild(tagText);

                // Note nesting of tags for the WordprocessingML document (the "start part") ...
                // w:document contains ...
                //     w:body, which contains ...
                //         w:p (paragraph), which contains ...
                //             w:r (run), which contains ...
                //                 w:t (text)

                // insert text into the start part, as a "Text" node ...
                XmlNode nodeText = xmlStartPart.CreateNode(XmlNodeType.Text, "w:t", WordprocessingML);
                nodeText.Value = BodyText;
                tagText.AppendChild(nodeText);
            }

            // save the main document part (document.xml) ...
            Uri          docuri             = new Uri("/word/document.xml", UriKind.Relative);
            PackagePart  docpartDocumentXML = pkgOutputDoc.CreatePart(docuri, "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml");
            StreamWriter streamStartPart    = new StreamWriter(docpartDocumentXML.GetStream(FileMode.Create, FileAccess.Write));

            xmlStartPart.Save(streamStartPart);
            streamStartPart.Close();
            pkgOutputDoc.Flush();

            // create the relationship part
            pkgOutputDoc.CreateRelationship(docuri, TargetMode.Internal, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument", "rId1");
            pkgOutputDoc.Flush();

            //this part was taken from the HTMLtoWordML project on CodeProject, authored by Paulo Vaz, which borrowed work from Praveen Bonakurthi
            //original project location for Paulo's project is http://www.codeproject.com/KB/aspnet/HTMLtoWordML.aspx, and it contains a link to the article
            //by Praveen Bonakurthi. I didn't want to have a resident template on the server, so it led to this project

            Uri         uriBase         = new Uri("/word/document.xml", UriKind.Relative);
            PackagePart partDocumentXML = pkgOutputDoc.GetPart(uriBase);

            Uri uri = new Uri("/word/websiteinput.html", UriKind.Relative);

            //creating the html file from the output of the webform
            string html = string.Concat("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\"><html><head><title></title></head><body>", BodyText, "</body></html>");

            byte[]      Origem       = Encoding.UTF8.GetBytes(html);
            PackagePart altChunkpart = pkgOutputDoc.CreatePart(uri, "text/html");

            using (Stream targetStream = altChunkpart.GetStream())
            {
                targetStream.Write(Origem, 0, Origem.Length);
            }
            Uri relativeAltUri = PackUriHelper.GetRelativeUri(uriBase, uri);

            //create the relationship in the final file
            partDocumentXML.CreateRelationship(relativeAltUri, TargetMode.Internal, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/aFChunk", "rId2");

            //close the document ...
            pkgOutputDoc.Flush();
        }
Ejemplo n.º 17
0
        private PackagePart GetAnnotationPart(Uri uri)
        {
            Package package = PackageStore.GetPackage(documentUri);

            if (package == null)
            {
                return(null);
            }

            // Get the FixedDocumentSequence part from the package.
            PackagePart fdsPart = package.GetPart(uri);

            // Search through all the document relationships to find the
            // annotations relationship part (or null, of there is none).
            PackageRelationship annotRel = null;

            annotRel
                = fdsPart.GetRelationships().FirstOrDefault <PackageRelationship>(
                      pr => pr.RelationshipType == annotRelsType);

            PackagePart annotPart;

            //If annotations relationship does not exist, create a new
            //annotations part, if required, and a relationship for it.
            if (annotRel == null)
            {
                Uri annotationUri =
                    PackUriHelper.CreatePartUri(new Uri("annotations.xml",
                                                        UriKind.Relative));

                if (package.PartExists(annotationUri))
                {
                    annotPart = package.GetPart(annotationUri);
                }
                else
                {
                    //Create a new Annotations part in the document.
                    annotPart = package.CreatePart(annotationUri, annotContentType);
                }

                //Create a new relationship that points to the Annotations part.
                fdsPart.CreateRelationship(annotPart.Uri,
                                           TargetMode.Internal,
                                           annotRelsType);
            }
            else
            {
                //If an annotations relationship exists,
                //get the annotations part that it references.

                //Get the Annotations part specified by the relationship.
                annotPart = package.GetPart(annotRel.TargetUri);

                if (annotPart == null)
                {
                    //The annotations part pointed to by the annotation
                    //relationship Uri is not present. Handle as required.
                    return(null);
                }
            }

            return(annotPart);
        }
Ejemplo n.º 18
0
        /// <summary>
        /// Gets the document theme
        /// </summary>
        public Package GetTheme(string outputPath)
        {
            Package themePackage = null;
            // Loads the theme part main file
            ThemePart theme = parentDocument.Document.MainDocumentPart.ThemePart;

            if (theme != null)
            {
                XDocument themeDocument = parentDocument.GetXDocument(theme);

                // Creates the theme package (thmx file)
                themePackage = Package.Open(outputPath, FileMode.Create);

                // Creates the theme manager part on the new package and loads default content
                PackagePart newThemeManagerPart = themePackage.CreatePart(new Uri("/theme/theme/themeManager.xml", UriKind.RelativeOrAbsolute), "application/vnd.openxmlformats-officedocument.themeManager+xml");
                themePackage.CreateRelationship(newThemeManagerPart.Uri, TargetMode.Internal, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument");
                using (XmlWriter xWriter = XmlWriter.Create(newThemeManagerPart.GetStream(FileMode.Create, FileAccess.Write)))
                {
                    CreateEmptyThemeManager().WriteTo(xWriter);
                    xWriter.Flush();
                }

                // Creates the main theme part
                PackagePart newThemePart = themePackage.CreatePart(new Uri("/theme/theme/" + theme.Uri.OriginalString.Substring(theme.Uri.OriginalString.LastIndexOf('/') + 1), UriKind.RelativeOrAbsolute), theme.ContentType);
                newThemeManagerPart.CreateRelationship(newThemePart.Uri, TargetMode.Internal, theme.RelationshipType);

                // Gets embeded part references
                var embeddedItems =
                    themeDocument
                    .Descendants()
                    .Attributes(relationshipns + "embed");

                foreach (IdPartPair partId in theme.Parts)
                {
                    OpenXmlPart part = partId.OpenXmlPart;

                    // Creates the new media part inside the destination package
                    PackagePart         newPart      = themePackage.CreatePart(new Uri("/theme/media/" + part.Uri.OriginalString.Substring(part.Uri.OriginalString.LastIndexOf('/') + 1), UriKind.RelativeOrAbsolute), part.ContentType);
                    PackageRelationship relationship =
                        newThemePart.CreateRelationship(newPart.Uri, TargetMode.Internal, part.RelationshipType);

                    // Copies binary content from original part to destination part
                    Stream partStream    = part.GetStream(FileMode.Open, FileAccess.Read);
                    Stream newPartStream = newPart.GetStream(FileMode.Create, FileAccess.Write);
                    byte[] fileContent   = new byte[partStream.Length];
                    partStream.Read(fileContent, 0, (int)partStream.Length);
                    newPartStream.Write(fileContent, 0, (int)partStream.Length);
                    newPartStream.Flush();

                    // Replaces old embed part reference with the freshly created one
                    XAttribute relationshipAttribute = embeddedItems.FirstOrDefault(e => e.Value == theme.GetIdOfPart(part));
                    if (relationshipAttribute != null)
                    {
                        relationshipAttribute.Value = relationship.Id;
                    }
                }

                // Writes the updated theme XDocument into the destination package
                using (XmlWriter newThemeWriter = XmlWriter.Create(newThemePart.GetStream(FileMode.Create, FileAccess.Write)))
                    themeDocument.WriteTo(newThemeWriter);

                //themePackage.Flush();
                themePackage.Close();
            }
            return(themePackage);
        }
Ejemplo n.º 19
0
 public void WritePrintTicket(XpsPartBase relatedPart, PackagePart metroPart, PrintTicket printTicket)
 {
     Stream stream;
     if (relatedPart == null)
     {
         throw new ArgumentNullException("relatedPart");
     }
     if (metroPart == null)
     {
         throw new ArgumentNullException("metroPart");
     }
     if (printTicket == null)
     {
         throw new ArgumentNullException("printTicket");
     }
     Uri partUri = this.GeneratePrintTicketUri(relatedPart);
     PackagePart part = this.GeneratePart(XpsS0Markup.PrintTicketContentType, partUri);
     string uriString = MakeRelativePath(metroPart.Uri, part.Uri);
     metroPart.CreateRelationship(new Uri(uriString, UriKind.Relative), TargetMode.Internal, XpsS0Markup.PrintTicketRelationshipName);
     if (this._metroPackage.FileOpenAccess == FileAccess.Write)
     {
         stream = part.GetStream(FileMode.Create);
     }
     else
     {
         stream = part.GetStream(FileMode.OpenOrCreate);
     }
     printTicket.SaveTo(stream);
     stream.Close();
 }
Ejemplo n.º 20
0
        private Worksheet AddWorksheet(string name)
        {
            try {
                PackageRelationship sheetRelationship = null;
                using (Stream workbookStream = _workbookPart.GetStream(FileMode.Open, FileAccess.ReadWrite)) {
                    Uri sheetUri = null;
                    using (var writer = XmlWriter.Create(workbookStream)) {
                        var document = XDocument.Load(workbookStream);

                        XElement sheets = document.Descendants().FirstOrDefault(d => d.Name.Equals(Constants.MainXNamespace + "sheets"));

                        var sheetElements = sheets.Descendants(Constants.MainXNamespace + "sheet");
                        int sheetId;

                        if (sheetElements.Any())
                        {
                            if (sheetElements.Any(se => se.Attribute("name").Value == name))
                            {
                                throw new Exception(String.Format("Sheet with name {0} already exists", name));
                            }

                            Int32.TryParse(sheetElements.Last().Attribute("sheetId").Value, out sheetId);
                            sheetId++;
                        }
                        else
                        {
                            sheetId = 1;
                        }
                        sheetUri          = new Uri(String.Format(Constants.SheetUriFormatPath, sheetId), UriKind.Relative);
                        sheetRelationship = _workbookPart.CreateRelationship(sheetUri, TargetMode.Internal, Constants.RelationshipNamespace + "/worksheet");

                        sheets.Add(new XElement(Constants.MainXNamespace + "sheet"
                                                , new XAttribute("name", name)
                                                , new XAttribute("sheetId", sheetId)
                                                , new XAttribute(Constants.RelationshipXNamespace + "id", sheetRelationship.Id)));

                        // Clear the workbook xml file
                        workbookStream.SetLength(0);

                        document.WriteTo(writer);
                    }


                    PackagePart worksheetPart = _package.CreatePart(sheetUri, Constants.WorksheetContentType);

                    var worksheet = new Worksheet(_stylesheet, worksheetPart)
                    {
                        Name           = name,
                        RelationshipId = sheetRelationship.Id,
                    };

                    using (var writer = XmlWriter.Create(worksheetPart.GetStream(FileMode.Create, FileAccess.Write))) {
                        worksheet.WorksheetXml = new XDocument(new XElement(Constants.MainXNamespace + "worksheet",
                                                                            new XAttribute(XNamespace.Xmlns + "r", Constants.RelationshipNamespace)));

                        worksheet.WorksheetXml.WriteTo(writer);
                    }

                    return(worksheet);
                }
            }
            catch {
                // TODO :: Add exception handling logic
                throw;
            }
        }
        private string AddImageHelper(string fileName, string id)
        {
            if (fileName == null)
            {
                throw new ArgumentNullException("fileName");
            }

            Debug.Assert(File.Exists(fileName), fileName + "does not exist.");
            if (!File.Exists(fileName))
            {
                return(null);
            }

            BinaryReader br = new BinaryReader(File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite));

            Debug.Assert(br != null, "Fail to create a BinaryReader from file.");
            if (br == null)
            {
                return(null);
            }

            Uri imageUri  = new Uri("images/" + Path.GetFileName(fileName), UriKind.Relative);
            int fileIndex = 0;

            while (true)
            {
                if (_part.Package.PartExists(PackUriHelper.ResolvePartUri(_part.Uri, imageUri)))
                {
                    Debug.Write(imageUri.ToString() + " already exists.");
                    imageUri = new Uri(
                        "images/" +
                        Path.GetFileNameWithoutExtension(fileName) +
                        (fileIndex++).ToString() +
                        Path.GetExtension(fileName),
                        UriKind.Relative);
                    continue;
                }
                break;
            }

            if (id != null)
            {
                int    idIndex = 0;
                string testId  = id;
                while (true)
                {
                    if (_part.RelationshipExists(testId))
                    {
                        Debug.Write(testId + " already exists.");
                        testId = id + (idIndex++);
                        continue;
                    }
                    id = testId;
                    break;
                }
            }

            PackageRelationship imageRel = _part.CreateRelationship(imageUri, TargetMode.Internal, OfficeDocument.ImagePartRelType, id);

            Debug.Assert(imageRel != null, "Fail to create image relationship.");
            if (imageRel == null)
            {
                return(null);
            }

            PackagePart imagePart = _part.Package.CreatePart(
                PackUriHelper.ResolvePartUri(imageRel.SourceUri, imageRel.TargetUri),
                OfficePart.MapImageContentType(Path.GetExtension(fileName)));

            Debug.Assert(imagePart != null, "Fail to create image part.");
            if (imagePart == null)
            {
                return(null);
            }

            BinaryWriter bw = new BinaryWriter(imagePart.GetStream(FileMode.Create, FileAccess.Write));

            Debug.Assert(bw != null, "Fail to create a BinaryWriter to write to part.");
            if (bw == null)
            {
                return(null);
            }

            byte[] buffer    = new byte[1024];
            int    byteCount = 0;

            while ((byteCount = br.Read(buffer, 0, buffer.Length)) > 0)
            {
                bw.Write(buffer, 0, byteCount);
            }

            bw.Flush();
            bw.Close();
            br.Close();

            return(imageRel.Id);
        }
Ejemplo n.º 22
0
        internal sealed override PackageRelationship CreateRelationship(Uri targetUri, TargetMode targetMode, string relationshipType)
        {
            ThrowIfObjectDisposed();

            return(_packagePart.CreateRelationship(targetUri, targetMode, relationshipType));
        }
        private static void SaveDOCX(string fileName, string BodyText, bool IncludeHTML)
        {
            string WordprocessingML = "http://schemas.openxmlformats.org/wordprocessingml/2006/main";

            var pkgOutputDoc = Package.Open(fileName, FileMode.Create, FileAccess.ReadWrite);

            XmlDocument xmlStartPart = new XmlDocument();
            XmlElement  tagDocument  = xmlStartPart.CreateElement("w:document", WordprocessingML);

            xmlStartPart.AppendChild(tagDocument);
            XmlElement tagBody = xmlStartPart.CreateElement("w:body", WordprocessingML);

            tagDocument.AppendChild(tagBody);
            if (IncludeHTML)
            {
                string       relationshipNamespace = "http://schemas.openxmlformats.org/officeDocument/2006/relationships";
                XmlElement   tagAltChunk           = xmlStartPart.CreateElement("w:altChunk", WordprocessingML);
                XmlAttribute RelID = tagAltChunk.Attributes.Append(xmlStartPart.CreateAttribute("r:id", relationshipNamespace));
                RelID.Value = "rId2";
                tagBody.AppendChild(tagAltChunk);
            }
            else
            {
                XmlElement tagParagraph = xmlStartPart.CreateElement("w:p", WordprocessingML);
                tagBody.AppendChild(tagParagraph);
                XmlElement tagRun = xmlStartPart.CreateElement("w:r", WordprocessingML);
                tagParagraph.AppendChild(tagRun);
                XmlElement tagText = xmlStartPart.CreateElement("w:t", WordprocessingML);
                tagRun.AppendChild(tagText);
                XmlNode nodeText = xmlStartPart.CreateNode(XmlNodeType.Text, "w:t", WordprocessingML);
                nodeText.Value = BodyText;
                tagText.AppendChild(nodeText);
            }

            Uri          docuri             = new Uri("/word/document.xml", UriKind.Relative);
            PackagePart  docpartDocumentXML = pkgOutputDoc.CreatePart(docuri, "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml");
            StreamWriter streamStartPart    = new StreamWriter(docpartDocumentXML.GetStream(FileMode.Create, FileAccess.Write));

            xmlStartPart.Save(streamStartPart);
            streamStartPart.Close();
            pkgOutputDoc.Flush();

            pkgOutputDoc.CreateRelationship(docuri, TargetMode.Internal, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument", "rId1");
            pkgOutputDoc.Flush();

            Uri         uriBase         = new Uri("/word/document.xml", UriKind.Relative);
            PackagePart partDocumentXML = pkgOutputDoc.GetPart(uriBase);

            Uri uri = new Uri("/word/websiteinput.html", UriKind.Relative);

            string html = string.Concat("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\"><html><head><title></title></head><body>", BodyText, "</body></html>");

            byte[]      Origem       = Encoding.UTF8.GetBytes(html);
            PackagePart altChunkpart = pkgOutputDoc.CreatePart(uri, "text/html");

            using (Stream targetStream = altChunkpart.GetStream())
            {
                targetStream.Write(Origem, 0, Origem.Length);
            }
            Uri relativeAltUri = PackUriHelper.GetRelativeUri(uriBase, uri);

            partDocumentXML.CreateRelationship(relativeAltUri, TargetMode.Internal, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/aFChunk", "rId2");

            pkgOutputDoc.Close();
        }
Ejemplo n.º 24
0
        private void ReplaceImageTokens(PackagePart slide, XmlDocument slideXml, XmlDocument datasets, XPathNavigator navigator)
        {
            Dictionary <string, string> _slideImageRelationships = new Dictionary <string, string>();

            var tokenImageNodes = slideXml.SelectNodes("//p:pic/p:nvPicPr/p:cNvPr[starts-with(@title,'!')]", _nsManagerPresentationXml);

            foreach (XmlElement tokenNode in tokenImageNodes)
            {
                try
                {
                    string xpath = tokenNode.GetAttribute("title");
                    Trace("Image token:{0}", xpath);
                    // Get the image node

                    XmlElement imageNode = (XmlElement)tokenNode.ParentNode.ParentNode.SelectSingleNode("p:blipFill/a:blip", _nsManagerPresentationXml);
                    if (imageNode == null)
                    {
                        continue;
                    }
                    Trace("Found Image");

                    string[] expressions = xpath.Split(new string[] { "||" }, StringSplitOptions.RemoveEmptyEntries);

                    // The xpath should evaluate to an annoation node that contains documentbody,mimetype,annotationid
                    // if it doesn't then try the next expression (spearated by ||)
                    PackagePart imagePart = null;
                    string      imageKey  = Guid.Empty.ToString();
                    foreach (var value in expressions)
                    {
                        string xpathExpression = value.TrimStart('!');
                        if (xpathExpression.StartsWith("~"))
                        {
                            string imageData = GetData(navigator, xpathExpression);
                            if (!string.IsNullOrEmpty(imageData))
                            {
                                Guid imageId = Guid.NewGuid();
                                imagePart = AddImage(imageId, imageData, "image/jpeg", imageId.ToString("N") + ".jpg");
                                break;
                            }
                        }
                        else
                        {
                            imagePart = GetAnnotationImage(datasets, xpathExpression, out imageKey, out CropRectangle crop);

                            // If a crop is found, set the rectangle position on the image. These are percentages of the total size from left, right, top and bottom
                            if (crop != null)
                            {
                                XmlElement blipFill = (XmlElement)tokenNode.ParentNode.ParentNode.SelectSingleNode("p:blipFill", _nsManagerPresentationXml);
                                XmlElement srcRect  = (XmlElement)blipFill.SelectSingleNode("a:srcRect", _nsManagerPresentationXml);
                                if (srcRect == null)
                                {
                                    var stretch = tokenNode.ParentNode.ParentNode.SelectSingleNode("p:blipFill/a:stretch", _nsManagerPresentationXml);
                                    // Add srcRect into fill
                                    srcRect = blipFill.OwnerDocument.CreateElement("a", "srcRect", _nsManagerPresentationXml.LookupNamespace("a"));
                                    blipFill.InsertBefore(srcRect, stretch);
                                }
                                srcRect.SetAttribute("l", ConvertToOpenXmlPercentage(crop.left));
                                srcRect.SetAttribute("r", ConvertToOpenXmlPercentage(crop.right));
                                srcRect.SetAttribute("t", ConvertToOpenXmlPercentage(crop.top));
                                srcRect.SetAttribute("b", ConvertToOpenXmlPercentage(crop.bottom));
                            }

                            if (imagePart != null)
                            {
                                break;
                            }
                        }
                    }

                    if (imagePart != null)
                    {
                        // Determine if it's arleady associated wtih this slide - if not associate it
                        string imageRId = null;
                        if (_slideImageRelationships.ContainsKey(imageKey))
                        {
                            imageRId = _slideImageRelationships[imageKey];
                        }
                        else
                        {
                            var relationship = slide.CreateRelationship(imagePart.Uri, TargetMode.Internal, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image");
                            imageRId = relationship.Id;
                            _slideImageRelationships.Add(imageKey, imageRId);
                        }

                        // Set the r:embed attribute to the relationship Id
                        imageNode.SetAttribute("embed", relationshipsNs, imageRId);
                    }
                    else if (imageKey != Guid.Empty.ToString())
                    {
                        // the image key is the url of the image
                        string imageRId = null;
                        if (_slideImageRelationships.ContainsKey(imageKey))
                        {
                            imageRId = _slideImageRelationships[imageKey];
                        }
                        else
                        {
                            var relationship = slide.CreateRelationship(new Uri(imageKey), TargetMode.External, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image");
                            imageRId = relationship.Id;
                            _slideImageRelationships.Add(imageKey, imageRId);
                        }

                        // Set the r:embed attribute to the relationship Id
                        imageNode.SetAttribute("link", relationshipsNs, imageRId);
                    }
                }
                catch (Exception ex)
                {
                    Trace("Image Exception:{0}", ex.ToString());
                }
            }
        }
Ejemplo n.º 25
0
 public PackagePart AddSignatureDefinitionPart(PackagePart documentPart)
 {
     PackagePart signatureDefinitionPart = this.GetSignatureDefinitionPart(documentPart.Uri);
     if (signatureDefinitionPart == null)
     {
         signatureDefinitionPart = this.GenerateUniquePart(XpsS0Markup.SignatureDefintionType);
         documentPart.CreateRelationship(signatureDefinitionPart.Uri, TargetMode.Internal, XpsS0Markup.SignatureDefinitionRelationshipName);
     }
     return signatureDefinitionPart;
 }
Ejemplo n.º 26
0
        }// end:main()

        //<SnippetPackageWriteCreatePackage>
        //  -------------------------- CreatePackage --------------------------
        /// <summary>
        ///   Creates a package zip file containing specified
        ///   content and resource files.</summary>
        private static void CreatePackage()
        {
            //<SnippetPackageWriteCreatePartUri>
            // Convert system path and file names to Part URIs. In this example
            // Uri partUriDocument /* /Content/Document.xml */ =
            //     PackUriHelper.CreatePartUri(
            //         new Uri("Content\Document.xml", UriKind.Relative));
            // Uri partUriResource /* /Resources/Image1.jpg */ =
            //     PackUriHelper.CreatePartUri(
            //         new Uri("Resources\Image1.jpg", UriKind.Relative));
            Uri partUriDocument = PackUriHelper.CreatePartUri(
                new Uri(documentPath, UriKind.Relative));
            Uri partUriResource = PackUriHelper.CreatePartUri(
                new Uri(resourcePath, UriKind.Relative));

            //</SnippetPackageWriteCreatePartUri>

            // Create the Package
            // (If the package file already exists, FileMode.Create will
            //  automatically delete it first before creating a new one.
            //  The 'using' statement insures that 'package' is
            //  closed and disposed when it goes out of scope.)
            //<SnippetPackageWriteUsingPackage>
            using (Package package =
                       Package.Open(packagePath, FileMode.Create))
            {
                //<SnippetPackageWriteCreatePackageRelationship>
                //<SnippetPackageWriteCreatePart>
                // Add the Document part to the Package
                PackagePart packagePartDocument =
                    package.CreatePart(partUriDocument,
                                       System.Net.Mime.MediaTypeNames.Text.Xml);

                // Copy the data to the Document Part
                using (FileStream fileStream = new FileStream(
                           documentPath, FileMode.Open, FileAccess.Read))
                {
                    CopyStream(fileStream, packagePartDocument.GetStream());
                }// end:using(fileStream) - Close and dispose fileStream.
                 //</SnippetPackageWriteCreatePart>

                // Add a Package Relationship to the Document Part
                package.CreateRelationship(packagePartDocument.Uri,
                                           TargetMode.Internal,
                                           PackageRelationshipType);
                //</SnippetPackageWriteCreatePackageRelationship>

                //<SnippetPackageWriteCreateRelationship>
                // Add a Resource Part to the Package
                PackagePart packagePartResource =
                    package.CreatePart(partUriResource,
                                       System.Net.Mime.MediaTypeNames.Image.Jpeg);

                // Copy the data to the Resource Part
                using (FileStream fileStream = new FileStream(
                           resourcePath, FileMode.Open, FileAccess.Read))
                {
                    CopyStream(fileStream, packagePartResource.GetStream());
                }// end:using(fileStream) - Close and dispose fileStream.

                // Add Relationship from the Document part to the Resource part
                packagePartDocument.CreateRelationship(
                    new Uri(@"../resources/image1.jpg",
                            UriKind.Relative),
                    TargetMode.Internal,
                    ResourceRelationshipType);
                //</SnippetPackageWriteCreateRelationship>
            } // end:using (Package package) - Close and dispose package.
             //</SnippetPackageWriteUsingPackage>
        }     // end:CreatePackage()
Ejemplo n.º 27
0
        private void Apply(Package package, string localFilename, bool installed)
        {
            using (Package setPkg = Package.Open(localFilename, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
            {
                // Extract information about the target set
                PackageRelationship defRelationship =
                    setPkg.GetRelationshipsByType("http://schemas.octgn.org/set/definition").First();
                PackagePart definition = setPkg.GetPart(defRelationship.TargetUri);
                Set         set;
                using (XmlReader reader = XmlReader.Create(definition.GetStream(), XmlSettings))
                {
                    reader.ReadToFollowing("set"); // <?xml ... ?>
                    set = new Set(localFilename, reader, _game.Repository);
                    // Check if the set game matches the patch
                    if (set.Game != _game)
                    {
                        return;
                    }
                }

                // Check if there is a patch for this set
                string relationId = "S" + set.Id.ToString("N");
                if (!package.RelationshipExists(relationId))
                {
                    return;
                }

                PackagePart patchPart = package.GetPart(package.GetRelationship(relationId).TargetUri);
                XDocument   patchDoc;
                using (Stream stream = patchPart.GetStream())
                    patchDoc = XDocument.Load(stream);

                // Check if the set is at least the required version for patching
                if (set.Version < patchDoc.Root.Attr <Version>("minVersion"))
                {
                    return;
                }
                if (set.Version > patchDoc.Root.Attr <Version>("maxVersion"))
                {
                    return;
                }

                if (installed)
                {
                    _game.DeleteSet(_game.Sets.Single(s => s.PackageName == localFilename));
                }

                // Process the set
                if (patchDoc.Root != null)
                {
                    foreach (XElement action in patchDoc.Root.Elements())
                    {
                        switch (action.Name.LocalName)
                        {
                        case "new":
                        {
                            var         targetUri      = new Uri(action.Attr <string>("targetUri"), UriKind.Relative);
                            var         relationshipId = action.Attr <string>("relationshipId");
                            var         contentType    = action.Attr <string>("contentType");
                            PackagePart part           = setPkg.PartExists(targetUri)
                                                           ? setPkg.GetPart(targetUri)
                                                           : setPkg.CreatePart(targetUri, contentType,
                                                                               CompressionOption.Normal);
                            if (part != null)
                            {
                                using (Stream targetStream = part.GetStream(FileMode.Create, FileAccess.Write))
                                    using (
                                        Stream srcStream =
                                            package.GetPart(patchPart.GetRelationship(relationshipId).TargetUri).
                                            GetStream())
                                        srcStream.CopyTo(targetStream);
                            }
                            break;
                        }

                        case "newrel":
                        {
                            var partUri          = new Uri(action.Attr <string>("partUri"), UriKind.Relative);
                            var relationshipId   = action.Attr <string>("relationshipId");
                            var targetUri        = new Uri(action.Attr <string>("targetUri"), UriKind.Relative);
                            var relationshipType = action.Attr <string>("relationshipType");

                            PackagePart part = setPkg.GetPart(partUri);
                            if (part.RelationshipExists(relationshipId))
                            {
                                part.DeleteRelationship(relationshipId);
                            }
                            part.CreateRelationship(targetUri, TargetMode.Internal, relationshipType,
                                                    relationshipId);
                            break;
                        }

                        default:
                            throw new InvalidFileFormatException("Unknown patch action: " + action.Name);
                        }
                    }
                }
            }

            OnProgress(string.Format("{0} patched.", Path.GetFileName(localFilename)));

            if (installed)
            {
                try
                {
                    _game.InstallSet(localFilename);
                }
                catch (Exception ex)
                {
                    OnProgress(string.Format("{0} can't be re-installed.\nDetails: {1}", localFilename, ex.Message),
                               true);
                }
            }
        }
Ejemplo n.º 28
0
        //protected abstract IEnumerable<T> GetData();

        private string GenerateExcelFile()
        {
            XNamespace aw = spreadsheetML;
            XNamespace r  = relationSchema;
            // create the worksheet
            XDocument xmlStartPart = new XDocument(
                new XElement(aw + "workbook", new XAttribute(XNamespace.Xmlns + "r", relationSchema),
                             new XElement(aw + "sheets",
                                          CreateElements(new[] { this.Template.SheetName }, aw, r)
                                          ))
                );

            XDocument xmlStylePart = XDocument.Load(HttpContext.Current.Server.MapPath(this.Template.StylePath));
            string    fileName     = System.IO.Path.GetTempPath() + Guid.NewGuid().ToString() + ".xlsx";

            // create the package (i.e., the document container)
            using (Package pkgOutputDoc = Package.Open(fileName, FileMode.Create, FileAccess.ReadWrite))
            {
                // save a temporary part to create the default application/xml content types
                Uri         uriDefaultContentType = new Uri("/default.xml", UriKind.Relative);
                PackagePart partTemp = pkgOutputDoc.CreatePart(uriDefaultContentType, "application/xml");

                // save the main document part (workbook.xml)
                Uri         uriStartPart    = new Uri("/xl/workbook.xml", UriKind.Relative);
                PackagePart partWorkbookXML = pkgOutputDoc.CreatePart(uriStartPart, workbookContentType);
                using (StreamWriter streamStartPart = new StreamWriter(partWorkbookXML.GetStream(FileMode.Create, FileAccess.Write)))
                {
                    xmlStartPart.Save(streamStartPart);
                    streamStartPart.Close();
                    pkgOutputDoc.Flush();
                }

                // create the relationship parts
                pkgOutputDoc.CreateRelationship(uriStartPart, TargetMode.Internal, relationSchema + "/officeDocument", "rId1");

                Uri         uriStylePart = new Uri("/xl/styles.xml", UriKind.Relative);
                PackagePart partStyleXML = pkgOutputDoc.CreatePart(uriStylePart, styleContentType);
                using (StreamWriter streamStylePart = new StreamWriter(partStyleXML.GetStream(FileMode.Create, FileAccess.Write)))
                {
                    xmlStylePart.Save(streamStylePart);
                    streamStylePart.Close();
                    pkgOutputDoc.Flush();
                }

                partWorkbookXML.CreateRelationship(uriStylePart, TargetMode.Internal, relationSchema + "/styles", "rId2");

                Uri         uriWorksheet     = new Uri("/xl/worksheets/sheet1.xml", UriKind.Relative);
                PackagePart partWorksheetXML = pkgOutputDoc.CreatePart(uriWorksheet, worksheetContentType);

                XDocument xmlWorksheet;
                Stream    stream = CreateSheetData();

                stream.Position = 0;
                xmlWorksheet    = XDocument.Load(stream);
                using (StreamWriter streamWorksheet = new StreamWriter(partWorksheetXML.GetStream(FileMode.Create, FileAccess.Write)))
                {
                    xmlWorksheet.Save(streamWorksheet);
                    streamWorksheet.Close();
                    pkgOutputDoc.Flush();
                }

                partWorkbookXML.CreateRelationship(uriWorksheet, TargetMode.Internal, relationSchema + "/worksheet", "rId1");

                // remove the temporary part that created the default xml content type
                pkgOutputDoc.DeletePart(uriDefaultContentType);

                // close the document
                pkgOutputDoc.Flush();
                pkgOutputDoc.Close();

                return(fileName);
            }
        }
        public void ConvertToOpenXml(FlowDocument flowDoc, Stream openXmlStream)
        {
            TextPointer contentstart = flowDoc.ContentStart;
            TextPointer contentend   = flowDoc.ContentEnd;

            if (contentstart == null)
            {
                throw new ArgumentNullException("ContentStart");
            }
            if (contentend == null)
            {
                throw new ArgumentNullException("ContentEnd");
            }

            //Create document

            // document package container
            Package zippackage = null;

            zippackage = Package.Open(openXmlStream, FileMode.Create, FileAccess.ReadWrite);

            // main document.xml
            Uri         uri             = new Uri("/word/document.xml", UriKind.Relative);
            PackagePart partDocumentXML = zippackage.CreatePart(uri, "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml");


            //ver 1.2 Numbering
            Uri         uriNumbering             = new Uri("/word/numbering.xml", UriKind.Relative);
            Uri         uriNumberingRelationship = new Uri("numbering.xml", UriKind.Relative);
            PackagePart partNumberingXML         = zippackage.CreatePart(uriNumbering, "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml");

            partDocumentXML.CreateRelationship(uriNumberingRelationship, TargetMode.Internal, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering", "rId1");



            using (XmlTextWriter openxmlwriter = new XmlTextWriter(partDocumentXML.GetStream(FileMode.Create, FileAccess.Write), System.Text.Encoding.UTF8))
            {
                openxmlwriter.Formatting  = Formatting.Indented;
                openxmlwriter.Indentation = 2;
                openxmlwriter.IndentChar  = ' ';

                //ver 1.2
                using (XmlTextWriter numberingwriter = new XmlTextWriter(partNumberingXML.GetStream(FileMode.Create, FileAccess.Write), System.Text.Encoding.UTF8))
                {
                    numberingwriter.Formatting  = Formatting.Indented;
                    numberingwriter.Indentation = 2;
                    numberingwriter.IndentChar  = ' ';

                    //Actual Writing
                    new OpenXmlWriter().Write(contentstart, contentend, openxmlwriter, numberingwriter);
                }
            }



            zippackage.Flush();

            // relationship
            zippackage.CreateRelationship(uri, TargetMode.Internal, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument", "rId1");
            zippackage.Flush();
            zippackage.Close();
        }
Ejemplo n.º 30
0
        public ActionResult GenerateAAS()
        {
            try
            {
                string packagePath = Path.Combine(Directory.GetCurrentDirectory(), "DTDL.aasx");
                using (Package package = Package.Open(packagePath, FileMode.Create))
                {
                    // add package origin part
                    PackagePart origin = package.CreatePart(new Uri("/aasx/aasx-origin", UriKind.Relative), MediaTypeNames.Text.Plain, CompressionOption.Maximum);
                    using (Stream fileStream = origin.GetStream(FileMode.Create))
                    {
                        var bytes = Encoding.ASCII.GetBytes("Intentionally empty.");
                        fileStream.Write(bytes, 0, bytes.Length);
                    }
                    package.CreateRelationship(origin.Uri, TargetMode.Internal, "http://www.admin-shell.io/aasx/relationships/aasx-origin");

                    // create package spec part
                    string packageSpecPath = Path.Combine(Directory.GetCurrentDirectory(), "aasenv-with-no-id.aas.xml");
                    using (StringReader reader = new StringReader(System.IO.File.ReadAllText(packageSpecPath)))
                    {
                        XmlSerializer aasSerializer = new XmlSerializer(typeof(AasEnv));
                        AasEnv        aasEnv        = (AasEnv)aasSerializer.Deserialize(reader);

                        aasEnv.AssetAdministrationShells.AssetAdministrationShell.SubmodelRefs.Clear();
                        aasEnv.Submodels.Clear();

                        foreach (string filenamePath in Directory.EnumerateFiles(Path.Combine(Directory.GetCurrentDirectory(), "JSON"), "*.dtdl.json"))
                        {
                            string submodelPath = Path.Combine(Directory.GetCurrentDirectory(), "submodel.adt.xml");
                            using (StringReader reader2 = new StringReader(System.IO.File.ReadAllText(submodelPath)))
                            {
                                XmlSerializer aasSubModelSerializer = new XmlSerializer(typeof(AASSubModel));
                                AASSubModel   aasSubModel           = (AASSubModel)aasSubModelSerializer.Deserialize(reader2);

                                SubmodelRef nodesetReference = new SubmodelRef();
                                nodesetReference.Keys     = new Keys();
                                nodesetReference.Keys.Key = new Key
                                {
                                    IdType = "URI",
                                    Local  = true,
                                    Type   = "Submodel",
                                    Text   = "http://www.microsoft.com/type/dtdl/" + Path.GetFileNameWithoutExtension(filenamePath).Replace(".", "").ToLower()
                                };

                                aasEnv.AssetAdministrationShells.AssetAdministrationShell.SubmodelRefs.Add(nodesetReference);

                                aasSubModel.Identification.Text += Path.GetFileNameWithoutExtension(filenamePath).Replace(".", "").ToLower();
                                aasSubModel.SubmodelElements.SubmodelElement.SubmodelElementCollection.Value.SubmodelElement.File.Value =
                                    aasSubModel.SubmodelElements.SubmodelElement.SubmodelElementCollection.Value.SubmodelElement.File.Value.Replace("TOBEREPLACED", Path.GetFileNameWithoutExtension(filenamePath));
                                aasEnv.Submodels.Add(aasSubModel);
                            }
                        }

                        XmlTextWriter aasWriter = new XmlTextWriter(packageSpecPath, Encoding.UTF8);
                        aasSerializer.Serialize(aasWriter, aasEnv);
                        aasWriter.Close();
                    }

                    // add package spec part
                    PackagePart spec = package.CreatePart(new Uri("/aasx/aasenv-with-no-id/aasenv-with-no-id.aas.xml", UriKind.Relative), MediaTypeNames.Text.Xml);
                    using (FileStream fileStream = new FileStream(packageSpecPath, FileMode.Open, FileAccess.Read))
                    {
                        CopyStream(fileStream, spec.GetStream());
                    }
                    origin.CreateRelationship(spec.Uri, TargetMode.Internal, "http://www.admin-shell.io/aasx/relationships/aas-spec");

                    // add DTDL files
                    foreach (string filenamePath in Directory.EnumerateFiles(Path.Combine(Directory.GetCurrentDirectory(), "JSON"), "*.dtdl.json"))
                    {
                        PackagePart supplementalDoc = package.CreatePart(new Uri("/aasx/" + Path.GetFileNameWithoutExtension(filenamePath), UriKind.Relative), MediaTypeNames.Application.Json);
                        using (FileStream fileStream = new FileStream(filenamePath, FileMode.Open, FileAccess.Read))
                        {
                            CopyStream(fileStream, supplementalDoc.GetStream());
                        }
                        package.CreateRelationship(supplementalDoc.Uri, TargetMode.Internal, "http://www.admin-shell.io/aasx/relationships/aas-suppl");
                    }
                }

                return(File(new FileStream(Path.Combine(Directory.GetCurrentDirectory(), "DTDL.aasx"), FileMode.Open, FileAccess.Read), "APPLICATION/octet-stream", "DTDL.aasx"));
            }
            catch (Exception ex)
            {
                ADTModel model = new ADTModel
                {
                    StatusMessage = HttpUtility.HtmlDecode(ex.Message)
                };

                return(View("Index", model));
            }
        }
Ejemplo n.º 31
0
 public void WriteEmptyPrintTicket(XpsPartBase relatedPart, PackagePart metroPart)
 {
     if (relatedPart == null)
     {
         throw new ArgumentNullException("relatedPart");
     }
     if (metroPart == null)
     {
         throw new ArgumentNullException("metroPart");
     }
     if (this.Streaming)
     {
         Uri partUri = this.GeneratePrintTicketUri(relatedPart);
         PackagePart part = this.GeneratePart(XpsS0Markup.PrintTicketContentType, partUri);
         string uriString = MakeRelativePath(metroPart.Uri, part.Uri);
         metroPart.CreateRelationship(new Uri(uriString, UriKind.Relative), TargetMode.Internal, XpsS0Markup.PrintTicketRelationshipName);
         Stream outStream = part.GetStream(FileMode.Create);
         new PrintTicket().SaveTo(outStream);
         outStream.Close();
     }
 }
        public bool SaveAs(string fn, bool writeFreshly = false, PreferredFormat prefFmt = PreferredFormat.None, MemoryStream useMemoryStream = null)
        {
            Console.WriteLine("SaveAs: " + fn);
            if (fn.ToLower().EndsWith(".xml"))
            {
                // save only XML
                this.fn = fn;
                try
                {
                    using (var s = new StreamWriter(this.fn))
                    {
                        // TODO: use aasenv serialzers here!
                        var serializer = new XmlSerializer(typeof(AdminShell.AdministrationShellEnv));
                        var nss        = new XmlSerializerNamespaces();
                        nss.Add("xsi", System.Xml.Schema.XmlSchema.InstanceNamespace);
                        nss.Add("aas", "http://www.admin-shell.io/aas/2/0");
                        nss.Add("IEC61360", "http://www.admin-shell.io/IEC61360/2/0");
                        serializer.Serialize(s, this.aasenv, nss);
                    }
                }
                catch (Exception ex)
                {
                    throw (new Exception(string.Format("While writing AAS {0} at {1} gave: {2}", fn, AdminShellUtil.ShortLocation(ex), ex.Message)));
                }
                return(true);
            }

            if (fn.ToLower().EndsWith(".json"))
            {
                // save only JSON
                // this funcitonality is a initial test
                this.fn = fn;
                try
                {
                    using (var sw = new StreamWriter(fn))
                    {
                        // TODO: use aasenv serialzers here!

                        sw.AutoFlush = true;

                        JsonSerializer serializer = new JsonSerializer()
                        {
                            NullValueHandling     = NullValueHandling.Ignore,
                            ReferenceLoopHandling = ReferenceLoopHandling.Serialize,
                            Formatting            = Newtonsoft.Json.Formatting.Indented
                        };
                        using (JsonWriter writer = new JsonTextWriter(sw))
                        {
                            serializer.Serialize(writer, this.aasenv);
                        }
                    }
                }
                catch (Exception ex)
                {
                    throw (new Exception(string.Format("While writing AAS {0} at {1} gave: {2}", fn, AdminShellUtil.ShortLocation(ex), ex.Message)));
                }
                return(true);
            }

            if (fn.ToLower().EndsWith(".aasx"))
            {
                // save package AASX
                try
                {
                    // we want existing contents to be preserved, but no possiblity to change file name
                    // therefore: copy file to new name, re-open!
                    // fn could be changed, therefore close "old" package first
                    if (this.openPackage != null)
                    {
                        // ReSharper disable EmptyGeneralCatchClause
                        try
                        {
                            this.openPackage.Close();
                            if (!writeFreshly)
                            {
                                if (this.tempFn != null)
                                {
                                    System.IO.File.Copy(this.tempFn, fn);
                                }
                                else
                                {
                                    System.IO.File.Copy(this.fn, fn);
                                }
                            }
                        }
                        catch { }
                        // ReSharper enable EmptyGeneralCatchClause
                        this.openPackage = null;
                    }

                    // approach is to utilize the existing package, if possible. If not, create from scratch
                    Package package = null;
                    if (useMemoryStream != null)
                    {
                        package = Package.Open(useMemoryStream, (writeFreshly) ? FileMode.Create : FileMode.OpenOrCreate);
                    }
                    else
                    {
                        package = Package.Open((this.tempFn != null) ? this.tempFn : fn, (writeFreshly) ? FileMode.Create : FileMode.OpenOrCreate);
                    }
                    this.fn = fn;

                    // get the origin from the package
                    PackagePart originPart = null;
                    var         xs         = package.GetRelationshipsByType("http://www.admin-shell.io/aasx/relationships/aasx-origin");
                    foreach (var x in xs)
                    {
                        if (x.SourceUri.ToString() == "/")
                        {
                            originPart = package.GetPart(x.TargetUri);
                            break;
                        }
                    }
                    if (originPart == null)
                    {
                        // create, as not existing
                        originPart = package.CreatePart(new Uri("/aasx/aasx-origin", UriKind.RelativeOrAbsolute), System.Net.Mime.MediaTypeNames.Text.Plain, CompressionOption.Maximum);
                        using (var s = originPart.GetStream(FileMode.Create))
                        {
                            var bytes = System.Text.Encoding.ASCII.GetBytes("Intentionally empty.");
                            s.Write(bytes, 0, bytes.Length);
                        }
                        package.CreateRelationship(originPart.Uri, TargetMode.Internal, "http://www.admin-shell.io/aasx/relationships/aasx-origin");
                    }

                    // get the specs from the package
                    PackagePart         specPart = null;
                    PackageRelationship specRel  = null;
                    xs = originPart.GetRelationshipsByType("http://www.admin-shell.io/aasx/relationships/aas-spec");
                    foreach (var x in xs)
                    {
                        specRel  = x;
                        specPart = package.GetPart(x.TargetUri);
                        break;
                    }

                    // check, if we have to change the spec part
                    if (specPart != null && specRel != null)
                    {
                        var name = System.IO.Path.GetFileNameWithoutExtension(specPart.Uri.ToString()).ToLower().Trim();
                        var ext  = System.IO.Path.GetExtension(specPart.Uri.ToString()).ToLower().Trim();
                        if ((ext == ".json" && prefFmt == PreferredFormat.Xml) ||
                            (ext == ".xml" && prefFmt == PreferredFormat.Json) ||
                            (name.StartsWith("aasenv-with-no-id")))
                        {
                            // try kill specpart
                            // ReSharper disable EmptyGeneralCatchClause
                            try
                            {
                                originPart.DeleteRelationship(specRel.Id);
                                package.DeletePart(specPart.Uri);
                            }
                            catch { }
                            finally { specPart = null; specRel = null; }
                            // ReSharper enable EmptyGeneralCatchClause
                        }
                    }

                    if (specPart == null)
                    {
                        // create, as not existing
                        var frn = "aasenv-with-no-id";
                        if (this.aasenv.AdministrationShells.Count > 0)
                        {
                            frn = this.aasenv.AdministrationShells[0].GetFriendlyName() ?? frn;
                        }
                        var aas_spec_fn = "/aasx/#/#.aas";
                        if (prefFmt == PreferredFormat.Json)
                        {
                            aas_spec_fn += ".json";
                        }
                        else
                        {
                            aas_spec_fn += ".xml";
                        }
                        aas_spec_fn = aas_spec_fn.Replace("#", "" + frn);
                        specPart    = package.CreatePart(new Uri(aas_spec_fn, UriKind.RelativeOrAbsolute), System.Net.Mime.MediaTypeNames.Text.Xml, CompressionOption.Maximum);
                        originPart.CreateRelationship(specPart.Uri, TargetMode.Internal, "http://www.admin-shell.io/aasx/relationships/aas-spec");
                    }

                    // now, specPart shall be != null!
                    if (specPart.Uri.ToString().ToLower().Trim().EndsWith("json"))
                    {
                        using (var s = specPart.GetStream(FileMode.Create))
                        {
                            JsonSerializer serializer = new JsonSerializer();
                            serializer.NullValueHandling     = NullValueHandling.Ignore;
                            serializer.ReferenceLoopHandling = ReferenceLoopHandling.Serialize;
                            serializer.Formatting            = Newtonsoft.Json.Formatting.Indented;
                            using (var sw = new StreamWriter(s))
                            {
                                using (JsonWriter writer = new JsonTextWriter(sw))
                                {
                                    serializer.Serialize(writer, this.aasenv);
                                }
                            }
                        }
                    }
                    else
                    {
                        using (var s = specPart.GetStream(FileMode.Create))
                        {
                            var serializer = new XmlSerializer(typeof(AdminShell.AdministrationShellEnv));
                            var nss        = new XmlSerializerNamespaces();
                            nss.Add("xsi", System.Xml.Schema.XmlSchema.InstanceNamespace);
                            nss.Add("aas", "http://www.admin-shell.io/aas/2/0");
                            nss.Add("IEC61360", "http://www.admin-shell.io/IEC61360/2/0");
                            serializer.Serialize(s, this.aasenv, nss);
                        }
                    }

                    // there might be pending files to be deleted (first delete, then add, in case of identical files in both categories)
                    foreach (var psfDel in pendingFilesToDelete)
                    {
                        // try find an existing part for that file ..
                        var found = false;

                        // normal files
                        xs = specPart.GetRelationshipsByType("http://www.admin-shell.io/aasx/relationships/aas-suppl");
                        foreach (var x in xs)
                        {
                            if (x.TargetUri == psfDel.uri)
                            {
                                // try to delete
                                specPart.DeleteRelationship(x.Id);
                                package.DeletePart(psfDel.uri);
                                found = true;
                                break;
                            }
                        }

                        // thumbnails
                        xs = package.GetRelationshipsByType("http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail");
                        foreach (var x in xs)
                        {
                            if (x.TargetUri == psfDel.uri)
                            {
                                // try to delete
                                package.DeleteRelationship(x.Id);
                                package.DeletePart(psfDel.uri);
                                found = true;
                                break;
                            }
                        }

                        if (!found)
                        {
                            throw (new Exception($"Not able to delete pending file {psfDel.uri} in saving package {fn}"));
                        }
                    }

                    // after this, there are no more pending for delete files
                    pendingFilesToDelete.Clear();

                    // write pending supplementary files
                    foreach (var psfAdd in pendingFilesToAdd)
                    {
                        // make sure ..
                        if ((psfAdd.sourceLocalPath == null && psfAdd.sourceGetBytesDel == null) || psfAdd.location != AdminShellPackageSupplementaryFile.LocationType.AddPending)
                        {
                            continue;
                        }

                        // normal file?
                        if (psfAdd.specialHandling == AdminShellPackageSupplementaryFile.SpecialHandlingType.None ||
                            psfAdd.specialHandling == AdminShellPackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail)
                        {
                            // try find an existing part for that file ..
                            PackagePart filePart = null;
                            if (psfAdd.specialHandling == AdminShellPackageSupplementaryFile.SpecialHandlingType.None)
                            {
                                xs = specPart.GetRelationshipsByType("http://www.admin-shell.io/aasx/relationships/aas-suppl");
                                foreach (var x in xs)
                                {
                                    if (x.TargetUri == psfAdd.uri)
                                    {
                                        filePart = package.GetPart(x.TargetUri);
                                        break;
                                    }
                                }
                            }
                            if (psfAdd.specialHandling == AdminShellPackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail)
                            {
                                xs = package.GetRelationshipsByType("http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail");
                                foreach (var x in xs)
                                {
                                    if (x.SourceUri.ToString() == "/" && x.TargetUri == psfAdd.uri)
                                    {
                                        filePart = package.GetPart(x.TargetUri);
                                        break;
                                    }
                                }
                            }

                            if (filePart == null)
                            {
                                // determine mimeType
                                var mimeType = psfAdd.useMimeType;
                                // reconcile mime
                                if (mimeType == null && psfAdd.sourceLocalPath != null)
                                {
                                    mimeType = AdminShellPackageEnv.GuessMimeType(psfAdd.sourceLocalPath);
                                }
                                // still null?
                                if (mimeType == null)
                                {
                                    // see: https://stackoverflow.com/questions/6783921/which-mime-type-to-use-for-a-binary-file-thats-specific-to-my-program
                                    mimeType = "application/octet-stream";
                                }

                                // create new part and link
                                filePart = package.CreatePart(psfAdd.uri, mimeType, CompressionOption.Maximum);
                                if (psfAdd.specialHandling == AdminShellPackageSupplementaryFile.SpecialHandlingType.None)
                                {
                                    specPart.CreateRelationship(filePart.Uri, TargetMode.Internal, "http://www.admin-shell.io/aasx/relationships/aas-suppl");
                                }
                                if (psfAdd.specialHandling == AdminShellPackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail)
                                {
                                    package.CreateRelationship(filePart.Uri, TargetMode.Internal, "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail");
                                }
                            }

                            // now should be able to write
                            using (var s = filePart.GetStream(FileMode.Create))
                            {
                                if (psfAdd.sourceLocalPath != null)
                                {
                                    var bytes = System.IO.File.ReadAllBytes(psfAdd.sourceLocalPath);
                                    s.Write(bytes, 0, bytes.Length);
                                }

                                if (psfAdd.sourceGetBytesDel != null)
                                {
                                    var bytes = psfAdd.sourceGetBytesDel();
                                    if (bytes != null)
                                    {
                                        s.Write(bytes, 0, bytes.Length);
                                    }
                                }
                            }
                        }
                    }

                    // after this, there are no more pending for add files
                    pendingFilesToAdd.Clear();

                    // flush and close
                    package.Flush();
                    this.openPackage = null;
                    package.Close();

                    // if in temp fn, close the package, copy to original fn, re-open the package
                    if (this.tempFn != null)
                    {
                        try
                        {
                            package.Close();
                            System.IO.File.Copy(this.tempFn, this.fn, overwrite: true);
                            this.openPackage = Package.Open(this.tempFn, FileMode.OpenOrCreate);
                        }
                        catch (Exception ex)
                        {
                            throw (new Exception(string.Format("While write AASX {0} indirectly at {1} gave: {2}", fn, AdminShellUtil.ShortLocation(ex), ex.Message)));
                        }
                    }
                }
                catch (Exception ex)
                {
                    throw (new Exception(string.Format("While write AASX {0} at {1} gave: {2}", fn, AdminShellUtil.ShortLocation(ex), ex.Message)));
                }
                return(true);
            }

            // Don't know to handle
            throw (new Exception(string.Format($"Not able to handle {fn}.")));
        }
Ejemplo n.º 33
0
        internal static PackagePart CreateOrGetSettingsPart(Package package)
        {
            PackagePart settingsPart;

            Uri settingsUri = new Uri("/word/settings.xml", UriKind.Relative);

            if (!package.PartExists(settingsUri))
            {
                settingsPart = package.CreatePart(settingsUri, "application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml", CompressionOption.Maximum);

                PackagePart mainDocumentPart = GetMainDocumentPart(package);

                mainDocumentPart.CreateRelationship(settingsUri, TargetMode.Internal, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings");

                XDocument settings = XDocument.Parse
                                         (@"<?xml version='1.0' encoding='utf-8' standalone='yes'?>
                <w:settings xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:r='http://schemas.openxmlformats.org/officeDocument/2006/relationships' xmlns:m='http://schemas.openxmlformats.org/officeDocument/2006/math' xmlns:v='urn:schemas-microsoft-com:vml' xmlns:w10='urn:schemas-microsoft-com:office:word' xmlns:w='http://schemas.openxmlformats.org/wordprocessingml/2006/main' xmlns:sl='http://schemas.openxmlformats.org/schemaLibrary/2006/main'>
                  <w:zoom w:percent='100' />
                  <w:defaultTabStop w:val='720' />
                  <w:characterSpacingControl w:val='doNotCompress' />
                  <w:compat />
                  <w:rsids>
                    <w:rsidRoot w:val='00217F62' />
                    <w:rsid w:val='001915A3' />
                    <w:rsid w:val='00217F62' />
                    <w:rsid w:val='00A906D8' />
                    <w:rsid w:val='00AB5A74' />
                    <w:rsid w:val='00F071AE' />
                  </w:rsids>
                  <m:mathPr>
                    <m:mathFont m:val='Cambria Math' />
                    <m:brkBin m:val='before' />
                    <m:brkBinSub m:val='--' />
                    <m:smallFrac m:val='off' />
                    <m:dispDef />
                    <m:lMargin m:val='0' />
                    <m:rMargin m:val='0' />
                    <m:defJc m:val='centerGroup' />
                    <m:wrapIndent m:val='1440' />
                    <m:intLim m:val='subSup' />
                    <m:naryLim m:val='undOvr' />
                  </m:mathPr>
                  <w:themeFontLang w:val='en-IE' w:bidi='ar-SA' />
                  <w:clrSchemeMapping w:bg1='light1' w:t1='dark1' w:bg2='light2' w:t2='dark2' w:accent1='accent1' w:accent2='accent2' w:accent3='accent3' w:accent4='accent4' w:accent5='accent5' w:accent6='accent6' w:hyperlink='hyperlink' w:followedHyperlink='followedHyperlink' />
                  <w:shapeDefaults>
                    <o:shapedefaults v:ext='edit' spidmax='2050' />
                    <o:shapelayout v:ext='edit'>
                      <o:idmap v:ext='edit' data='1' />
                    </o:shapelayout>
                  </w:shapeDefaults>
                  <w:decimalSymbol w:val='.' />
                  <w:listSeparator w:val=',' />
                </w:settings>"
                                         );

                XElement themeFontLang = settings.Root.Element(XName.Get("themeFontLang", DocX.w.NamespaceName));
                themeFontLang.SetAttributeValue(XName.Get("val", DocX.w.NamespaceName), CultureInfo.CurrentCulture);

                // Save the settings document.
                using (TextWriter tw = new StreamWriter(new PackagePartStream(settingsPart.GetStream())))
                    settings.Save(tw);
            }
            else
            {
                settingsPart = package.GetPart(settingsUri);
            }
            return(settingsPart);
        }