代码之家  ›  专栏  ›  技术社区  ›  REJ

有人使用AWS Textract将OCR文本添加到Python中的PDF中吗?

  •  0
  • REJ  · 技术社区  · 3 年前

    我正在探索使用各种NLP技术对PDF进行半自动编辑的选项,并通过ocrmypdf将PyMuPDF与Tesseract一起用于OCR。这总体上效果不错,但管理层希望尝试将Textract作为一种替代方案。对PDF的单个页面进行调用并阅读由此产生的词典是很容易的,但没有简单的方法(我已经找到了)将其作为不可见文本映射回PDF,以创建页面的可搜索版本(所有这些ocrmypdf都会自动完成)。

    作为参考,这里有一个Textract生成的dict的例子。给定的条目可以是WORD或LINE。

    'Id': 'be018daa-02c9-47d2-903a-73b69bdaa181',
                 'Text': "owners'",
                 'TextType': 'PRINTED'},
                {'BlockType': 'WORD',
                 'Confidence': 95.73345947265625,
                 'Geometry': {'BoundingBox': {'Height': 0.014128071255981922,
                                              'Left': 0.7538964748382568,
                                              'Top': 0.7295616269111633,
                                              'Width': 0.08705723285675049},
    
                              'Polygon': [{'X': 0.7539187669754028,
                                           'Y': 0.7295616269111633},
                                          {'X': 0.8409537076950073,
                                           'Y': 0.7295762896537781},
                                          {'X': 0.8409309983253479,
                                           'Y': 0.7436897158622742},
                                          {'X': 0.7538964748382568,
                                           'Y': 0.7436745166778564}]},
    

    有人在Python中这样做过吗?或者有建议吗?

    我正在研究各种选择。我想到的一种机制是使用为每个LINE或WORD提供的多边形坐标来创建一个新的PyMuPDF Rect,然后对该矩形调用insertTextbox()。

    但还有字体大小/字体大小以及确保所有字体对齐的问题,这意味着要识别检测到的字体及其大小。

    我们还有一个问题,即我们的PDF来自各种不受控制的来源,可能包含100%可搜索、100%仅图像或混合页面类型。它们可以由一系列应用程序生产,因此没有一个单一的选项可能涵盖所有内容。

    0 回复  |  直到 3 年前
        1
  •  1
  •   Jorj McKie    3 年前

    我已经用PyMuPDF做过很多次了。有几件事需要注意:

    1. Textract无法识别任何字体,因此您必须决定插入哪种字体
    2. Textract提供线条和单词的收件箱,没有字体大小。您必须计算导致在输出时将文本拟合到(重新计算的)框中的值
    3. Textract坐标都在0和1之间。您需要原始页面维度来将Textract坐标转换为输出坐标。

    一旦您有了上述的解决方案(使用PyMuPDF使其变得相当简单),就可以使用 page.insert_text() 在具有渲染模式3的PyMuPDF中:这会导致文本不可见。

    对于以上第3点,请使用PyMuPDF矩形方法: matrix = fitz.Rect(0, 0, 1, 1).torect(page.rect) . 如果然后取一个Textract边界框,则用左上角坐标(x0,y0)和左下角坐标(x1,y1)制作一个与PyMuPDF兼容的矩形: textract_rect = fitz.Rect(x0, y0, x1, y1) 。然后下面会在输出页面上为您提供相应的对话框: bbox = textreact_rect * matrix .

    建议您使用字体Helvetica进行输出: font = fitz.Font("helv") .

    如果你有文本及其输出框,计算字体大小如下: textlen = font.text_length(text,fontsize=1) 如果fontsize为1,则获取输出长度。然后 bbox.width / textlen 应该给你一个字体大小的好值。

    下一个问题是插入点(需要 page.insert_text() ).

    bbox.bl (左下角)是一个很好的开始,但如果您的文本包含低于基线的字符(例如g、y等),则需要将插入点向上调整一点。使用 font.descender 并计算字体大小来计算这一点。