加载模板很慢,因为要进行内部清理工作
我有一个docx文档,大约85页,大小约1.6 MB。用 $TBS->LoadTemplate() 加载它需要超过80秒,原因在于调用内部方法 MsWord_Clean()。根据文档,这样做是“用于清理或准备某些子文件”,提出的变通方法是调用 $TBS->Plugin(OPENTBS_MAKE_OPTIMIZED_TEMPLATE, $template, $new_template);,随后使用 $new_template。
我想知道这项优化到底是关于什么的?为什么需要?如果把 $TBS->OtbsClearMsWord 设置为 false 将其关闭,得到的文档仍然看起来没问题,模板加载也快得多。
解决方案
清理工作是关于替换或删除所有可能扭曲TBS标签的XML元素或特殊字符(因此OpenTBS找不到该标签)或在合并过程中可能引发错误的内容。
默认情况下,在加载模板时,OpenTBS会执行这项清理。
如果此前已经在模板上完成过该清理,那么下次就不需要再做,模板加载会更快。这就是这项优化的要点。
对于DOCX,有很多需要处理的地方。
例如,当你在文档中修改TBS标签时,MS Word可能在后台悄悄地拆分该TBS标签,以便放置历史编辑信息,这些信息在你验证用户修改时会用到。
同样,拼写和语法信息也可能拆分TBS标签。
此外,MS Word还可能在后台无声地复制文档中的某些项,以生成与旧版本Word兼容的等效替代结构。这在合并TBS块时可能产生无效的XML。
对于DOCX,需要进行的清理清单如下:
- 将撇号替换为单引号。
-
如果
$TBS->OtbsSpacePreserve被设为true(默认值): -
删除在不需要时用于保留空格的XML标签。
-
如果
$TBS->OtbsClearMsWord被设为true(默认值): -
删除隐藏书签的XML标签。
- 删除最后渲染的分页符的XML标签。
- 删除用于语法和拼写的XML标签。
- 删除重复的替代布局的XML标签。
- 删除用于用户历史修改的XML标签。
也有可能根本不需要进行上述清理,这取决于具体情况。