1
votes

I have a VSTO document level customization that performs specific functionality when opened from within our application. Basically, we open normal documents from inside of our application and I copy the content from the normal docx file into the VSTO document file which is stored inside of our database.

 var app = new Microsoft.Office.Interop.Word.Application();
                    var docs = app.Documents;

                    var vstoDoc = docs.Open(vstoDocPath);
                    var doc = docs.Open(currentDocPath);

doc.Range().Copy();
vstoDoc.Range().PasteAndFormat(WdRecoveryType.wdFormatOriginalFormatting);

Everything works great, however using the above code leaves out certain formatting related to the document. The code below fixes these issues, but there will most likely be more issues that I come across, as I come across them I could address them one by one ...

 for (int i = 0; i < doc.Sections.Count; i++)
                    {
                        var footerFont = doc.Sections[i + 1].Footers.GetEnumerator();
                        var headerFont = doc.Sections[i + 1].Headers.GetEnumerator();
                        var footNoteFont = doc.Footnotes.GetEnumerator();

                        foreach (HeaderFooter foot in vstoDoc.Sections[i + 1].Footers)
                        {
                            footerFont.MoveNext();
                            foot.Range.Font.Name = ((HeaderFooter)footerFont.Current).Range.Font.Name;
                        }

                        foreach (HeaderFooter head in vstoDoc.Sections[i + 1].Headers)
                        {
                            headerFont.MoveNext();
                            head.Range.Font.Name = ((HeaderFooter)headerFont.Current).Range.Font.Name;
                        }

                        foreach (Footnote footNote in vstoDoc.Footnotes)
                        {
                            footNoteFont.MoveNext();
                            footNote.Range.Font.Name = ((Footnote)footNoteFont.Current).Range.Font.Name;
                        }
                    }

I need a fool proof safe way of copying the content of one docx file to another docx file while preserving formatting and eliminating the risk of corrupting the document. I've tried to use reflection to set the properties of the two documents to one another, the code does start to look a bit ugly and I always worry that certain properties that I'm setting may have undesirable side effects. I've also tried zipping and unzipping the docx files, editing the xml manually and then rezipping afterwards, this hasn't worked too well, I've ended up corrupting a few of the documents during this process.

If anyone has dealt with a similar issue in the past, please could you point me in the right direction.

Thank you for your time

2

2 Answers

0
votes

This code copies and keeps source formatting.

 bookmark.Range.Copy();
 Document newDocument = WordInstance.Documents.Add();
 newDocument.Activate();
 newDocument.Application.CommandBars.ExecuteMso("PasteSourceFormatting");
0
votes

There is one more elegant way to manage it based upon

Globals.ThisAddIn.Application.ActiveDocument.Range().ImportFragment(filePath);

or you can do the following

Globals.ThisAddIn.Application.Selection.Range.ImportFragment(filePath);

in order to obtain current range where filePath is a path to the document you are copping from.