Это древний вопрос, но, поскольку pdf.js развивался на протяжении многих лет, я хотел бы дать новый ответ. То есть это можно сделать локально, без участия какого-либо сервера или внешнего сервиса. Новый pdf.js имеет функцию: page.getTextContent (). Вы можете получить текстовое содержание от этого. Я сделал это успешно с помощью следующего кода.
То, что вы получаете на каждом этапе, - это обещание. Вам нужно написать код таким образом: .then( function(){...})
, чтобы перейти к следующему шагу.
1) PDFJS.getDocument( data ).then( function(pdf) {
2) pdf.getPage(i).then( function(page){
3) page.getTextContent().then( function(textContent){
В итоге вы получите массив строк textContent.bidiTexts[]
. Вы объединяете их, чтобы получить текст 1 страницы. Координаты текстовых блоков используются для определения необходимости вставки новой строки или пробела. (Возможно, это не совсем надежно, но из моего теста все в порядке.)
Входной параметр data
должен представлять собой данные типа URL или ArrayBuffer. Я использовал функцию ReadAsArrayBuffer (файл) в FileReader
API для получения данных.
Надеюсь, это поможет.
Примечание: По словам какого-то другого пользователя, библиотека обновилась и привела к разрыву кода. Согласно комментарию async5 ниже, вам нужно заменить textContent.bidiTexts
на textContent.items
.
function Pdf2TextClass(){
var self = this;
this.complete = 0;
/**
*
* @param data ArrayBuffer of the pdf file content
* @param callbackPageDone To inform the progress each time
* when a page is finished. The callback function's input parameters are:
* 1) number of pages done;
* 2) total number of pages in file.
* @param callbackAllDone The input parameter of callback function is
* the result of extracted text from pdf file.
*
*/
this.pdfToText = function(data, callbackPageDone, callbackAllDone){
console.assert( data instanceof ArrayBuffer || typeof data == 'string' );
PDFJS.getDocument( data ).then( function(pdf) {
var div = document.getElementById('viewer');
var total = pdf.numPages;
callbackPageDone( 0, total );
var layers = {};
for (i = 1; i <= total; i++){
pdf.getPage(i).then( function(page){
var n = page.pageNumber;
page.getTextContent().then( function(textContent){
if( null != textContent.bidiTexts ){
var page_text = "";
var last_block = null;
for( var k = 0; k < textContent.bidiTexts.length; k++ ){
var block = textContent.bidiTexts[k];
if( last_block != null && last_block.str[last_block.str.length-1] != ' '){
if( block.x < last_block.x )
page_text += "\r\n";
else if ( last_block.y != block.y && ( last_block.str.match(/^(\s?[a-zA-Z])$|^(.+\s[a-zA-Z])$/) == null ))
page_text += ' ';
}
page_text += block.str;
last_block = block;
}
textContent != null && console.log("page " + n + " finished."); //" content: \n" + page_text);
layers[n] = page_text + "\n\n";
}
++ self.complete;
callbackPageDone( self.complete, total );
if (self.complete == total){
window.setTimeout(function(){
var full_text = "";
var num_pages = Object.keys(layers).length;
for( var j = 1; j <= num_pages; j++)
full_text += layers[j] ;
callbackAllDone(full_text);
}, 1000);
}
}); // end of page.getTextContent().then
}); // end of page.then
} // of for
});
}; // end of pdfToText()
}; // end of class