コード例 #1
0
        /// <summary>
        /// Gets the document theme
        /// </summary>
        public static OpenXmlPowerToolsDocument GetTheme(WmlDocument doc)
        {
            using (OpenXmlMemoryStreamDocument sourceStreamDoc = new OpenXmlMemoryStreamDocument(doc))
                using (WordprocessingDocument document = sourceStreamDoc.GetWordprocessingDocument())
                {
                    // Loads the theme part main file
                    ThemePart theme = document.MainDocumentPart.ThemePart;
                    if (theme != null)
                    {
                        XDocument themeDocument = theme.GetXDocument();

                        // Creates the theme package (thmx file)
                        using (OpenXmlMemoryStreamDocument streamDoc = OpenXmlMemoryStreamDocument.CreatePackage())
                        {
                            using (Package themePackage = streamDoc.GetPackage())
                            {
                                // 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);
                            }
                            return(streamDoc.GetModifiedDocument());
                        }
                    }
                    return(null);
                }
        }