ArtifexSoftware / pdf2docx

Open source Python library for converting PDF to DOCX.
https://pdf2docx.readthedocs.io
GNU Affero General Public License v3.0
2.46k stars 356 forks source link

关于多栏布局/版面分析的一些探讨 #258

Open hiroi-sora opened 7 months ago

hiroi-sora commented 7 months ago

各位开发者好,我是 Umi-OCR 的作者。

Umi-OCR 是一个开源的OCR软件,目前正在开发PDF扫描件识别的功能。其中的一个难点在于,OCR得到的文本块的顺序,往往与实际阅读顺序不符合,特别是在多栏布局的文档中。我需要根据文档的排版,正确区分出不同列,按实际阅读顺序为文本块进行排序。

pdf2docx 中也涉及一些基于规则的排版解析功能。我浅读了部分代码,这给了我一些启发。

最终,我设计出一个新算法: GapTree_Sort 间隙树排序法 。它通过寻找文本块之间的间隙,将页面切割为不同的纵向区块,构建出布局树。最后,前序遍历布局树,即可得到符合人类阅读习惯的文本排序。

当然,除了排序文本块,也能通过布局树分析更多排版信息。(不过它不是针对PDF设计的,没有考虑块对象本身附带的标签等信息。)

pdf2docx 当前的规则匹配,只支持最多2栏、且列宽不能相差太大。

而 GapTree_Sort 支持更复杂的排版情况。如:任意多栏布局(>2),列宽不一致,跨多列区块等。

另,该算法对于常见布局的时间复杂度仅为 O(n) ,n为文本块数量。仓库中有证明。

GapTree_Sort 是个刚开发的算法,可能有很多不完善的地方;各位可以来测试或提供一些建议。仓库内有示例代码和更详细的算法流程介绍。

https://github.com/hiroi-sora/GapTree_Sort_Algorithm

dothinking commented 7 months ago

版面分析是 pdf2docx 缺失的一环,目前的工作只能算机械的两栏划分。我会学习一下你的算法,希望可以拓展、集成到这个库中。非常感谢。

nunamia commented 6 months ago

各位开发者好,我是 Umi-OCR 的作者。

Umi-OCR 是一个开源的OCR软件,目前正在开发PDF扫描件识别的功能。其中的一个难点在于,OCR得到的文本块的顺序,往往与实际阅读顺序不符合,特别是在多栏布局的文档中。我需要根据文档的排版,正确区分出不同列,按实际阅读顺序为文本块进行排序。

pdf2docx 中也涉及一些基于规则的排版解析功能。我浅读了部分代码,这给了我一些启发。

最终,我设计出一个新算法: GapTree_Sort 间隙树排序法 。它通过寻找文本块之间的间隙,将页面切割为不同的纵向区块,构建出布局树。最后,前序遍历布局树,即可得到符合人类阅读习惯的文本排序。

当然,除了排序文本块,也能通过布局树分析更多排版信息。(不过它不是针对PDF设计的,没有考虑块对象本身附带的标签等信息。)

pdf2docx 当前的规则匹配,只支持最多2栏、且列宽不能相差太大。

而 GapTree_Sort 支持更复杂的排版情况。如:任意多栏布局(>2),列宽不一致,跨多列区块等。

另,该算法对于常见布局的时间复杂度仅为 O(n) ,n为文本块数量。仓库中有证明。

GapTree_Sort 是个刚开发的算法,可能有很多不完善的地方;各位可以来测试或提供一些建议。仓库内有示例代码和更详细的算法流程介绍。

https://github.com/hiroi-sora/GapTree_Sort_Algorithm

不得不说,思路很好,解决也不错,唯一问题就是被大模型降维打击了,无论准确性和复杂度,没有Layoutlmv3简单高效。

heweisheng commented 3 months ago

各位开发者好,我是 Umi-OCR 的作者。 Umi-OCR 是一个开源的OCR软件,目前正在开发PDF扫描件识别的功能。其中的一个难点在于,OCR得到的文本块的顺序,往往与实际阅读顺序不符合,特别是在多栏布局的文档中。我需要根据文档的排版,正确区分出不同列,按实际阅读顺序为文本块进行排序。 pdf2docx 中也涉及一些基于规则的排版解析功能。我浅读了部分代码,这给了我一些启发。 最终,我设计出一个新算法: GapTree_Sort 间隙树排序法 。它通过寻找文本块之间的间隙,将页面切割为不同的纵向区块,构建出布局树。最后,前序遍历布局树,即可得到符合人类阅读习惯的文本排序。 当然,除了排序文本块,也能通过布局树分析更多排版信息。(不过它不是针对PDF设计的,没有考虑块对象本身附带的标签等信息。) pdf2docx 当前的规则匹配,只支持最多2栏、且列宽不能相差太大。 而 GapTree_Sort 支持更复杂的排版情况。如:任意多栏布局(>2),列宽不一致,跨多列区块等。 另,该算法对于常见布局的时间复杂度仅为 O(n) ,n为文本块数量。仓库中有证明。 GapTree_Sort 是个刚开发的算法,可能有很多不完善的地方;各位可以来测试或提供一些建议。仓库内有示例代码和更详细的算法流程介绍。 https://github.com/hiroi-sora/GapTree_Sort_Algorithm

不得不说,思路很好,解决也不错,唯一问题就是被大模型降维打击了,无论准确性和复杂度,没有Layoutlmv3简单高效。

目前有基于Layoutlmv3的面版识别训练开源吗?我用飞浆的ppstruct效果处理论文外的数据效果不好,目前只能处理对应的分类论文类的,暂时还没有找到通用的识别