打开时防止Word文档的字段更新

时间:2013-04-12 14:34:20

标签: c# ms-word office-interop

我为另一个团队编写了一个实用程序,它递归地浏览文件夹,并使用Word Interop和C#将发现的Word文档转换为PDF。

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

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

3 个答案:

答案 0 :(得分:4)

如微软无尽的迷宫documentation中所述,您可以锁定字段代码。例如,在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事件中。我假设你有一个加载项订阅该事件。如果没有,请澄清,因为这可能是一场独立的战​​斗。

编辑:在我的测试中,以这种方式锁定字段将它们锁定在所有StoryRanges上,因此不需要在页眉,页脚,脚注,文本框,......等中获取字段实例。是一种令人惊讶的享受。

答案 1 :(得分:1)

好吧,我没有找到使用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;
        }
    }

答案 2 :(得分:0)

我认为关于SO的新问题是合适的,因为这将需要XML处理而不仅仅是Office Interop。如果要同时转换.doc和.docx文件类型,则可能需要两个单独的解决方案:一个用于WordML(Word 2003 XML格式),另一个用于OpenXML(Word 2007/2010/2013 XML格式),因为您无法打开旧文件格式并保存为新文件而不更新字段。

检查锁定字段的OOXML会显示this w:fldLock="1"属性。可以使用针对文档的适当XML处理插入,例如通过OOXML SDK或通过标准XSLT转换。

可能会有所帮助:这个how-do-i-unlock-a-content-control-using-the-openxml-sdk-in-a-word-2010-document问题可能与内容控制类似。如果LockLockingValues类型以相同的方式应用于字段,则可以将相同的解决方案应用于字段。但我不确定这一点。

为了更加确信这是实现此目的的方法,请参阅此供应商solution的问题示例。如果您需要在内部开发,那么openxmldeveloper.org是一个很好的起点 - 查看Eric White的操作this等字段的示例。

相关问题