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); } ・・・ }