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