通过用户定义的区域(pdfjs,DOMRect和Matrix)从PDF中提取文本

时间:2019-05-08 07:00:11

标签: javascript node.js pdf matrix pdfjs

我们有一个应会自动导入的应用,例如从PDF文件订购数据。用户可以创建一个模板,在其中可以在PDF上的区域周围绘制框,以用于以后需要提取的文本。

现在,我在浏览器中通过pdfjs渲染PDF,让用户在PDF(DIV)上绘制框,然后将结果与具有DOMRect属性的数据库保存在一起(使用getBoundingClientRect())。

PDFjs还提供了它解析的每个文本对象的几何数据,但转换数据是3x3矩阵。现在我的问题是,我不了解如何从用户定义区域和PDFjs 3x3矩阵正确计算坐标,因此在通过服务器端的Node处理它们时它们会匹配。

我尝试了几项未能带来所需结果的事情。 第一种方法仍然是使用PHP的PDF解析库,但是由于它没有提供任何位置数据,我很快就放弃了它。

然后我继续使用Node和PDFjs,这导致了用PDFjs文本对象矩阵计算用户定义的框的问题。

昨天,我尝试使用jsdom库基本上创建了一个虚拟dom,并只是使用用户定义的数据检查了呈现的文本层对象。它有点奏效,但是以某种方式在普通浏览器中位置匹配就很好了,使用jsdom方法,我看到了不同的结果。我怀疑jsdom本身可能是原因,因为它不是真正的渲染引擎,因此它可能会失真或无法提供普通浏览器中的某些内容。

我想到的另外两个选择是完全处理客户端上的数据导入,或者使用pupeteer。

但是在我这样做之前,我想问一下是否有一种更简单的方法,并且只是根据用户定义的区域(x,y,w,h)和3x3矩阵正确地计算位置数据。我的数学并不是很出色。 :D

PDFjs中的典型文本对象如下所示:

{ 
  "str": "Textstring", 
  "dir": "ltr", 
  "width": 71.24220000000001, 
  "height": 20.04, 
  "transform": [20.04, 0, 0, 20.04, 58.584, 804.24], 
  "fontName": "Helvetica" 
}

用户定义的数据如下所示:

{
  "x": 274,
  "y": 397,
  "width": 140,
  "height": 83,
  "top": 397,
  "right": 414,
  "bottom": 480,
  "left": 274
}

预期结果应该是PDFjs文本对象和用户定义区域的位置数据可以一起用于计算用户定义区域是否与PDFjs文本对象相交。通过某种方式将3x3矩阵转换为实际的x,y,w,h坐标,或者将用户定义的x,y,w,h坐标转换为3x3矩阵。

0 个答案:

没有答案