0.1.0 • Published 2 years ago

pdf2tree v0.1.0

Weekly downloads
-
License
UNLICENSED
Repository
github
Last release
2 years ago

pdf2tree

Parse PDF and group elements based on enclosing lines. A node.js module that promisifies the pdf2json parser and structures the data in a way that is suitable for tables with merged cells.

How to use

After installing node.js you can use npm to add pdf2tree in your project folder.

npm install pdf2tree

When you create a new parser object as shown below, parameters are passed to the pdf2json parser.

import PDF2Tree from 'pdf2tree'
let pdf2tree = new PDF2Tree()

Then you can set the following pdf2tree specific parameters.

pdf2tree.maxStrokeWidth = 1
pdf2tree.maxGapWidth = 0.1

Finally, parsing can start either with a filepath or a buffer.

pdf2tree.loadPDF(PDFpath)
pdf2tree.parseBuffer(PDFbuffer)

The promise returns a JSON object as documented in pdf2json, but adds an additional Tree property. To simplify readability <str> represents an object like the ones pdf2json provides for every Page but each object only contains all elements within the lines, i.e. { ..., Texts: [ { x, y, ..., R: [ { T: 'str', ... } ] } ], ... }.

{
  ...
  Tree: [
    [
      <Page 1>,
      [
        [ <A>, <B>, <C>, <D> ],
        [ <X>, <1>, <2>, <3> ],
        [ 
          <Y>,
          [
            [ <5>, <6>, <7> ],
            [ <8>, <9> ],
          ]
        ]
      ]
    ],
    [
      <Page 2>,
      [
        [ <TITLE> ],
        [
          <Z>, 
          [
            [
              <F>,
              <G>,
              [
                [ <H> ],
                [ <I> ],
              ],
            ],
            [ <J>],
            [ <K>]
          ],
          <?>
        ]
      ]
    ]
  ]
}

For content structured like this:

Page 1

+---+---+---+---+
| A | B | C | D |
+---+---+---+---+
| X | 1 | 2 | 3 |
+---+---+---+---+
|   | 5 | 6 | 7 |
| Y +---+---+---+
|   | 8 |   9   |
+---+---+-------+

Page 2

+---+---+---+---+
|     TITLE     |
+---+---+---+---+
|   |   |   | H |
|   | F | G +---+
|   |   |   | I |
| Z +---+---+---+
|   | J |       |
|   +---+   ?   |
|   | K |       |
+---+---+-------+

If a cell is not rectangular or merges rows that the cell to the left did not also merge are not supported. This would require a data structure that allows traversing the neighborhood with .right or .below and can include loops for non-rectangular areas. It should be easier to fix those special cases after the parsing.

0.1.0

2 years ago