Beispiel #1
0
        internal OpenXmlCompositeElement Append(OpenXmlCompositeElement insertionPoint)
        {
            var elementsToMove = new List <OpenXmlElement>();

            foreach (var element in _workingBody.ChildElements)
            {
                elementsToMove.Add(element);
            }

            foreach (var element in elementsToMove)
            {
                element.Remove();

                if (element is OpenXmlCompositeElement ce && ce.HasText())
                {
                    // Ignore empty paragraphs.
                    insertionPoint = insertionPoint.InsertAfterSelf(ce);
                }
            }

            CreateNewWorkingBody();
            return(insertionPoint);
        }
Beispiel #2
0
        internal void Append <T>() where T : OpenXmlCompositeElement
        {
            // Clone _newElement, because we're going to use the placeholders currently in it again.
            var clonedNewElement = _newElement.Clone() as T;

            if (_lastElement == null)
            {
                // First call to Append: _newElement points to the original template.
                _lastElement = _newElement.InsertAfterSelf(clonedNewElement);

                // Remove the original template from the document.
                _newElement.Remove();
            }
            else
            {
                // Subsequent calls to Append.
                _lastElement = _lastElement.InsertAfterSelf(clonedNewElement);
            }

            // Create a pristine new element and initialize it with the placeholders.
            _newElement = _templateElement.Clone() as T;
            SetPlaceholders(_newElement);
        }
        /// <summary>
        /// Allow to merge documents to insert it in a bookmark
        /// </summary>
        /// <param name="bookmark">Bookmark name</param>
        /// <param name="filesToInsert">Documents to insert</param>
        /// <param name="insertPageBreaks">Indicate if a page break must be added after each document</param>
        public void InsertDocsToBookmark(string bookmark, IList <MemoryStream> filesToInsert, bool insertPageBreaks)
        {
            if (string.IsNullOrWhiteSpace(bookmark))
            {
                throw new Exception("Bookmark must not be null or white space");
            }

            if (filesToInsert == null)
            {
                throw new Exception("FilesToInsert must not be null");
            }

            var bookmarkElement = FindBookmark(bookmark);

            if (bookmarkElement != default(BookmarkEnd))
            {
                OpenXmlCompositeElement openXmlCompositeElement = null;
                foreach (var file in filesToInsert)
                {
                    using (WordprocessingDocument pkgSourceDoc = WordprocessingDocument.Open(file, true))
                    {
                        var headers = pkgSourceDoc.MainDocumentPart.Document.Descendants <HeaderReference>().ToList();
                        foreach (var header in headers)
                        {
                            header.Remove();
                        }

                        var footers = pkgSourceDoc.MainDocumentPart.Document.Descendants <FooterReference>().ToList();
                        foreach (var footer in footers)
                        {
                            footer.Remove();
                        }

                        pkgSourceDoc.MainDocumentPart.Document.Save();
                    }

                    string altChunkId = "AltChunkId-" + Guid.NewGuid();

                    AlternativeFormatImportPart chunk = wdMainDocumentPart.AddAlternativeFormatImportPart(AlternativeFormatImportPartType.WordprocessingML, altChunkId);
                    file.Position = 0;
                    chunk.FeedData(file);

                    AltChunk altChunk = new AltChunk()
                    {
                        Id = altChunkId
                    };

                    if (openXmlCompositeElement == null)
                    {
                        openXmlCompositeElement = wdDoc.MainDocumentPart.Document.Body.Descendants <BookmarkStart>().SingleOrDefault <BookmarkStart>((BookmarkStart b) => b.Name == bookmark)
                                                  .Ancestors <Paragraph>().FirstOrDefault <Paragraph>();
                    }

                    if (insertPageBreaks)
                    {
                        var       lastRenderedPageBreak = new LastRenderedPageBreak();
                        var       run       = new Run(lastRenderedPageBreak);
                        Paragraph paragraph = new Paragraph(run);
                        openXmlCompositeElement.InsertAfterSelf <Paragraph>(paragraph);
                        openXmlCompositeElement = paragraph;
                    }
                    openXmlCompositeElement.InsertAfterSelf <AltChunk>(altChunk);
                    openXmlCompositeElement = altChunk;

                    if (wdDoc == null)
                    {
                        throw new Exception("Document not loaded");
                    }
                }
            }
        }