возникли проблемы при разборе данных, которые распространяются между страницами с помощью PdfReader в Nodejs - PullRequest
0 голосов
/ 14 июня 2019

Я поднял вопрос об этом на Github, который можно найти здесь .

В основном я повторю эту проблему здесь таким же образом.

до сих пор,использование этой библиотеки было действительно хорошим, но я столкнулся с проблемой.в основном у меня есть таблица, с которой я анализирую данные (не использую сейчас pdfreader.TableParser), которая разбита на две страницы.

когда я анализирую каждую страницу, я использую логику, которая находит заголовок заголовкачтобы определить, где он начинается, и заголовок следующей таблицы, чтобы определить, где он заканчивается.

Если я не могу проанализировать обе страницы, я не могу получить все данные из таблицы.

измое понимание, я перебираю каждую страницу в моем коде ниже.Я был бы рад любым предложениям, так как я вроде как здесь преодолел препятствия.

пожалуйста, обратите внимание, что я использую Serverless Framework и вызываю его таким образом;извините, если это ни для кого не повторится.

код :

function getNextIndexItem(rows, num, currentItem) {
  /*
  get the item that appears next in the array passed into the rows param.
  param rows: array of rows parsed on the page
  param num: number of indexes past the current index (currentItem)
  param currentItem: the index of the current item in the array
  */ 
  let keys = Object.keys(rows);
  let nextIndex = keys.indexOf(currentItem) + num;
  let nextItem = keys[nextIndex];
  let nextField = (rows[nextItem] || []).join(' ');
  let finalStr = nextField.split(':')[nextField.split(':').length-1];

  return finalStr;
}

function pdfReader(pdfFilePath, parsedData, callback) {
  const pdfreader = require("pdfreader");

  let rows = {}; // indexed by y-position
  let tableIndexes = 0;

  new pdfreader.PdfReader().parseFileItems(pdfFilePath, (err, item) => {
    if (err) callback(err);

    if (item) {
      if (item.page) {
        // end of file, or page
        Object.keys(rows) // => array of y-positions (type: float)
          .sort((y1, y2) => parseFloat(y1) - parseFloat(y2)) // sort float positions
          .forEach(yValue => {
            // rows[y] is an array of text for a line.
            let line = (rows[yValue] || []).join('');  // construct line of text

            if (line.includes('Table Name')) {
              tableIndexes = 0;
              for (let i = 0; i < 500; i++) {
                if (getNextIndexItem(rows, i, yValue).includes('Next Table Name')) {
                  tableIndexes = i;  // get index of last table row
                  break;
                }
            }
            for (let i =2; i < tableIndexes; i++) {  // start at 2 to avoid the heading row of the table
              console.log(`List row #${i}: ${getNextIndexItem(rows, i, yValue)}`);
            }
          });
        rows = {}; // clear rows for next page
      } else if (item.text) {
        if (!rows[item.y]) {
          rows[item.y] = [];
        }
        rows[item.y].push(item.text);
      }
    } else {
      // we're done here
      callback(parsedData);
    }
  });
};

module.exports.test = function() {
  pdfReader('doc.pdf', (err, data) => {
    if (err) console.log(err);
  });
}

вот таблица в PDF: enter image description here

...