我正在使用 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 内容中没有边框属性。相反,边框是独立的对象,通常是矢量图形,可以是线条,也可以是非常细的矩形。
因此,在扫描页面内容时(递归地,如A所示),您将不得不寻找包含的Path
实例(命名空间org.pdfclown.documents.contents.objects
)
- moveTo m、lineTo l和stroke S操作或
- 矩形 re和填充 f操作。
(这个答案可能会有所帮助)
当你遇到这样的台词时,你将不得不解释它们。这些线可能是边框,但它们也可以用作下划线、页面装饰......
如果 PDF 恰好被标记,那么事情可能会更容易一些,因为您需要解释的更少。相反,您可以阅读标记信息,这些信息可能会告诉您单元格的开始和结束位置,因此您无需解释图形线。不幸的是,被标记的 PDF 仍然比没有标记的少。
或者如何检测文本是否是表格的标题?
就像上面一样,除非您碰巧检查了带标签的 PDF,否则不会立即告诉您某些文本是表头。你必须再次解释。该文本是否在您决定形成表格的行之外?是在里面吗?还是就在里面的任何地方?它是用特定字体绘制的吗?还是更大?颜色不一样?等等。