我们经常需要针对一堆MS文档执行一些相对简单的测试。由于这些检查目前是手动完成的,我正在努力寻找一种自动化的方法。例如:
检查每个页面是否实际有一个页码,并验证页面标题中的版本标识符是否在所有页面中是相同的。如果文档有数字表,则检查文档是否有contents.
等等。将PowerShell与Word API结合使用是否合理?
发布于 2020-05-27 20:22:39
Powershell可以通过其对象模型/Interop(至少在Windows上)访问Word,AIUI也可以使用) API,因此您实际上应该能够对文档内容编写任何检查。稍微不那么明显的是如何验证文档内容是否会导致特定的“打印外观”。首先,我要就细节发表一些评论。
请记住,在下面的笔记中,我只是指出了一些你可能需要处理的事情。如果您正在检查由一个组织产生的文档,在这些文档中,人们已经广泛地遵循了相同的标准,这可能会更容易一些。
在你给出的5个例子中,没有检查细节,我无法确切地说明你将如何做,而且所有这些都可能有困难,但例如
Check if every page actually has a page number and verify that it is correct.使用OOXML或对象模型都很困难,因为您真正要检查的是某个特定部分的头具有可见的{ PAGE }字段代码。因为该字段代码可能嵌套在其他字段中,这些字段中写着“如果不显示此字段代码”,所以很难确定是否会有一个页码。
这就是我所说的检查文档的“打印外观”--例如,如果您可以使用对象模型打印成PDF,并且有某种机制让PS检查PDF的内容,那么这可能是一种更好的方法。
Verify that a version identifier in the page header is identical across all pages.类似于上述问题,海事组织。这在一定程度上取决于如何插入版本标识符。这只是一条短信吗?它能由许多领域来建造吗?它可以引用文档属性或变量,或者自定义XML内容吗?
Check if the document has a table of contents.可能足够查找没有特定选项的TOC字段,例如数字表中包含的\c选项。
Check if the document has a table of figures.可能足以检查有\c选项的TOC字段,可能带有“图”之类的特定参数。
Check if every figure has a caption.不确定你是否能分辨出一个特定的图像是否是“一个数字”。但是,如果您的意思是“验证每个图形对象都有一个标题”,您可能会迭代文档中的内联和浮动图形,并验证在该对象的一定距离内是否有类似于单词标准标题段落的内容。Word有两种用于标题AFAIK的标准字段代码模式(一种是包含章节号的,另一种则不是),因此您可以查找它们。您可以测量图像和标题之间的距离,方法是确保它们之间的距离不超过预定的段落数,或者在浮动图像的情况下,也许锚定图像的段落距离标题的段落不超过这么多段。
可能需要处理的几个更一般的问题:-仅仅因为文档包含某个特性(如ToC字段),并不意味着它是可见的。TOC字段可能被格式化为不可见。更难检测到的是,它可能被格式化为彩色白色。-变化跟踪。您可能必须使用单词对象模型来“接受更改”,然后才能检查是否存在任何给定的功能。除非您能够找到使用文档的OOXML表示来帮助您这样做的现有代码,否则这可能是通过对象模型进行检查的有力理由。
一些最后的观察
https://stackoverflow.com/questions/61997815
复制相似问题