因工作需要最近正在开发一个比较Pdf内容的工具,趁着还记得一些思路来简谈一下这个工具的设计。当然实事求是的说,其中有一些设计可以再优化,但是“懒”这个字限制了我。闲话不多说,首先让我们来看一下这个工具的类图:
下文中出现的名词释义:
- Pdf源文件:指后缀名为.pdf的Adobe Pdf文件
- Pdf纯文本:指Pdf源文件被阅读后所能展现的纯文本内容
下面对其中主要的一些类型进行简单的表达(很困难通过文字来表达设计):
- PdfComparer
- 该对象是外部环境使用该工具的入口,通过定义一个简单的Compare方法,使外部能够方便地对任意多数量的Pdf文件进行比较,而不用关心内部复杂的实现
- PdfContentReaderContext
- 该对象能够注册任意多个IPdfContentReaderSelector
- 该对象能够注册任意多个Pdf源文件
- 该对象提供Analyze方法以对每个Pdf源文件选择正确的IPdfContentReader进行分析
- IPdfContentReaderSelector
- 该接口能够选择正确的IPdfContentReader来分析Pdf源文件,如果未来有新格式的Pdf文件,需要实现该接口或者继承PdfContentReaderSelectorBase
- IPdfContentReader
- 该接口提供Read方法来获得结构化的PdfContent对象
- 该接口拥有IPdfTool对象来操作Pdf源文件
- 如果未来有新格式的Pdf文件产生,需要实现该接口
- PdfToolFactory
- 该工厂提供创建IPdfTool对象的方法
- IPdfTool
- 该接口代表操作Pdf源文件的工具,它提供一个Read方法将Pdf源文件翻译成Pdf纯文本。如果需要添加新的第三方工具来阅读Pdf源文件,那么需要实现该接口,目前内建支持的Pdf工具是第三方库iTextSharp
- PdfContentContext
- PdfContent的上下文对象,拥有SourceContent属性来引用Pdf纯文本
- PdfContent
- 该对象代表Pdf源文件被分析后的结构化内容,由一个PdfHead和任意多个PdfLine组成
- IPdfContentContextHandler
- 该接口通过SetSuccessor方法定义了下一个处理当前PdfContentContext的IPdfContentContextHandler,应用了责任链管道
- 该接口通过定义Handle方法来处理PdfContentContext,并判断是否需要将处理请求传递给下一个IPdfContentContextHandler
- 通过实现该接口或继承PdfContentContextHandlerBase将有能力定义新的处理器,比如内建实现的用来抽取Width的WidthHandler、用来抽取Grade的GradeHandler等
- PdfComparisonContext
- 该对象提供Compare方法对结构化的PdfContent集合进行比较,并最终得到比较后的结果ComparisonResult集合
- 该对象拥有验证器集合Validators,可以方便的为进行正确比较而添加新验证规则
- 该对象拥有PdfContentGroupGenerator对象,实现对PdfContent集合的分组比较
- IValidator
- 验证器接口,通过实现该接口可以添加新的验证规则
- PdfContentGroupGenerator
- 该对象提供的Group方法可以对杂乱无序的PdfContent集合进行分组,以得到有某种分组规则的多个PdfContent集合
- ComparisonResult
- 每个ComparisonResult对象代表对一组PdfContent集合比较后的结果,每个ComparionResult保留对该组PdfContent集合的引用
- ComparisonResultView
- 该对象代表对ComparisonResult的行转列表达