Предотвратить полей документа Word от обновление при открытии

Я написал утилиту для другой команды, которая рекурсивно просматривает папки и преобразует найденные документы Word в PDF с помощью Word Interop с C#.

проблема заключается в том, что документы были созданы с полями даты, которые обновляются до сегодняшней даты, прежде чем они будут сохранены. Я нашел способ отключить обновление полей перед печатью, но мне нужно предотвратить обновление полей при открытии.

Это возможно? Я хотел бы сделать исправление в C#, но если я нужно сделать макрос слова, я могу.

3 ответов


как описано в бесконечном лабиринте Microsoft документация вы можете заблокировать поле Код. Например, в VBA, если у меня есть одно поле даты в теле в виде

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

Я могу запустить

ActiveDocument.Fields(1).Locked = True

затем, если я внесу изменения в документ, сохраните, а затем снова откройте, код поля не будет обновляться.

пример использования 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

вы можете поместить код в DocumentOpen событие. Я предполагаю, что у вас есть надстройка, которая подписывается на событие. Если нет, уточните, как это может быть битва сама по себе.

EDIT: в моем тестировании блокировка полей таким образом блокирует их во всех StoryRanges, поэтому нет необходимости получать экземпляры полей в верхних, нижних колонтитулах, сносках, текстовых полях ..., п. Это удивительное удовольствие.


Ну, я не нашел способ сделать это с Interop, но моя компания купила Aspose.Слова, и я написал утилиту для преобразования документов Word в изображения TIFF. The Aspose инструмент не будет обновлять поля, если вы явно не скажете ему. Вот пример кода, который я использовал с Aspose. Имейте в виду, у меня было требование преобразовать документы Word в одностраничные изображения TIFF, и я жестко закодировал многие из вариантов, потому что это была просто утилита для меня в этом проекте.

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;
        }
    }

Я думаю, что новый вопрос о SO подходит, потому что для этого потребуется обработка XML, а не только взаимодействие с Office. Если у вас есть оба .док и. типы файлов docx для преобразования могут потребоваться два отдельных решения: одно для WordML (формат Word 2003 XML), а другое для OpenXML (формат Word 2007/2010/2013 XML), так как нельзя открыть старый формат файла и сохранить как новый без обновления полей.

проверка OOXML заблокированного поля показывает нам этой . Это можно вставить с помощью соответствующей обработки XML для документа, например с помощью пакета SDK OOXML или стандартного преобразования XSLT.

может быть полезно: этот how-do-i-unlock-a-content-control-using-the-openxml-sdk-in-A-word-2010-document вопрос может быть аналогичной ситуацией, но для элементов управления контентом. Возможно, вы сможете применить то же решение к полям, если Lock и LockingValues типы применяются таким же образом в Филдс. Однако я в этом не уверен.

чтобы дать больше уверенности, что это способ сделать это, см. пример этого поставщика решение для проблема. Если вам нужно развивать это в доме, то openxmldeveloper.org хорошее место для начала-ищите примеры Эрика Уайта для манипулирования полями, такими как этой.