2013-04-23 2 views
1

사용자가 프런트 엔드의 버튼을 클릭 할 때 pdf를 생성하기 위해 node.js 프로젝트에서 PDFKit 및 socket.io를 사용하고 있습니다. 최종 PDF 파일을 여기에서 스트리밍하거나 다른 방법으로 보내려면 어떻게해야합니까? 차라리 파일을 파일 시스템에 저장하지 말고 나중에 삭제할 수 있다면 어떻게 든 스트리밍 할 수 있기를 바랍니다.socket.io를 사용하여 문자열에서 브라우저로 파일 보내기

socket.on('customerRequestPDF', function(){    
    doc = new PDFDocument;   

    doc.text('Some text goes here', 100, 100); 

    //I could do this but would rather avoid it 
    doc.write('output.pdf'); 

    doc.output(function(string) { 
     //ok I have the string.. now what? 

    }); 

}); 

답변

1

websocket은 실제로 PDF를 전달하는 데 적절한 메커니즘이 아닙니다. 그냥 일반적인 HTTP 요청을 사용하십시오.

// assuming Express, but works similarly with the vanilla HTTP server 
app.get('/pdf/:token/filename.pdf', function(req, res) { 
    var doc = new PDFDocument(); 
    // ... 

    doc.output(function(buf) { // as of PDFKit v0.2.1 -- see edit history for older versions 
     res.writeHead(200, { 
      'Content-Type': 'application/pdf', 
      'Cache-Control': 'private', 
      'Content-Length': buf.length 
     }); 
     res.end(buf); 
    }); 
}); 

경고 단어 :이 PDF 라이브러리가 손상되었습니다. 버전 0.2.1에서 출력은 적절한 Buffer이지만, Buffer 대신 내부적으로 사용되지 않는 binary 문자열 인코딩을 사용합니다. (이전 버전하면 바이너리 인코딩 된 문자열을했다.)을 docs에서 :

'binary'

- 각 문자의 처음 8 비트를 사용하여 문자열로 원시 이진 데이터를 인코딩하는 방법. 이 인코딩 방법은 더 이상 사용되지 않으므로 가능하면 Buffer 개체를 사용하여 피해야합니다. 이 인코딩은 이후 버전의 노드에서 제거됩니다.

노드가 이진 문자열 인코딩을 제거하면 라이브러리가 작동을 멈추는 것을 의미합니다.

+0

[this] (https://github.com/devongovett/pdfkit/pull/166) 풀 요청에서,'doc.output'은 이제 바이너리 문자열 대신 버퍼를 반환합니다. – devongovett

+0

@devongovett, 업데이트 해 주셔서 감사합니다. 나는 바이너리 문자열 인코딩이 여전히 내부적으로 사용된다는 것을 알았다. 즉, 노드가 결국 인코딩 지원을 제거 할 때 라이브러리가 중단됩니다. – josh3736

관련 문제