跳转到主要内容
处理文档时,ABBYY FineReader Engine 会先分析其布局,并检测文档页面上的特定区域。这些区域称为“块”。块决定了图像区域应如何以及按什么顺序进行识别。 在 ABBYY FineReader Engine 中,Layout 对象用于存储块和已识别的文本。基本文档处理场景处理的是 FRDocument 对象中的布局,该对象表示正在处理的文档。要访问文档页面的布局,请使用 IFRPage::Layout 属性。 如果 Windows 或 Linux 上的 FRE 用户使用以进程外服务器方式加载的 Engine 对象,则可以通过以下方案加快对 Layout 对象的迭代: 对于 Windows:
  1. 使用 OutprocLoader 对象处理文档,并获取每一页的布局。通过 SaveToStream 方法将获取到的布局写入数据流。
  2. 使用 InprocLoader 对象,通过 CreateLayoutFromStream 方法还原原始布局的副本。使用该副本继续迭代布局内容。
对于 Linux:
  1. 使用以进程外服务器方式加载的 Engine 对象处理文档,并获取每一页的布局。通过 SaveToArray 方法将获取到的布局写成字节数组。
  2. 使用以原生方式加载的 Engine 对象 (即从 libFREngine.so 库加载到当前进程中) ,通过你对 IReadStream 接口的实现来读取获取到的字节数组。
  3. 使用以原生方式加载的 Engine 对象,通过 CreateLayoutFromStream 方法还原原始布局的副本。使用该副本继续迭代布局内容。
FRPage 的布局中获取的块,在对该页面或其所属文档调用任何执行布局分析的方法 (例如 AnalyzeProcess) 后都会失效。分析完成后,请在新的布局中找到所需的块,并继续使用新的 Block 对象。

布局块

Layout 对象通过 Blocks 和 BlackSeparators 属性提供对布局结构的访问。这两个属性都可访问 LayoutBlocks 子对象,它们表示块的集合。前者指向布局块的主集合,其中包含文本、表格、图片、条形码和勾选标记。后者指向分隔符块的集合。分隔符是在页面布局分析期间检测到的黑线,用于在合成和导出时更精确地重建页面布局。 此外,还可以通过 Layout 对象的 SortedBlocks 属性,按逻辑排序顺序获取这些块。 每个块都有自己的区域,该区域由多个矩形组成。区域由 Region 对象表示。 根据块中包含的数据类型,块可分为不同类型,每种类型都有各自特有的属性。这些属性可通过相应的块类型对象访问,而这些对象可使用 Block 对象的方法获得。相应的块类型接口派生自 IBlock 接口,并继承其所有属性。可用的块类型如下:
此类块对应于被识别为带格式文本的图像区域。此类块的属性可通过 TextBlock 对象访问。该对象还可访问块所包围图像部分中的识别文本。
此类块对应于表格。此类块只能是矩形 (即区域只包含一个矩形) 。此类块的属性可通过 TableBlock 对象访问。表格结构由两组表格分隔符 (水平和垂直的 TableSeparators 对象) 以及一组表格单元格 (TableCells 对象) 描述。每个表格单元格都被视为某种类型的块。识别出的文本是单个单元格的属性,而不是整个表格的属性。如果单元格是图片,则单元格边界内包含的图像不会被识别,而会在识别文本中显示为图片。表格分隔符可以有不同类型。分隔符类型是针对分隔符上位于与其他分隔符最近交点之间的线段定义的。分隔符可分为以下类型:
  • Absent。此类型分配给“应当”穿过合并单元格的表格分隔符。
  • Unknown。此类型默认分配给每个新添加的表格分隔符。
  • Invisible。此类型分配给“假想”的表格分隔符,它是在表格结构分析过程中创建的,位置是源表格中原本没有但从逻辑上应该存在分隔符的地方。
  • Explicit。此类型的表格分隔符出现在源表格黑线所在的位置。
  • Multiple。此类分隔符可能在编辑表格后出现。 Table
此类块表示被视为光栅图片的图像区域。此块所包围的图像部分不会被识别,并且该块会“按原样”导出。此类块的属性由 RasterPictureBlock 对象表示。
此类块表示被视为矢量图片的图像区域。只有当页面在分析时将 IPageAnalysisParams::DetectVectorGraphics 属性设置为 TRUE,布局中才可能出现此类块。通常,背景图片会被识别为此类块。此类块的属性由 VectorPictureBlock 对象表示。
图像中被此类块圈定的部分会被视为条码。ABBYY FineReader Engine 可识别多种类型的条码,也可以自动检测条码类型。识别出的条码信息可通过条码块的专用属性访问,这些属性由 BarcodeBlock 对象表示。
图像中被此类块圈定的部分会被视为勾选标记。它对应于被识别为勾选标记的图像区域。识别出的勾选标记信息可通过勾选标记块的专用属性访问,这些属性由 CheckmarkBlock 对象表示。
图像中被此类块圈定的部分会被视为勾选标记组。它对应于被识别为勾选标记组的图像区域。识别出的勾选标记组信息可通过勾选标记组块的专用属性访问,这些属性由 CheckmarkGroup 对象表示。
图像中被此类块圈定的部分会被视为分隔符。分隔符是在页面布局分析期间检测到的线条。它们可以是表格的一部分、分隔不同文本元素的线条等。分隔符的坐标和类型可通过 SeparatorBlock 对象获取。
图像中被此类块圈定的部分会被视为分隔符组。它对应于被识别为一组分隔符的图像区域。一个分隔符组通常包含构成矩形的四个分隔符。例如,表格边框的四条线会被识别为一个分隔符组。每个分隔符组都包含一个分隔符块集合。分隔符组块的专用属性由 SeparatorGroup 对象表示。
此外还有自动分析块,它们仅用于 Visual Components (FRE for Windows 的一部分) 。这些块无法通过 FineReader Engine API 创建或识别。它们只能通过 ILayout::VisualBlocks 属性访问。

手动添加块

在布局分析过程中,系统会自动在页面上检测到块。但您也可以手动绘制块。这种情况下:
  1. 打开 FRPage 对象,并通过 Layout 属性获取页面布局。
  2. 使用 IEngine::CreateRegion 方法为该块创建一个 Region 对象,再使用 IRegion::AddRect 方法向其中添加矩形。
  3. 创建所需类型的块,并使用 LayoutBlocks 对象的 AddNew 方法将其添加到布局块集合中。
  4. 设置该块所需的参数 (使用与该块类型对应的块属性对象) 。

更改块类型

块类型在创建时确定,之后无法更改。如果您需要更改块类型,则必须删除该块,并在完全相同的位置创建一个所需类型的新块:
  1. 使用 IEngine::CreateRegion 方法创建一个 Region 对象,并借助 IRegion::CopyFrom 方法复制您需要替换的块的区域。
  2. 通过调用 ILayoutBlocks::DeleteAt 方法,从 Layout 中删除旧块。
  3. 创建一个所需类型的新块,并使用 LayoutBlocks 对象的 AddNew 方法将其添加到 Layout 块集合中。将从旧块复制的 Region 作为必需参数之一传入。

另请参阅

识别勾选标记 处理文本