我为另一个团队编写了一个实用程序,它递归地遍历文件夹并将找到的 Word 文档转换为 PDF,方法是使用带有 C# 的 Word Interop。
我们遇到的问题是文档是使用日期字段创建的,这些字段在保存之前会更新为今天的日期。我找到了一种在打印前禁用更新字段的方法,但我需要防止字段在打开时更新。
那可能吗?我想在 C# 中进行修复,但如果我必须做一个 Word 宏,我可以。
我为另一个团队编写了一个实用程序,它递归地遍历文件夹并将找到的 Word 文档转换为 PDF,方法是使用带有 C# 的 Word Interop。
我们遇到的问题是文档是使用日期字段创建的,这些字段在保存之前会更新为今天的日期。我找到了一种在打印前禁用更新字段的方法,但我需要防止字段在打开时更新。
那可能吗?我想在 C# 中进行修复,但如果我必须做一个 Word 宏,我可以。
如 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
中,因此无需在页眉、页脚、脚注、文本框等中获取字段实例。这是一种令人惊讶的享受。
好吧,我没有找到使用 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 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的字段。