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。
答案 0 :(得分:0)
我认为它生成了一个零尺寸的pdf文件, Lambda支持64位二进制文件。您需要上传合适版本的wkhtmltopdf.sh文件。
答案 1 :(得分:0)
可以通过以下方式在lambda中生成和发送PDF文件:
答案 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;
};