質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

Q&A

解決済

1回答

2160閲覧

Lambda上で生成したPDFをS3に保存したい

atmn3356

総合スコア157

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

0グッド

0クリップ

投稿2018/04/19 00:41

編集2018/04/19 02:17

前提・実現したいこと

Node.jsを用い、AWS Lambda上で画像ファイルに文字を書き込み、
それをPDFとしてAWS S3に保存したいと考えています。

下記のようにコードを記述し、
PDFが作成できることは確認できたのですが、
作成したPDFをS3に送る方法が分かりません。

方法、またはその方法の書いてある記事等ありましたら
ご教示お願い致します。

該当のソースコード

Node.js

1//---------------------------------------------------------------- 2// 画像にテキストを書き込んでPDFとして出力 3//---------------------------------------------------------------- 4// モジュールの読み込み 5var PDFDocument = require('pdfkit'); 6var fs = require('fs'); 7var AWS = require('aws-sdk'); 8var s3 = new AWS.S3(); 9 10exports.handler = function(event, context) { 11 // ドキュメントを作る 12 doc = new PDFDocument; 13 // 出力ファイルを設定する 14 doc.pipe(fs.createWriteStream('/tmp/出力ファイル.pdf')); 15 // フォントを埋め込む 16 doc.font('ipaexm.ttf'); 17 18 var pw = doc.page.width; 19 var ph = doc.page.height; 20 21 // 画像を埋め込む 22 doc.image('テンプレート画像.png', 0, 0, {fit: [pw, ph]}); 23 24 // 文字を表示する 25 doc.fontSize(20).text("test text", 240, 78); 26 27 // 出力を終了する 28 doc.end(); 29 30 // 作成したPDFをparamで渡してS3に保存 31 var params = { 32 Bucket: "バケット名", 33 Key: '出力ファイル.pdf', 34 Body: ~~~~~~ // ここでPDFを渡す? 35 }; 36 s3.putObject(params) 37};

追記

CHERRY様のご回答を参考にS3送信部分を以下のように書き換えました。
しかし、S3への保存はできたものの、
S3で「PDFを開く」をすると、「破損しており開けない」というエラーが出ます。
PDFがうまく送れていないのでしょうか?

Node.js

1 var params = { 2 Bucket: "バケット名", 3 Key: '出力ファイル.pdf', 4 ContentType: 'application/pdf', 5 Body: doc 6 }; 7 8 s3.upload(params, function(err, data) { 9 if(err) { 10 console.log('error : ', err); 11 } 12 }); 13}; 14

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

画像ファイルのアップロードしかやったことないけど、doc に PDF が入っているなら こんな感じでできないでしょうか?

javascript

1var params = { 2 Bucket: "バケット名", 3 Key: '出力ファイル.pdf', 4 ContentType: 'application/pdf', 5 Body: doc 6}; 7 8s3.upload(params, function(err, data) { 9 if(err) { 10 console.log('error : ', err); 11 } 12);

投稿2018/04/19 01:16

CHERRY

総合スコア25171

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

atmn3356

2018/04/19 02:09

CHERRY様 ご回答ありがとうございます。 コードを書き換えたところ、S3への保存はできました。 しかしPDFが破損しており開けないというエラーが出ました。 重ね重ねで申し訳ないのですが、 もし思いつく解決策がありましたらご教示願います。
lazhuward

2018/04/19 07:12

S3に保存したオブジェクトに対して、コンテントタイプを確認してください。 ちゃんと"application/pdf"になってますでしょうか? "binary/octet-stream"のままになっていませんか?
atmn3356

2018/04/19 07:44

lazhuward様 ご回答ありがとうございます。 CHERRY様にご指摘頂き >ContentType: 'application/pdf', 以上を書き足したためきちんと変更されているようです。 保存はされているものの表示できないという原因が全く見当つきません…。
lazhuward

2018/04/19 08:00

でしたら恐らくプログラムでPDFを合成する際の問題だと思います。
atmn3356

2018/04/19 08:17

lazhuward様 たびたびのご回答ありがとうございます。 ローカル環境下にて、 doc = new PDFDocument; ~ doc.end(); までのPDF作成部分はきちんと出力されるのが確認されているのです。 そのため、S3に渡す部分がおかしなことになっているのだと考えたのですが…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問