node.js - 通过 Nodejs Express Server 检索时生成的 SSRS PDF 返回空白

标签 node.js pdf express reporting-services

老读者,第一次海报。

我正在尝试从 SSRS 生成一个 PDF 文件并将其提供给最终用户,中间有一个 NodeJS 服务器 (Express) 作为服务层。我们不想向用户公开任何与 SSRS 相关的内容,因此我让 Node 服务器将链接放在一起并向服务器发出获取请求。

问题是,我可以通过 SSRS 的响应正文获取 PDF 并将其传递到 HTML 页面,但尽管页数和文件大小正确,但文件完全空白。即使我将数据写入文件作为测试也会发生这种情况。

在网络浏览器中使用 POSTMAN 或 curl 时,或从 Chrome 执行直接 GET 请求时,它会成功加载文件作为附件且没有正文。然而,当我通过 Node 执行相同的获取请求时,我得到一个 header ,声称有一个附件以及一个包含 PDF 代码的正文,我只能想象它在到达我的 Node 服务器时被转换为 utf-8 编码。因为报告是通过 SSRS 生成的,所以我不能使用 express 的 response.download() 或类似的功能,因为在生成 PDF 之前我没有确切的路径。

让事情变得更复杂,我不得不依赖于限制在 http-ntlm library 中的请求首先从我们的 SSRS 服务器获得响应,因此据我所知,管道和类似方法对我来说不可用。我选择它主要是因为它允许我通过 http 而不是 https 访问 SSRS(我们的 SSRS 配置不提供对 https 的响应)。

Node 服务器函数:

exports.getReportPDF = function (req, resp)
{
//-Gets the link info from the client side
var myLink = req.body;
var fileLink = myLink.Data;

httpntlm.post({
    url: fileLink,
    username: 'username',
    password: 'password',
    workstation: 'workstation',
    domain: 'domain'
}, function (err, res){ //-Returns once the stream is complete
    if(err) return err;

    var resBase64 = new Buffer(res.body).toString('base64');
    resp.setHeader('Content-Type', 'application/octet-stream');
    resp.setHeader('Content-Transfer-Encoding', 'base64');

    fs.writeFile("somethingToCheckAgainst.pdf", resBase64, function(writeErr) {
     if(writeErr) {
            console.log(writeErr);
        } else {
            console.log("The file was saved!");
        }
    });
    console.log(resp.get('Content-Disposition'));
    resp.send(resBase64);
});

}

客户端功能 block :

xmlhttp.onreadystatechange = function()
{
    if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
        var results = xmlhttp.responseText;

        window.open("data:application/pdf;base64, " + results);
    }
}

这是一个快速而肮脏的原型(prototype),所以我不关心速度和困惑的代码,但更喜欢干净简单。如何让在新窗口中打开的 PDF 或在服务器上创建的 PDF 正确显示(不是完全空白)?这是 Node 与来自 SSRS 的数据交互的问题,还是由我处理数据的方式引起的?

最佳答案

我有一段时间遇到同样的问题。努力成为一个好公民,并在经过几天的故障排除后发布为我解决此问题的方法,因为答案似乎没有出现在互联网上的其他任何地方。

在 httpntlm.post 中,添加另一个选项 - “binary : true”。如果您不这样做,response.body 会自动转换为 UTF-8 字符串,这会损坏 PDF 并使其显示为空白。

关于node.js - 通过 Nodejs Express Server 检索时生成的 SSRS PDF 返回空白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30330435/

相关文章:

node.js - 如何从 Node.js 中的错误中获取行名和文件名?

node.js - 定义唯一关键的strongloop模型

html - 使用 dompdf (CSS) 将 html 固定为 pdf

javascript - 将 MongoDB 数据传递给 ExpressJS 中的 Jade View

javascript - 我如何将 gulp 与磁带一起使用?

javascript - 从内部回调分配变量

java - 您可以同时使用 iText 在 Java 中查看和编辑 PDF 吗?

Python将pdf转换为图像?

node.js - 为什么sequelize返回500 [object SequelizeInstance :Users] when connecting to express session?

javascript - 我如何处理错误然后立即脱离 promise 链?