解析 python 中的 PDF 形状数据

Parse PDF shape data in python

我正在尝试编写一个脚本来修复 PDF 大量通过其 DWG2PDF 打印驱动程序从 Autocad 导出的 PDF。

使用此驱动程序时,所有 SHX 字体都呈现为形状数据而不是文本数据,但是它们确实在 PDF 中的预期位置和预期文本中插入了注释。

到目前为止,在我的脚本中,我已经通过 PDF 将它 运行 并在每个部分的顶部插入隐藏文本,文本被压缩到评论的大小,这让我得到了 90%方式并给我一个可搜索的文档。

不幸的是,评论区域的大小比较粗糙(基于整数),这使得难以准确确定短文本的方向,并导致文本周围的框大小不均匀。

我想做的是解析 PDF 中的形状数据,收集评论范围内的所有内容,然后确定一个更小、更准确的边界框。然而,我能找到的所有信息都是由试图解析文本数据的人提供的,而我在形状数据方面一无所获。

下图是 PDF 中原始文本的示例,第二张图片显示了蓝色的评论边界框,红色文本是我设置为隐藏以使文档可搜索的内容,copy/paste 能。通过将框缩小一个固定的边距,我可以让事情变得更好一些,但是对于小文本项目,评论框坐标数据的低分辨率会把事情搞砸。

为了做到这一点,我结合使用了 PyPDF2 和 reportlab,但我愿意迁移到不同的库。

我最终没有找到 PyPDF2 的解决方案,我能够找到一种简单的方法来迭代 pdfminer.six 中的形状数据,但是在 pdfminer 中找不到一个很好的方法来提取注释数据。

因此,我使用一个库来获取注释,一个库查看形状数据,最后一个第三个库在新 pdf 上添加隐藏文本。随着 sheet 复杂性的增加,它运行得相当慢,但它给了我足够好的结果,请参见下图,其中注释中的粗略绿色边框缩小为文本周围的蓝色边框。当然我不划界,实际程序输出的时候用的是不可见的文字,给的还不错selectable/searchable文字

如果有人对遍历 PDF 中的形状数据感兴趣,下面的代码片段应该可以帮助您入门。

from pdfminer.high_level import extract_pages
from pdfminer.layout import LTLine, LTCurve

for page_layout in extract_pages("TestSchem.pdf"):
    for element in page_layout:
        if isinstance(element, LTCurve) or isinstance(element, LTLine):
            print(element.bbox)