Pdf Comparer 一个比较Pdf内容的工具

因工作需要最近正在开发一个比较Pdf内容的工具,趁着还记得一些思路来简谈一下这个工具的设计。当然实事求是的说,其中有一些设计可以再优化,但是“懒”这个字限制了我。闲话不多说,首先让我们来看一下这个工具的类图:

下文中出现的名词释义:

  1. Pdf源文件:指后缀名为.pdf的Adobe Pdf文件
  2. Pdf纯文本:指Pdf源文件被阅读后所能展现的纯文本内容

下面对其中主要的一些类型进行简单的表达(很困难通过文字来表达设计):

  1. PdfComparer
    1. 该对象是外部环境使用该工具的入口,通过定义一个简单的Compare方法,使外部能够方便地对任意多数量的Pdf文件进行比较,而不用关心内部复杂的实现
  2. PdfContentReaderContext
    1. 该对象能够注册任意多个IPdfContentReaderSelector
    2. 该对象能够注册任意多个Pdf源文件
    3. 该对象提供Analyze方法以对每个Pdf源文件选择正确的IPdfContentReader进行分析
  3. IPdfContentReaderSelector
    1. 该接口能够选择正确的IPdfContentReader来分析Pdf源文件,如果未来有新格式的Pdf文件,需要实现该接口或者继承PdfContentReaderSelectorBase
  4. IPdfContentReader
    1. 该接口提供Read方法来获得结构化的PdfContent对象
    2. 该接口拥有IPdfTool对象来操作Pdf源文件
    3. 如果未来有新格式的Pdf文件产生,需要实现该接口
  5. PdfToolFactory
    1. 该工厂提供创建IPdfTool对象的方法
  6. IPdfTool
    1. 该接口代表操作Pdf源文件的工具,它提供一个Read方法将Pdf源文件翻译成Pdf纯文本。如果需要添加新的第三方工具来阅读Pdf源文件,那么需要实现该接口,目前内建支持的Pdf工具是第三方库iTextSharp
  7. PdfContentContext
    1. PdfContent的上下文对象,拥有SourceContent属性来引用Pdf纯文本
  8. PdfContent
    1. 该对象代表Pdf源文件被分析后的结构化内容,由一个PdfHead和任意多个PdfLine组成
  9. IPdfContentContextHandler
    1. 该接口通过SetSuccessor方法定义了下一个处理当前PdfContentContext的IPdfContentContextHandler,应用了责任链管道
    2. 该接口通过定义Handle方法来处理PdfContentContext,并判断是否需要将处理请求传递给下一个IPdfContentContextHandler
    3. 通过实现该接口或继承PdfContentContextHandlerBase将有能力定义新的处理器,比如内建实现的用来抽取Width的WidthHandler、用来抽取Grade的GradeHandler等
  10. PdfComparisonContext
    1. 该对象提供Compare方法对结构化的PdfContent集合进行比较,并最终得到比较后的结果ComparisonResult集合
    2. 该对象拥有验证器集合Validators,可以方便的为进行正确比较而添加新验证规则
    3. 该对象拥有PdfContentGroupGenerator对象,实现对PdfContent集合的分组比较
  11. IValidator
    1. 验证器接口,通过实现该接口可以添加新的验证规则
  12. PdfContentGroupGenerator
    1. 该对象提供的Group方法可以对杂乱无序的PdfContent集合进行分组,以得到有某种分组规则的多个PdfContent集合
  13. ComparisonResult
    1. 每个ComparisonResult对象代表对一组PdfContent集合比较后的结果,每个ComparionResult保留对该组PdfContent集合的引用
  14. ComparisonResultView
    1. 该对象代表对ComparisonResult的行转列表达

Leave a Reply

Your email address will not be published. Required fields are marked *