San*_*Lee 7 javascript pdf callback pdf.js es6-promise
我是ES6和Promise的新手.我正在尝试pdf.js将pdf文件的所有页面中的文本提取到字符串数组中.提取完成后,我想以某种方式解析数组.说pdf文件(通过typedarray正确传递)有4页面,我的代码是:
let str = [];
PDFJS.getDocument(typedarray).then(function(pdf) {
for(let i = 1; i <= pdf.numPages; i++) {
pdf.getPage(i).then(function(page) {
page.getTextContent().then(function(textContent) {
for(let j = 0; j < textContent.items.length; j++) {
str.push(textContent.items[j].str);
}
parse(str);
});
});
}
});
Run Code Online (Sandbox Code Playgroud)
它设法工作,但是,当然,问题是我的parse功能被称为4时间.我只想parse在完成所有4页提取后才打电话.欢迎任何建议.请点亮我.
asy*_*nc5 13
与/sf/answers/2834581361/类似- 使用Promise.all收集页面承诺,不要忘记链接然后:
function gettext(pdfUrl){
var pdf = PDFJS.getDocument(pdfUrl);
return pdf.then(function(pdf) { // get all pages text
var maxPages = pdf.pdfInfo.numPages;
var countPromises = []; // collecting all page promises
for (var j = 1; j <= maxPages; j++) {
var page = pdf.getPage(j);
var txt = "";
countPromises.push(page.then(function(page) { // add page promise
var textContent = page.getTextContent();
return textContent.then(function(text){ // return content promise
return text.items.map(function (s) { return s.str; }).join(''); // value page text
});
}));
}
// Wait for all pages and join text
return Promise.all(countPromises).then(function (texts) {
return texts.join('');
});
});
}
// waiting on gettext to finish completion, or error
gettext("https://cdn.mozilla.net/pdfjs/tracemonkey.pdf").then(function (text) {
alert('parse ' + text);
}, function (reason) {
console.error(reason);
});Run Code Online (Sandbox Code Playgroud)
<script src="https://npmcdn.com/pdfjs-dist/build/pdf.js"></script>Run Code Online (Sandbox Code Playgroud)
@ async5的版本更干净,并根据的最新版本进行了更新 "pdfjs-dist": "^2.0.943"
import PDFJS from "pdfjs-dist";
PDFJS.disableTextLayer = true;
PDFJS.disableWorker = true;
const getPageText = async (pdf: Pdf, pageNo: number) => {
const page = await pdf.getPage(pageNo);
const tokenizedText = await page.getTextContent();
const pageText = tokenizedText.items.map(token => token.str).join("");
return pageText;
};
export const getPDFText = async (source: PDFSource): Promise<string> => {
const pdf: Pdf = await PDFJS.getDocument(source).promise;
const maxPages = pdf.numPages;
const pageTextPromises = [];
for (let pageNo = 1; pageNo <= maxPages; pageNo += 1) {
pageTextPromises.push(getPageText(pdf, pageNo));
}
const pageTexts = await Promise.all(pageTextPromises);
return pageTexts.join(" ");
};
Run Code Online (Sandbox Code Playgroud)
如果有人需要,这是我使用的相应的打字稿声明文件。
declare module "pdfjs-dist";
type TokenText = {
str: string;
};
type PageText = {
items: TokenText[];
};
type PdfPage = {
getTextContent: () => Promise<PageText>;
};
type Pdf = {
numPages: number;
getPage: (pageNo: number) => Promise<PdfPage>;
};
type PDFSource = Buffer | string;
Run Code Online (Sandbox Code Playgroud)
这是一个较短(不一定更好)的版本:
async function getPdfText(data) {
let doc = await pdfjsLib.getDocument({data}).promise;
let pageTexts = Array.from({length: doc.numPages}, async (v,i) => {
return (await (await doc.getPage(i+1)).getTextContent()).items.map(token => token.str).join('');
});
return (await Promise.all(pageTexts)).join('');
}
Run Code Online (Sandbox Code Playgroud)
这里,data是一个字符串或缓冲区(或者您可以将其更改为采用 url 等)。