首页 > 解决方案 > Google Vision API - OCR - 单独的段落/行问题(Java)

问题描述

我们在一个项目中使用 Vision API,我们遇到了一个关于从 PDF 文件中识别文本的问题。Vision API 将不同的行识别为段落。它们是劣等线。像这样:

1. Header

Company Name
Company Address
Telephone: +90 222 111 22 33
Fax: +90 222 1112233

Vision API 将第一行识别为一个段落。没关系,我们想要它。但它也将其他 4 行识别为 1 段。我们希望他们一行一行。我们能做什么?

并感谢您的关注!

标签: javapdfgoogle-cloud-platformocrgoogle-cloud-vision

解决方案


如果您没有在 Google 返回的文本中看到嵌入的换行符,那么您可以通过 Word 和 Symbol(即字符)对象向下遍历段落结构的内容,并检查每个对象上是否存在属性符号,即在符号之后检测到的中断。您可以区分换行符和其他类型的换行符,并在换行符的末尾拆分段落的行。

粗略地说,如果您要在 Clojure 中执行此操作,它看起来像:

(def space-breaks #{(.getNumber TextAnnotation$DetectedBreak$BreakType/SURE_SPACE)
                    (.getNumber TextAnnotation$DetectedBreak$BreakType/SPACE)
                    })

(def line-breaks #{(.getNumber TextAnnotation$DetectedBreak$BreakType/EOL_SURE_SPACE)
                   (.getNumber TextAnnotation$DetectedBreak$BreakType/LINE_BREAK)})


(defn get-paragraph-text [paragraph]
  (let [words (.getWordsList paragraph)
        symbols (mapcat #(getSymbolsList %) words)
        sb (StringBuilder.)]
    (reduce (fn [last-break next-symbol]
              (let [sym (.getText  next-symbol)]
                (cond (line-breaks last-break) (do (.append sb "\n") (.append sb sym))
                      (space-breaks last-break) (do (.append sb " ") (.append sb sym))
                      :else (.append sb sym))
                (when (.hasProperty next-symbol)) 
                  (.getNumber (.getType (.getDetectedBreak (.getProperty next- symbol)))))))
             nil symbols)
    (clojure.string/split (str sb) #"\n")))

这将产生一系列字符串,每行一个。


推荐阅读