我试图把一个脚本,以修复PDF大量的PDF已经从Autocad通过他们的DWG2PDF打印驱动程序导出。
当使用此驱动程序时,所有SHX字体都被呈现为形状数据,而不是文本数据,但是,它们确实有一个注释插入到PDF中,在预期的位置使用预期的文本。
到目前为止,在我的脚本中,我已经让它在PDF中运行,并在每个部分的顶部插入隐藏的文本,文本压缩到评论的大小,这给了我90%的方法,给了我一个可搜索的文档。
遗憾的是,注释区域的大小是相对的(基于整数的),这使得很难准确地确定短文本的方向,导致文本周围大小不均匀的框。
我想要做的是解析PDF中的形状数据,在注释范围内收集任何信息,然后确定一个更小、更精确的边框。然而,我所能找到的所有信息都是那些试图通过文本数据进行解析的人,而我在形状数据方面根本找不到任何东西。
下面的图像是PDF中原始文本的示例,第二个图像以蓝色显示注释边框,红色文本是我设置的隐藏内容,以使文档可搜索,并可复制/粘贴。我可以通过将框缩小一个固定的边距来得到更好的效果,但是对于小的文本项,注释框的低分辨率坐标数据会把事情搞砸。
为了达到这一目的,我使用了PyPDF2和reportlab的组合,但是可以迁移到不同的库中。
发布于 2022-02-02 23:44:17
最后,我没有用PyPDF2找到解决方案,我找到了一种在pdfminer.six中迭代形状数据的简单方法,但是在pdfminer中找不到一种提取注释数据的好方法。
因此,我使用一个库获取注释,一个用于查看形状数据,最后使用第三个库在新的pdf上添加隐藏文本。随着工作表复杂性的增加,它运行得非常慢,但是给我足够好的结果,请参见下面的图像,其中注释中的粗绿色边框缩小到文本周围的蓝色边框。当然,我不会划定边界,使用不可见的文本作为实际的程序输出,给出相当好的可选择/可搜索的文本。
如果有人对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)
https://stackoverflow.com/questions/70952416
复制