java - 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 段。我们希望他们一行一行。我们能做什么?
并感谢您的关注!
解决方案
如果您没有在 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")))
这将产生一系列字符串,每行一个。
推荐阅读
- javascript - 如果 Google 应用程序脚本中省略了 var/const,我的 getter 会执行什么?
- python - 如何在 itertools.accumulate 中使用初始参数?
- python - 如何从购物车中获取总商品
- kubernetes - 如何从我的本地机器访问 minikube(安装在远程 VM 上)?
- c++ - 试图理解和使用头文件
- javascript - Javascript 中的事件循环有哪些内容?
- vhdl - VHDL-2008 Testbench:从设计的不同层次结构级别调用程序的最佳方式?
- sql - SQL 联接和子查询
- math - 沿直线 abc 的变量求三角形的面积
- javascript - 警告:无法从不同组件的函数体内更新组件。(反应原生)