1
votes

I'm trying to remove a footer from a Word document using C# 4. The footer looks like this:

Page 1 April 18, 2012

Actually, this the text for the footer when displayed in Word VBA:

Page 1 ( April 18, 2012

There's actually a bullet character between "Page 1" and "April". In the end the footer should look like this:

April 18, 2012

Anyway, in Word VBA, I'm able to do it using this code:

Dim rngFtr As Range
Set rngFtr = ActiveDocument.Sections(1).Footers(wdHeaderFooterPrimary).Range
rngFtr.Collapse wdCollapseStart
rngFtr.MoveStart wdParagraph, 1
rngFtr.MoveEnd wdWord, 4
rngFtr.Delete

I tried the same thing in C# but it removes the footer entirely. Here's my code in C# 4: using Microsoft.Office.Interop.Word;

Microsoft.Office.Interop.Word.Application ap = new Microsoft.Office.Interop.Word.Application();
Document doc = ap.Documents.Open(docFile.FullName, ReadOnly: false, Visible: false);
doc.Activate();
Microsoft.Office.Interop.Word.Range ftrRng =
    doc.Sections[1].Footers[WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;
ftrRng.Collapse(WdCollapseDirection.wdCollapseEnd);
ftrRng.MoveStart(WdUnits.wdParagraph, 1);
ftrRng.MoveEnd(WdUnits.wdWord, 4);
ftrRng.Delete();

ap.Documents.Close(SaveChanges: false, OriginalFormat: false, RouteDocument: false);

((_Application) ap).Quit(SaveChanges: false, OriginalFormat: false, RouteDocument: false);
    System.Runtime.InteropServices.Marshal.ReleaseComObject(ap);

I even tried other ways to get rid of "Page 1" & the bullet, such as:

var replaceText = string.Empty;
object mis = System.Type.Missing;
var targetFooterText =
    doc.Sections[1].Footers[WdHeaderFooterIndex.wdHeaderFooterPrimary].Range.Text.ToString().Substring(1, 10);
doc.Sections[1].Footers[WdHeaderFooterIndex.wdHeaderFooterPrimary].Range.Find.Execute(
    targetFooterText,
    ref mis, ref mis, ref mis, ref mis, ref mis, ref mis, ref mis, ref mis,
    replaceText,
    ref mis, ref mis, ref mis, ref mis, ref mis);

This doesn't do anything.

Please let me know what I'm doing wrong. Thank you in advance.

I'm not sure if this is important, but the bullet is a Unicode-2022.

Here's a screen cap of the document footer. I just need to remove the text "Page 1" & bullet and replace it with the date. The rest should remain as is.

enter image description here

2

2 Answers

0
votes

Try the example below, it does the following:

  • Extract all the text from the footer range
  • Remove the "Page" string from the text
  • Set the footer range text to the previous value minus the "Page"

        using Word = Microsoft.Office.Interop.Word;
    
        Word.Document document = Globals.ThisAddIn.Application.ActiveDocument;
    
        Word.Range footerRange =
            document.Sections[1].Footers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;
    
        string rangeText = footerRange.Text;
    
        if (!String.IsNullOrEmpty(rangeText) && rangeText.Contains("Page"))
        {
            //Now set the footer Range Text to the new value minus the "Page"
            //Note: Edit as required because the page number may not always be one character
            string newValue = rangeText.Remove(rangeText.IndexOf("Page"), 6);
            footerRange.Text = newValue;
        }
    
0
votes

After some digging and playing around with Word VBA, I was able to find an alternate solution. Here's my final code:

Microsoft.Office.Interop.Word.Application ap = new Microsoft.Office.Interop.Word.Application();

Document doc = ap.Documents.Open(docFile.FullName, ReadOnly: false, Visible: false);
doc.Activate();

// These 3 lines did the trick.
doc.ActiveWindow.ActivePane.View.SeekView = WdSeekView.wdSeekPrimaryFooter;
doc.Application.Selection.MoveRight(WdUnits.wdCharacter, 1);
doc.Application.Selection.Delete(WdUnits.wdCharacter, 9);

ap.Documents.Close(SaveChanges: false, OriginalFormat: false, RouteDocument: false);

((_Application) ap).Quit(SaveChanges: false, OriginalFormat: false, RouteDocument: false);
System.Runtime.InteropServices.Marshal.ReleaseComObject(ap);