我是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);
});
});
}
});
它可以正常工作,但是,当然,问题是我的parse
函数被调用了4
次。我只想在所有4页提取完成后调用parse
。
6条答案
按热度按时间sr4lhrrt1#
类似于https://stackoverflow.com/a/40494019/1765767--使用Promise.all收集页面promise,不要忘记链接then's:
zy1mlcev2#
更干净的@async5版本,并根据最新版本的
"pdfjs-dist": "^2.0.943"
进行了更新这是相应的typescript声明文件,如果有人需要,我已经使用了它。
如何从具有缓冲区的文件(从节点类型)获取PDFSource的示例:
vkc1a9a23#
以下是一个更短(不一定更好)的版本:
在这里,
data
是一个字符串或ArrayBuffer
(或者你可以把它改为url等)。因此,只需导入pdf.js:
然后像这样使用它:
eni9jsuy4#
下面是另一个基于其他答案的
await
和Promise.all
的Typescript版本:d8tt03nd5#
如果您使用
PDFViewer
组件,下面是我的解决方案,它不涉及任何promise或异步:dkqlctbz6#
我也不知道该怎么做,但多亏了async5,我做到了。我复制了他的代码,并将其更新为新版本的pdf.js。我做了最小的更正,也采取了自由,没有分组到一个单一的字符串所有的网页。此外,我使用了一个正则表达式,它删除了PDF不幸最终创建的许多空格(它不能解决所有情况,但绝大多数情况)。我这样做的方式应该是大多数人都会感到舒适的工作方式,但是,请随时删除正则表达式或进行任何其他更改。