首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >wkhtmltopdf在nodejs中的AWS Lambda上生成空白pdf文件

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

Stack Overflow用户
提问于 2018-02-26 18:10:32
回答 3查看 1.6K关注 0票数 0

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

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

Lambda压缩包包含wkhtmltopdf Linux 64 bit biinary

我写了这段代码(TypeScript)。

代码语言:javascript
复制
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在这里。

代码语言:javascript
复制
<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。

EN

回答 3

Stack Overflow用户

发布于 2018-07-18 18:14:48

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

票数 0
EN

Stack Overflow用户

发布于 2018-11-21 00:50:02

在lambda中生成和发送PDF文件的方法如下:

  1. 编写一个从html内容生成pdf文件的lambda函数。
  2. 在此函数中,不要使用"buffer“作为类型。取而代之的是使用“文件”-它可以用命令fs.readFileSync('/tmp/temp.pdf').toString("base64"),在文件夹/tmp/sample.pdf
  3. Update中创建,返回给调用function.
  4. Calling函数的response.body可以直接在SES原始文件中使用此有效载荷(不需要进一步编码为base64。
票数 0
EN

Stack Overflow用户

发布于 2019-09-18 20:26:44

在我的例子中,我在lambda中做了以下代码,请增加内存和超时,它们位于Lambda函数的基本设置中。

代码语言:javascript
复制
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;
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48985934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档