pdfjs:pdfからtextをplaintextとして抽出

1.目的
・ブラウザからpdfのtextをplaintextとして抽出する

2.ライブラリ
・mozillaのpdfjs v2.13.216

# wget https://github.com/mozilla/pdf.js/releases/download/v2.13.216/pdfjs-2.13.216-dist.zip

3.pdfjsの課題
・getTextContentでplaintextは取り出せるが、取り出し順序が、書き出し順になる
【理由】編集すると、変更した箇所が、複数纏まってlistの後ろに側に移動する

4.sort() メソッドで並び替え
・Array.prototype.sort()
・データ形式

 let obj = {"str":textItem.str,
            "x":parseInt(tx[4]),
            "y":parseInt(tx[5])
           };

・y,x 座標でsortし、上からと左からの順に出力する

finalObj.sort(compareY).sort(compareX);

5.ソート順を定義する比較関数
・y座標用

function compareY( a, b ){
  if( a.y < b.y ){ return -1; }
  if( a.y > b.y ){ return 1; }
  return 0;
}

・x座標用

function compareX( a, b ){
  if( a.y != b.y ) { return 0; }
  if( a.x < b.x ) { return -1; }
  if( a.x > b.x ) { return 1; }
  return 0;
}

6.x , y 座標
・Util.transformで求める

let tx = Util.transform(viewport.transform, textItem.transform);

x = tx [ 4 ] , y = tx [ 5 ];

7.code
・抽出側

function getPageText(pageNum, PDFDocumentInstance) {

   return new Promise(function (resolve, reject) {
      PDFDocumentInstance.getPage(pageNum).then(function (pdfPage) {

         pdfPage.getTextContent({ normalizeWhitespace: true }).then(function (textContent) {

            const scale = 1.0;
            const viewport = pdfPage.getViewport({ scale: scale });
            const Util = window.pdfjsLib.Util;

            let finalObj = [];
            let obj,tx;

            textContent.items.forEach(function (textItem) {

              tx = Util.transform(viewport.transform, textItem.transform);

                obj = {"str":textItem.str,
                     "x":parseInt(tx[4]),
                     "y":parseInt(tx[5])
                };
                finalObj.push(obj);
             });

            finalObj.sort(compareY).sort(compareX);

         let finalString = [];
         for (let k = 0; k < finalObj.length; k++) {
             finalString.push( finalObj[k].str);
         }

            resolve(finalString);
         });
      });
   });

   function compareX( a, b ){
      if( a.y != b.y ) { return 0; }
      if( a.x < b.x ) { return -1; }
      if( a.x > b.x ) { return 1; }

      return 0;
   }

   function compareY( a, b ){
      if( a.y < b.y ){ return -1; }
      if( a.y > b.y ){ return 1; }

      return 0;
   }

}

・呼び出し側

async function api_analysisPdfText(pdf) {

   const pagesPromises = [];

   for (let i = 0; i < pdf.numPages; i++) {
      const rows = await getPageText(i+1, pdf);

      pagesPromises.push(rows);

   }

・・・
}