【问题标题】:Node Cannot pipe pdf response节点无法通过管道传输 pdf 响应
【发布时间】:2015-03-31 22:48:30
【问题描述】:

尝试编写一个测试 (mocha) 来检查从我的 api 端点返回的 PDF 是否包含正确的数据并且看起来应该是正确的。 PDF 在服务器上生成。手动命中端点时它返回“正确”,但想编写一些测试。我将一个示例“正确”PDF 上传到我的测试套件中,我可以使用鹰嘴豆泥 js 对其进行解析并提取必要的方面进行比较。

我想向我的端点(使用超级代理)发出请求,然后将响应(pdf)通过管道传输到临时 pdf 中。然后我会解析这两个 PDF(上传的完美的和从我的端点返回的)并确保它们匹配。

我的请求代码:

    it('Should look like the proposed pdf', function (done) {

        request(app)
           .get(url) //var that sets the path earlier
           .expect(200)
           .end(function (err, res) {
               if(err) return done(err); 

               var writeStream = fs.createWriteStream('./test/materials/tmp.pdf');
               writeStream.pipe(res); //ERROR can't pipe
               writeStream.on('end', function() {
                   console.log('complete');
                   done();
                })
          });

      });

当我运行测试时,我得到:未捕获的错误:无法管道。不可读。我对节点很陌生,所以我不确定是什么导致了错误。当我安慰 res 时,我得到一个大的二进制编码的混乱,所以也许这就是问题所在?我尝试了几件事 - 使用鹰嘴豆泥 pdfWriter,尝试使用

进行解码

新缓冲区(res,'base64')

等等......但仍然没有运气。我相信我已经为这些操作安装了所有必要的软件包,这似乎是一个管道/解码/超级代理问题。感谢您的帮助!

编辑:我误解了管道。您可以简单地将响应写入文件:

fs.writeFile('./test/materials/test_tmp.pdf', new Buffer(res.text, 'ascii'));

在这种情况下转换为 ascii。我现在更近了,但仍然挂在编码片上。这将创建一个空白 PDF。当我以崇高的方式观察文件内容时,它们似乎与我要比较的 PDF 相同,但编码不同。有人知道如何匹配原始 PDF 的编码或弄清楚它是如何编码的吗?或者如果这甚至是可能的?我使用 PDFkit 构建 PDF。

【问题讨论】:

    标签: node.js pdf encoding superagent node-pdfkit


    【解决方案1】:

    我不认为(或不知道)有一种方法可以原生地做到这一点。如果您愿意使用其他模块,请联系look at pdfkit

    你可以做类似的事情

    var pdf = new PDFDocument;  
    pdf.pipe(fs.createWriteStream('./test/materials/tmp.pdf'));  
    

    编辑
    抱歉,我读错了你的问题。该模块有一些例子。例如,就在他们的文档中 -

    PDFDocument = require 'pdfkit'
    
    # Create a document
    doc = new PDFDocument
    
    # Pipe it's output somewhere, like to a file or HTTP response
    # See below for browser usage
    doc.pipe fs.createWriteStream('output.pdf')
    
    # Embed a font, set the font size, and render some text
    doc.font('fonts/PalatinoBold.ttf')
       .fontSize(25)
       .text('Some text with an embedded font!', 100, 100)
    
    # Add another page
    doc.addPage()
       .fontSize(25)
       .text('Here is some vector graphics...', 100, 100)
    
    # Draw a triangle
    doc.save()
       .moveTo(100, 150)
       .lineTo(100, 250)
       .lineTo(200, 250)
       .fill("#FF3300")
    
    # Apply some transforms and render an SVG path with the 'even-odd' fill rule
    doc.scale(0.6)
       .translate(470, -380)
       .path('M 250,75 L 323,301 131,161 369,161 177,301 z')
       .fill('red', 'even-odd')
       .restore()
    
    # Add some text with annotations
    doc.addPage()
       .fillColor("blue")
       .text('Here is a link!', 100, 100)
       .underline(100, 100, 160, 27, color: "#0000FF")
       .link(100, 100, 160, 27, 'http://google.com/')
    
    # Finalize PDF file
    doc.end()
    

    【讨论】:

    • 嗨贾斯汀,感谢您的回复。在返回之前,我实际上使用 pdfkit 在服务器上构建了 pdf。来自超级代理请求的响应现在从先前构建的 pdf 返回二进制数据。我现在要做的是将所有响应数据通过管道传输到另一个 pdf 文档中,而不是使用 pdfkit 方法来重建它(解码和管道传输的数据应该能够构建 pdf)。我的问题是处理响应对象以及如何管道它。一旦我将它导入新文档,我就可以与手动上传的 pdf 文件进行比较,以检查它们是否匹配。
    猜你喜欢
    • 2011-05-03
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    • 1970-01-01
    相关资源
    最近更新 更多