生成的PDF文件无法在Chrome

时间:2017-11-17 15:33:15

标签: node.js http pdf koa

我目前在我的Koa.js图层中实现了一些功能,当一个方法被调用时,生成PDF然后作为下载文件返回给用户。我目前无法让它工作,也看不出原因。

我可以在我的Chrome网络标签中看到响应标头是正确的,但它没有打开,所以这让我怀疑响应的主体是不正确的但是我看不出原因。

这是我的代码:

import Router from 'koa-router';
const PDFRouter = new Router();
import PDFDocument from 'pdfkit';

import PDFController from '../../../controllers/api/PDFController';
const PDFControllerInstance = new PDFController();

PDFRouter.post('/generate-pdf', async (ctx, next) => {
    let doc = new PDFDocument();
    const filename = 'claim';

    ctx.response.set('Content-disposition', 'attachment; filename="' + filename + '"');
    ctx.response.set('Content-type', 'application/pdf');
    const PDFfile = ctx.res.pipe(doc);

    doc.end();
    ctx.body = PDFfile;
});

export default PDFRouter;

如您所见,我正在使用PDFkit库生成PDF。原始PDF代码将在响应中发送到正文中。以下是请求,响应标头和正文。

Request URL:http://degould-login.dev/api/generate-pdf
Request Method:POST
Status Code:200 OK
Remote Address:127.0.0.1:80
Referrer Policy:no-referrer-when-downgrade

Response Headers
view source
Access-Control-Allow-Methods:GET,HEAD,PUT,POST,DELETE
Access-Control-Allow-Origin:http://degould-login.dev
Connection:keep-alive
Content-disposition:attachment; filename="claim"
Content-Type:application/pdf
Date:Fri, 17 Nov 2017 15:22:56 GMT
Server:nginx/1.10.3 (Ubuntu)
Transfer-Encoding:chunked

Request Headers
view source
Accept:application/json, text/plain, */*
Accept-Encoding:gzip, deflate
Accept-Language:en-GB,en-US;q=0.9,en;q=0.8
Cache-Control:no-cache
Connection:keep-alive
Content-Length:11
content-type:text/plain
Cookie:XDEBUG_SESSION=XDEBUG_ECLIPSE
Host:degould-login.dev
Origin:http://degould-login.dev
Pragma:no-cache
Referer:http://degould-login.dev/
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36

以下是回复:

%PDF-1.3
%ÿÿÿÿ
5 0 obj
<<
/Type /Page
/Parent 1 0 R
/MediaBox [0 0 612 792]
/Contents 3 0 R
/Resources 4 0 R
>>
endobj
4 0 obj
<<
/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
>>
endobj
6 0 obj
<<
/Producer (PDFKit)
/Creator (PDFKit)
/CreationDate (D:20171117152256Z)
>>
endobj
2 0 obj
<<
/Type /Catalog
/Pages 1 0 R
>>
endobj
1 0 obj
<<
/Type /Pages
/Count 1
/Kids [5 0 R]
>>
endobj
3 0 obj
<<
/Length 23
/Filter /FlateDecode
>>
stream
x3T0B]C ani¤ËI\
endstream
endobj
xref
0 7
0000000000 65535 f 
0000000327 00000 n 
0000000278 00000 n 
0000000384 00000 n 
0000000119 00000 n 
0000000015 00000 n 
0000000186 00000 n 
trailer
<<
/Size 7
/Root 2 0 R
/Info 6 0 R
>>
startxref
478
%%EOF

这是我向Node.JS(Koa)层发出请求的前端服务方法

generatePDF(PDFContent: string): Observable<any> {
        return this._http.post(this._config.API_URL + '/generate-pdf', PDFContent)
            .map((response) => response.json);
    }

有谁能看到我在这里做错了或提供一些建议?我希望将PDF文件自动下载到客户端的计算机上。 感谢

2 个答案:

答案 0 :(得分:0)

尝试替换

ctx.response.set('Content-type', 'application/pdf');

ctx.response.set("Content-Type", "application/force-download")

答案 1 :(得分:0)

好的,所以我设法通过执行以下操作来解决此问题。我的Node代码没有任何问题,我的FE Angular4代码出现了问题。

我修改了我的服务功能如下:

    private BottomSheetBehavior.BottomSheetCallback mBottomSheetBehaviorCallback = new BottomSheetBehavior.BottomSheetCallback() {

            @Override
            public void onStateChanged(@NonNull View bottomSheet, int newState) {
             //your code     
            }

            @Override
            public void onSlide(@NonNull View bottomSheet, float slideOffset) {
            //your code
           }
        };

当节点层向我返回一个blob时,我错误地在那里留下了response.json()。所以这被删除了。

一旦我将blob从服务返回到我的控制器方法,如上所示,我只是创建了一个帮助函数来为blob创建一个URL,如下所示,并在新窗口中打开PDF。

generatePDF(PDFContent: string): Observable<any> {
        return this._http.post(this._config.API_URL + '/generate-pdf', PDFContent, { responseType: ResponseContentType.Blob })
            .map((response) => {
                return response;
            });
    }

希望这有帮助