Предотвратить полей документа 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 хорошее место для начала-ищите примеры Эрика Уайта для манипулирования полями, такими как этой.