msoffice-以编程方式编辑RTF,使其与写字板兼容



我正在将数据从一个文档管理系统传输到另一个系统。

在旧系统中,他们有一个书签按钮,用于插入替换字段。我需要替换替换字段的语法,这样它们才能在新系统中工作(不是我遇到的问题)。

旧RTF

{rtf1ansideflang1033ftnbjuc1deff1
{fonttbl{f0 froman fcharset0 Times New Roman;}{f1 fswiss Arial;}}
{colortbl ;red255green255blue255 ;red0green0blue0 ;}
{stylesheet{f1fs20cf2cb1ulc2 Normal;}{cs1cf2cb1ulc2 Default Paragraph Font;}}
{*revtbl{Unknown;}}
paperw12240paperh15840margl1440margr1440margt1440margb1440headery720footery0deftab720formshadeaendnotesaftnnrlcpgbrdrheadpgbrdrfoot
sectdpgwsxn12240pghsxn15840marglsxn1440margrsxn1440margtsxn1440margbsxn1440headery720footery0sbkpagepgncontpgndec
plainplainf1fs20qlplainf1fs20 TESTlang1033f1  {fieldfldlock{*fldinst MERGEFIELD ID}{fldrslt}} TESTplainf1fs20par}

在他们的旧系统中打印:

测试{ID}测试

打印时,{ID}将替换为正确的ID号。

但是这是我的问题如果我只是在写字板中打开RTF,它看起来像

测试测试

保存后RTF看起来像

{rtf1ansiansicpg1252deff0deflang1033{fonttbl{f0fswiss Arial;}}
{*generator Msftedit 5.41.21.2510;}viewkind4uc1pardf0fs20 TEST  TESTpar
}

我真的不关心大多数其他元数据,但我不明白它为什么要剥离{ID}。从我在MSDN上看到的内容来看,fieldfldlock{*fldinst MERGEFIELD ID}{fldrslt}的格式不正确。

我应该只写一个正则表达式来匹配字段标记并去掉它们吗?还是有更好的解决方案?

编辑

如果我在Word中打开RTF,也会发生这种情况,但它会使文件太长,无法在此处发布。

我最终使用了regex,如果有人好奇的话,这里是模式

{(?:s*\*)?s*\fields*\fldlocks*{s*\*s*\fldinsts*MERGEFIELDs*(\.*?)?([w[]]+)(s+w+)?(s*\.*?)?s*}(?:s*{s*\fldrslts*})?s*}

最新更新