node.js - 错误: PDFDocument: stream must have data

标签 node.js pdf hapi.js pdf.js

我正在使用 pdf.js 来解析 pdf 文件。首先我上传文件,然后尝试解析该文件。我将 url 传递给解析函数以在 PDFJS.getDocument(url) 中读取它

如果我不使用上传部分并对 pdf 文件的 URL 进行硬编码,它就可以工作。

代码:

var parse = function(payload,callback){
            var data = payload;
            if(data.file){
                var name = data.file.hapi.filename;
                var ext = name.split('.');
                var extension = ext[1];
                if(extension == "pdf"){
                    var path = __dirname + "/uploads/" + name;
                    checkFileExist();
                    var file = fs.createWriteStream(path);
                    file.on('error', function (err) { 
                        console.error(err) 
                    });
                    data.file.pipe(file);
                    var fileName = data.file.hapi.filename;
                    console.log(fileName);
                    var fileAbsolutepath = __dirname + "/uploads/" + fileName ;
                    console.log(fileAbsolutepath);
                    var parser = script.pdfParser(fileAbsolutepath,function(err,resp){
                        if(err){
                            callback(err);
                        }
                        else {
                            callback(resp);
                        }
                    })
                    callback(JSON.stringify(fileName));
                }
                else{
                    console.log("Invalid fileType");
                    callback(JSON.stringify("Invalid FileType"));
                }  
            }
}

var checkFileExist = function() {
    var path = __dirname + '/uploads';
    fs.exists(path, function(exists) {
        if (exists === false) fs.mkdirSync(path);
    });
};


exports.pdfParser = function(url,callback){
PDFJS.workerSrc = 'pdf.worker.js';

PDFJS.getDocument(url).then(function (pdf) {
    var pdfDocument = pdf;
}}

文件已正确上传,上传文件夹中的文件大小符合预期,但我仍然收到错误:“错误:PDFDocument:流必须有数据”

最佳答案

要使用 pdf.js 解析文件,而不是使用 PDFJS.getDocument 加载文件,请尝试将 pdf 文件转换为 arrayBufferUint8Array ,并用它来创建一个新的 LocalPdfManager目的。然后就可以直接调用LocalPdfManager的方法来解析pdf了。

类似这样的事情:

import { LocalPdfManager } from 'pdfjs-dist/lib/core/pdf_manager';

pdfManager = new LocalPdfManager(1, arrayBuffer, '', {}, '');
// parameters = (docId, data, password, evaluatorOptions, docBaseUrl)
pdfManager.ensureDoc('parseStartXRef', []); // [] = arguments
pdfManager.ensureDoc('parse', false); // false = recoveryMode
pdfManager.ensureDoc('numPages');
pdfManager.ensureDoc('fingerprint');

然后查看pdfManager.pdfDocument以获取已解析的pdf数据。

例如,主“/Catalog”条目将位于 pdfManager.pdfDocument.catalog.catDict 中。

我已经使用这种方法在浏览器本地成功解析和修改pdf文件。我还没有在带有 Node.js 的服务器上尝试过它,但我希望它应该能正常工作。

关于node.js - 错误: PDFDocument: stream must have data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47803028/

相关文章:

ios - .NET Streamed PDF 无法在移动浏览器中打开

javascript - NPM 模块 "deasync"无法使用 Hapi JS 进行 MySQL 获取

javascript - 在带有 jade 模板的 Express.js 中使用公开的对象作为值或助手?

json - Node.js 将大型 Xml 文件的 Xml 转换为 JSON 的示例

java - 如何使用 jasper/jrxml 创建如图所示的 pdf 目录?

javascript - PyPDF2使用addJS添加汉字注释时的解码问题

node.js - express 的 hapi request.state 的等效部分是什么?

plugins - 全局访问插件 hapijs

node.js - 使用 Express 进行外部获取请求

c++ - 是否可以直接在本地 C++ 应用程序和远程浏览器之间连接