Я поднял вопрос об этом на 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: