7

我为另一个团队编写了一个实用程序,它递归地遍历文件夹并将找到的 Word 文档转换为 PDF,方法是使用带有 C# 的 Word Interop。

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

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

4

3 回答 3

4

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

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

我可以跑

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事件中。我假设您有一个订阅该事件的加载项。如果不是,请澄清,因为这本身就是一场战斗。

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

于 2013-04-14T15:44:28.347 回答
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;
        }
    }
于 2013-10-25T17:56:24.157 回答
0

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

检查锁定字段的 OOXML 向我们展示了这个 w:fldLock="1"属性。这可以通过对文档使用适当的 XML 处理来插入,例如通过 OOXML SDK 或通过标准 XSLT 转换。

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

为了更加确信这是解决问题的方法,请参阅该供应商针对该问题的解决方案示例。如果您需要在内部进行开发,那么openxmldeveloper.org是一个不错的起点 - 查找 Eric White 的示例来操作诸如this的字段。

于 2013-04-16T03:38:54.640 回答