wkhtmltopdf在nodejs中的AWS Lambda上生成一个空白pdf文件

时间:2018-02-26 10:10:32

标签: node.js aws-lambda wkhtmltopdf

wkhtmltopdf在nodejs中的AWS Lambda上生成空白pdf文件。

我想使用wkhtmltopdf从AWS Lambda上的html中提取PDF文件以转换为pdf。

Lambda zip包中包含wkhtmltopdf Linux 64 bit biinary

我编写此代码(TypeScript)。

import { exec } from 'child_process';
const wkhtmltopdf = 'wkhtmltox/bin/wkhtmltopdf';


export function htmlToPdf(html:string, outputPath:string): Promise<string> {
    return new Promise((resolve, reject) => {
        const onelineHtml = html.replace(/\r?\n/g,"");
        exec(`echo '${onelineHtml}' | ${wkhtmltopdf} --encoding utf-8 - ${outputPath}`, (err, stdout) => {
            if(err) {
                reject(err);
                return;
            }
            resolve(stdout);
        });    
    });
}

输入HTML就在这里。

<html lang="ja">
<head>
<meta charset="utf-8">
<title>Settlement</title>
</head>
<body>
<h1>test</h1>
sumPrice: 100yen
</body>
</html>

上面的代码可以生成PDF文件,但文件是空白的我用PDF浏览器打开它,如OSX的预览应用程序和Adobe PDF Reader。 PDF文件包含图像后面的对象,由文本编辑器打开(喜欢emacs)。

Image: Generated PDF file's contents

我想知道如何解决这个问题。 我想在AWS Lambda上从HTML中提取PDF。

3 个答案:

答案 0 :(得分:0)

我认为它生成了一个零尺寸的pdf文件, Lambda支持64位二进制文​​件。您需要上传合适版本的wkhtmltopdf.sh文件。

答案 1 :(得分:0)

可以通过以下方式在lambda中生成和发送PDF文件:

  1. 编写一个lambda函数,该函数从html内容生成pdf文件。
  2. 在此功能中,请勿将“ buffer”用作类型。而是使用“文件”-它可以在/tmp/sample.pdf文件夹中创建
  3. 使用命令fs.readFileSync('/ tmp / temp.pdf')。toString(“ base64”)更新response.body,该函数将返回给调用函数。
  4. 调用函数可以立即在SES Raw文件中使用此有效负载(无需进一步编码为base64。

答案 2 :(得分:0)

在我的情况下,我确实在lambda中执行了以下代码,请增加位于Lambda函数基本设置中的内存和超时。

const AWS = require('aws-sdk');
const pdf = require('html-pdf');
const s3 = new AWS.S3({
    accessKeyId: "AK****S****D****Q",
    secretAccessKey: "vBK******Q****KyT***W*****h**l"
});
function genpdf(params){
    let res = {
        status : false
    };
    return new Promise(function(resolve, reject) {
        pdf.create(params.html,params.pdfSetting).toStream(async function (err, stream) {
            if (err) {
                return resolve(res);
            }
            let currentTime = new Date()
            let path = "pdfs/"+currentTime.getFullYear()+"/"+(currentTime.getMonth() + 1)+"/"+currentTime.getDate()+"/";
            const s3params = {
                Bucket: 'checkdc', // pass your bucket name
                Key: path+params.fileName, // file will be saved as Year/Month/Date/abc.pdf
                Body: stream, 
                ContentType: 'application/pdf',
                ACL : 'public-read' // Remove this key if you want to upload file private
            };
            s3.upload(s3params, function(s3Err, data) {
                if (s3Err) {
                    return resolve(res);
                }
                console.log(`File uploaded successfully at ${data.Location}`);
                res.status = true;
                res.body = data.Location;
                return resolve(res);
            });
        });

    })
}

exports.handler = async (event, context, callback) => { 
    console.log("event.body :: ",event.body)
    var params = JSON.parse(event.body);
    let data = await genpdf(params);
    let response = {
        statusCode: 200,
        body: JSON.stringify(data),
    };
    return response;
};