Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Prevent Word document's fields from updating when opened

I wrote a utility for another team that recursively goes through folders and converts the Word docs found to PDF by using Word Interop with C#.

The problem we're having is that the documents were created with date fields that update to today's date before they get saved out. I found a method to disable updating fields before printing, but I need to prevent the fields from updating on open.

Is that possible? I'd like to do the fix in C#, but if I have to do a Word macro, I can.

like image 456
Doug Dawson Avatar asked Apr 12 '13 14:04

Doug Dawson


People also ask

How do you lock fields in a Word document?

To lock a field, perform these steps: Select the field you want to lock. Update the field, if desired, by pressing Shift+F9. Press Ctrl+F11.

How do I stop my table of contents from updating automatically?

The Normal file has all of the table of content (ToC) styles set to automatic updates. As best I can tell, the only way to disable that setting is one-by-one, and that involves multiple steps (click the style, click Modify, toggle Automatic update, click Ok, repeat).

How do you prevent minimized Word documents from expanding when I open another document?

Hover the mouse pointer over that Taskbar icon and then middle-click the mouse. (Middle clicking is done by clicking on the mouse's scroll wheel.) When you do, Word displays the familiar Open screen. Open a document from this screen, and your previously minimized Word documents stay minimized.


2 Answers

As described in Microsoft's endless maze of documentation you can lock the field code. For example in VBA if I have a single date field in the body in the form of

{DATE  \@ "M/d/yyyy h:mm:ss am/pm"  \* MERGEFORMAT }

I can run

ActiveDocument.Fields(1).Locked = True

Then if I make a change to the document, save, then re-open, the field code will not update.

Example using c# Office Interop:

Word.Application wordApp = new Word.Application();
Word.Document wordDoc = wordApp.ActiveDocument;
wordDoc.Fields.Locked = 1; //its apparently an int32 rather than a bool

You can place the code in the DocumentOpen event. I'm assuming you have an add-in which subscribes to the event. If not, clarify, as that can be a battle on its own.

EDIT: In my testing, locking fields in this manner locks them across all StoryRanges, so there is no need to get the field instances in headers, footers, footnotes, textboxes, ..., etc. This is a surprising treat.

like image 75
JohnZaj Avatar answered Oct 10 '22 15:10

JohnZaj


Well, I didn't find a way to do it with Interop, but my company did buy Aspose.Words and I wrote a utility to convert the Word docs to TIFF images. The Aspose tool won't update fields unless you explicitly tell it to. Here's a sample of the code I used with Aspose. Keep in mind, I had a requirement to convert the Word docs to single page TIFF images and I hard-coded many of the options because it was just a utility for myself on this project.

private static bool ConvertWordToTiff(string inputFilePath, string outputFilePath)
    {
        try
        {
            Document doc = new Document(inputFilePath);

            for (int i = 0; i < doc.PageCount; i++)
            {
                ImageSaveOptions options = new ImageSaveOptions(SaveFormat.Tiff);
                options.PageIndex = i;
                options.PageCount = 1;
                options.TiffCompression = TiffCompression.Lzw;
                options.Resolution = 200;
                options.ImageColorMode = ImageColorMode.BlackAndWhite;

                var extension = Path.GetExtension(outputFilePath);
                var pageNum = String.Format("-{0:000}", (i+1));
                var outputPageFilePath = outputFilePath.Replace(extension, pageNum + extension);

                doc.Save(outputPageFilePath, options);
            }

            return true;
        }
        catch (Exception ex)
        {
            LogError(ex);
            return false;
        }
    }
like image 26
Doug Dawson Avatar answered Oct 10 '22 17:10

Doug Dawson