使用 PDF Clown 检测 PDF 表格中的标题和边框

Posted

技术标签:

【中文标题】使用 PDF Clown 检测 PDF 表格中的标题和边框【英文标题】:Detecting Headers and Borders in PDF Tables using PDF Clown 【发布时间】:2015-07-20 14:39:11 【问题描述】:

我正在使用 PDF Clown 的 TextInfoExtractionSample 将 PDF 表格提取到 Excel 中,除了合并的单元格之外,我能够做到这一点。在下面的代码中,对于对象“内容”,我将扫描的内容视为文本、XObject、ContainerObject,但没有边框。任何人都知道什么对象代表 PDF 表格中的边框或如何检测文本是否是表格的标题?

   private void Extract(ContentScanner level, PrimitiveComposer composer)
   
      if(level == null)
        return;
      while(level.MoveNext())
      
        ContentObject content = level.Current;
      
    

【问题讨论】:

【参考方案1】:

我正在使用 PDF Clown 的TextInfoExtractionSample...

在下面的代码中,对于对象“内容”,我将扫描的内容视为文本、XObject、ContainerObject,但没有边框。

while(level.MoveNext())

    ContentObject content = level.Current;

A) 访问所有内容

在您的循环代码中,您从原始示例中删除了非常重要的块,

    if(content is XObject)
    
        // Scan the external level!
        Extract(((XObject)content).GetScanner(level), composer);
    

    if(content is ContainerObject)
    
        // Scan the inner level!
        Extract(level.ChildLevel, composer);
    

这些块将示例递归变成复杂的对象(你提到的XObject、ContainerObject),这些对象又包含它们自己的简单内容。

B) 检查所有内容

谁知道什么对象代表PDF表格中的边框

不幸的是,PDF 内容中没有像 border 属性 这样的东西。相反,边框是独立的对象,通常是矢量图形,可以是线条,也可以是非常细的矩形。

因此,在扫描页面内容时(递归,如 A 所示),您将不得不寻找包含

Path 实例(命名空间 org.pdfclown.documents.contents.objectsmoveTo mlineTo lstroke S 操作或 rectangle refill f 操作。

(This answer 可能会有所帮助)

当你遇到这样的台词时,你将不得不解释它们。这些线条可能是边框,但它们也可以用作下划线、页面装饰......

如果 PDF 恰好被标记,事情可能会更容易一些,因为您需要解释的更少。相反,您可以阅读标记信息,这些信息可能会告诉您单元格的开始和结束位置,因此您无需解释图形线。不幸的是,被标记的 PDF 比没有标记的要少。

或者如何检测一个文本是否是表格的表头?

就像上面一样,除非您碰巧检查了带标签的 PDF,否则不会立即告诉您某些文本是表格标题。你必须再次解释。该文本是否在您决定形成表格的行之外?是在里面吗?还是就在里面的任何地方?它是用特定字体绘制的吗?还是更大?颜色不一样?等等。

【讨论】:

以上是关于使用 PDF Clown 检测 PDF 表格中的标题和边框的主要内容,如果未能解决你的问题,请参考以下文章

使用python处理pdf中的表格

C# 写pdf文件(写入表格)

Camelot-py 没有检测到有两行的表

如何使用 iText7 检测 PDF 中的 fontawesome 图标

如何在电脑中将Excel表格格式转换成PDF格式?

如何从Java中提取PDF文件中的表格数据