防止Word文档's字段在打开时更新

本文关键字:更新 字段 文档 Word 防止 | 更新日期: 2023-09-27 18:08:46

我为另一个团队编写了一个实用程序,它可以递归地遍历文件夹,并通过使用Word与c#的互操作将找到的Word文档转换为PDF。

我们遇到的问题是,文档是用日期字段创建的,在保存之前更新为今天的日期。我找到了一种在打印前禁用更新字段的方法,但我需要防止字段在打开时更新。

这可能吗?我想在c#中做修复,但如果我必须做一个Word宏,我可以。

防止Word文档's字段在打开时更新

正如Microsoft无尽迷宫般的文档中所描述的那样,您可以锁定字段代码。例如,在VBA中如果我在主体中有一个日期字段,格式为

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

I can run

ActiveDocument.Fields(1).Locked = True

然后,如果我对文档进行更改,保存,然后重新打开,字段代码将不会更新。

使用c# Office互操作的例子:

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

您可以将代码放在DocumentOpen事件中。我假设您有一个订阅事件的加载项。如果没有,请澄清,因为这本身就是一场战斗。

编辑:在我的测试中,以这种方式锁定字段锁定了所有StoryRanges中的字段,因此不需要在页眉、页脚、脚注、文本框等中获取字段实例。等。

嗯,我没有找到Interop的方法,但我的公司确实收购了Aspose。我和Words编写了一个实用程序,将Word文档转换为TIFF图像。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互操作。如果你有。doc和。docx两种文件类型要转换,你可能需要两个单独的解决方案:一个用于WordML (Word 2003 XML格式),另一个用于OpenXML (Word 2007/2010/2013 XML格式),因为你不能打开旧的文件格式并保存为新的而不更新字段。

检查锁定字段的OOXML显示了这个w:fldLock="1"属性。可以通过对文档进行适当的XML处理(例如通过OOXML SDK)或通过标准XSLT转换来插入。

可能有帮助:这个如何解锁一个Content -control-using-the-openxml-sdk-in-a-word-2010-document问题可能是类似的情况,但对于Content Controls。如果LockLockingValues类型以相同的方式应用于字段,则可以将相同的解决方案应用于字段。然而,我不确定这一点。

要更有信心地认为这是解决问题的方法,请参阅该供应商解决问题的示例。如果您需要在内部开发这个字段,那么openxmldeveloper.org是一个很好的起点—查找Eric White的示例来操作这样的字段。