我不确定我的错误在哪里,但我认为事件监听器被多次调用并多次解析文件。
我在目录中有五个文件,它们正在被解析。但是,带有数组0的pdf文件将被解析一次,下一个被解析两次,第三次被解析三次。
我希望解析目录中的每个文件,并通过从pdf中提取数据来创建文本文件。
理念是解析pdf获取内容为文本,并以特定格式将文本转换为json。
为简单起见,计划是首先完成一项任务,然后使用以下代码的输出来执行下一项任务。
希望任何人都可以提供帮助并指出我哪里出错了,并解释一下我的错误,所以我明白了。 (JS和节点新手)
此致 洁
使用此处的模块: https://github.com/modesty/pdf2json
var fs = require('fs')
PDFParser = require('C:/Users/Administrator/node_modules/pdf2json/PDFParser')
var pdfParser = new PDFParser(this, 1)
fs.readdir('C:/Users/Administrator/Desktop/Project/Input/',function(err,pdffiles){
//console.log(pdffiles)
pdffiles.forEach(function(pdffile){
console.log(pdffile)
pdfParser.once("pdfParser_dataReady",function(){
fs.writeFile('C:/Users/Administrator/Desktop/Project/Jsonoutput/'+pdffile, pdfParser.getRawTextContent())
pdfParser.loadPDF('C:/Users/Administrator/Desktop/Project/Input/'+pdffile)
})
})
})
答案 0 :(得分:0)
正如评论中所提到的,只是为OP提供“解决方法”的想法,以暂时解决此问题。
假设性能不是问题,那么您应该能够在顺序问题中异步解析pdf文件。也就是说,只有在完成第一个文件时才解析下一个文件。
不幸的是我之前从未使用过npm模块PDFParser
所以我很难尝试下面的代码。请原谅我,因为它可能需要一些小的调整才能使它工作,从语法上讲它们应该没问题,因为它们是用IDE编写的。
示例:强>
var fs = require('fs');
PDFParser = require('C:/Users/Administrator/node_modules/pdf2json/PDFParser');
var parseFile = function(files, done) {
var pdfFile = files.pop();
if (pdfFile) {
var pdfParser = new PDFParser();
pdfParser.on("pdfParser_dataError", errData => { return done(errData); });
pdfParser.on("pdfParser_dataReady", pdfData => {
fs.writeFile("'C:/Users/Administrator/Desktop/Project/Jsonoutput/" + pdfFile, JSON.stringify(pdfData));
parseFile(files, done);
});
pdfParser.loadPDF('C:/Users/Administrator/Desktop/Project/Input/' + pdfFile);
}
else {
return done(null, "All pdf files parsed.")
}
};
fs.readdir('C:/Users/Administrator/Desktop/Project/Input/',function(err,pdffiles){
parseFile(pdffiles, (err, message) => {
if (err) { console.error(err.parseError); }
else { console.log(message); }
})
});
在上面的代码中,我将解析逻辑分离出一个名为parseFile
的独立函数。在这个函数中,它首先检查是否还有要处理的文件,如果没有,则调用回调函数done
否则它将执行array.pop
操作以获取队列中的下一个文件开始解析它。
解析完成后,它会递归调用parseFile
函数,直到解析完最后一个文件。