Pdf.js машинопись: PDF читать текст, включая пустые / пустые области, поскольку они имеют значение в этом контексте, то есть выписки из банков - PullRequest
0 голосов
/ 04 ноября 2019

Я использую реагирование с машинописью, а также pdfjs-dist v2.2

Я могу читать данные из pdf без проблем. Меня интересуют пустые ячейки, так как я хочу преобразовать pdfв текст, а затем в CSV-файл, который, в свою очередь, будет использоваться для заполнения таблицы для отображения информации. перепробовал все варианты, которые я могу придумать, пожалуйста, помогите

мой текущий код:

import React, {Component } from 'react';
import pdfjs from 'pdfjs-dist';
import pdfjsWorker from 'pdfjs-dist/build/pdf.worker.entry';
import _ from 'lodash'


pdfjs.GlobalWorkerOptions.workerSrc = pdfjsWorker;


function pdfToPlainText(pdfData) {
  console.log(pdfData, "pdfData")
  //pdfjs.disableWorker = true;
  var pdf = pdfjs.getDocument(pdfData)
  console.log(pdf, "pdf")
  pdf.promise.then(getPages);
}

function getPages(pdf) {
  //console.log(pdf, "pdf")
  for (let i = 1; i <= pdf.numPages; i++) {
    if(i <= pdf.numPages){
      pdf.getPage(i).then((p)=>{
        //console.log(p, "p")
       getPageText(p)
      })
    } 
  }
}

function getPageText(page){
  page.getTextContent({normalizeWhitespace: false, disableCombineTextItems: false})
  .then(function(textContent) {
    console.log(textContent, "textContent")
    var textItems = textContent.items;
    console.log(textItems, "textContent Items")
    var pageTextArray =[]
    //var pageTextOrderdedArray =[]
    var PageTextString = ""
    //var arrayStrings = []


    textItems.forEach((el)=>{
      console.log(el, "el" )
      pageTextArray.push(el.str);
      console.log(pageTextArray,"pageTextArray" )
      PageTextString = pageTextArray.toString()
      // console.log(PageTextString,"PageTextString" )
    })

    sortPageTextToArray(PageTextString)
  });
}

function sortPageTextToArray(pagetextString){
  console.log(pagetextString, "pagetextString")
}

function exstractTable(page){

}

export default class PfdConverter extends Component {

  GetPdfFromInput(){
    return <input type="file" name="" id="" onChange={(e)=> {
      console.log(e.target.files, "e")
      var file = e.target.files && e.target.files[0];
      if(file!== null){

        var fileReader = new FileReader();  

        fileReader.onload = function() {
          console.log(fileReader.result, "fileReader")
          pdfToPlainText(fileReader.result)
        }
        fileReader.readAsArrayBuffer(file)
      }
    }}/>
  }




  render() {
    return (
      <div>
        {this.GetPdfFromInput()}
      </div>
    )
  }
}

РЕДАКТИРОВАТЬ 1

import React, {Component } from 'react';
import pdfjs from 'pdfjs-dist';
import pdfjsWorker from 'pdfjs-dist/build/pdf.worker.entry';

pdfjs.GlobalWorkerOptions.workerSrc = pdfjsWorker;

interface iColAndTexts{
  nrCols:number
  texts:string[]
  yPoints: number[]
}
interface NamedDictionary<T>
{
    [v:string]:T        
}

interface itext{str:string,width:number,transform:number[]}

function pdfToPlainText(pdfData) {
  console.log(pdfData, "pdfData")
  //pdfjs.disableWorker = true;
  var pdf = pdfjs.getDocument(pdfData)
  console.log(pdf, "pdf")
  pdf.promise.then(getPages);
}


function getPages(pdf) {
  //console.log(pdf, "pdf")
  for (let i = 1; i <= pdf.numPages; i++) {
    if(i <= pdf.numPages){
      pdf.getPage(i).then((p)=>{
        //console.log(p, "p")
       getPageText(p)
       //tryMe(p)
      })
    } 
  }
}


function getPageText(page){
  page.getTextContent({normalizeWhitespace: false, disableCombineTextItems: false})
  .then(function(textContent) {
   // console.log(textContent, "textContent")
   var textItems:itext[] = textContent.items;
   // console.log(textItems, "textContent Items")

    const popColumn=(d:NamedDictionary<iColAndTexts>,getX:(i:itext)=>number,t:itext, getY:(i:itext)=>number)=>{
      var use = Math.round(getX(t)/3)*3 
      var useY = Math.round(getY(t)/1)*1
      if(!d[use])
      {
        d[use]={ nrCols:0, texts:[], yPoints:[]} as iColAndTexts;
      }
     let colinfo= ( d[use]);
     colinfo.nrCols+=1;
     colinfo.texts.push(t.str);
     colinfo.yPoints.push( useY )
    }

    const popRows=(d:NamedDictionary<iColAndTexts>,getX:(i:itext)=>number,t:itext)=>{
      var use = Math.round(getX(t)/3)*3 
      if(!d[use])
      {
        d[use]={ nrCols:0, texts:[]} as iColAndTexts;
      }
     let colinfo= ( d[use]);
     colinfo.nrCols+=1;
     colinfo.texts.push(t.str);
    }


    var colsLeft:NamedDictionary<iColAndTexts> = {};
    var colsRight:NamedDictionary<iColAndTexts> = {};
    var rows: NamedDictionary<iColAndTexts> = {}
    var x=4,y=5;
    textItems.forEach(t=>{
      popColumn(colsLeft,(t)=>t.transform[x],t,(t)=>t.transform[y] )
      popColumn(colsRight,(t)=>t.transform[x]+t.width,t, (t)=>t.transform[y])
      popRows(rows,(t)=>t.transform[y],t)
    })
    console.log('colsLeft',colsLeft);
    console.log('colsRight',colsRight);
    console.log('rows',rows);



    //first block on test
  });
}

export default class PfdConverter extends Component {

  GetPdfFromInput(){
    return <input type="file" name="" id="" onChange={(e)=> {
      console.log(e.target.files, "e")
      var file = e.target.files && e.target.files[0];
      if(file!== null){

        var fileReader = new FileReader();  

        fileReader.onload = function() {
          console.log(fileReader.result, "fileReader")
          pdfToPlainText(fileReader.result)
        }
        fileReader.readAsArrayBuffer(file)
      }
    }}/>
  }

  render() {
    return (
      <div>
        {this.GetPdfFromInput()}
      </div>
    )
  }
}

...