wkhtmltopdf在nodejs中的AWS Lambda上生成空白pdf文件。
我想从AWS Lambda上的html中提取pdf文件,使用wkhtmltopdf转换为PDF。
Lambda压缩包包含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 Viewer喜欢OSX的预览应用程序和Adobe PDF阅读器。PDF文件在图像后面有对象,由文本编辑器(如emacs)打开。
Image: Generated PDF file's contents
我想知道我应该做些什么来解决这个问题。我想从AWS Lambda上的HTML中提取PDF。
发布于 2018-07-18 18:14:48
我认为它生成了一个零大小的pdf文件,Lambda支持64位二进制文件。您需要上传合适版本的wkhtmltopdf.sh文件。
发布于 2018-11-21 00:50:02
在lambda中生成和发送PDF文件的方法如下:
发布于 2019-09-18 20:26:44
在我的例子中,我在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;
};https://stackoverflow.com/questions/48985934
复制相似问题