オフィス狛 技術部のJoeです。
担当したプロジェクトで、S3上の画像ファイルをPDFファイルに変換する要件がありましたので、
変換方法を備忘も兼ねてご紹介しようと思います。
今回使用したライブライは2つです。 ※()は使用したバージョンです
・pdf-lib(1.11.1):PDFファイルを編集するためのnpmパッケージ
・sharp(0.26.3):画像ファイルを編集するためのnpmパッケージ
1.S3上の画像ファイル読み込む
S3から画像ファイルを読み込んで、bufferデータを取得します。ここで問題になったのは、読み込んだ画像ファイルが意図せずに回転してしまったことです。
読み込んだ画像ファイルの回転情報を保持するために、sharpのライブラリを使用しました。
const aws = require('aws-sdk'); const sharp = require('sharp'); // S3にアクセスするための情報 const s3Client = new aws.S3({ accessKeyId: [S3アクセスキー], secretAccessKey: [S3シークレットアクセスキー], region: [S3のリージョン], }); const params = { Bucket: [S3バケット名], Key: [S3ファイルパス/ファイル名], }; // S3の画像ファイルを取得 dataInS3 = await s3Client.getObject(params).promise(); // 画像ファイルのbufferデータを取得(rotateの引数なしで、読み込んだ画像の回転情報を保持する) bufferData = await sharp(dataInS3.Body).rotate().toBuffer();
2.pdf-libで画像をPDFファイルに埋め込む
読み込んだ画像ファイルをPDFファイルに埋め込みます。この処理では、読み込んだ画像ファイル容量が大きい場合、メモリ使用率にご注意ください。
const { PDFDocument } = require('pdf-lib'); // 空のPDFを作成 const pdfDoc = await PDFDocument.create(); // 画像のbufferデータをPDFに埋め込む image = await pdfDoc.embedJpg(bufferData); // jpgファイルの場合はこちら image = await pdfDoc.embedPng(bufferData); // pngファイルの場合はこちら // 画像の倍率を元サイズのままとして幅と高さの情報を取得 const dims = image.scale(1); // 画像ファイルと同じサイズのPDFページを追加して、画像を設定する const page = pdfDoc.addPage([dims.width, dims.height]); page.drawImage(image, { width: dims.width, height: dims.height, }); const pdfBytes = await pdfDoc.save();
3.PDFファイルをS3に保存
最後に変換したPDFファイルをS3に保存にします。// PDFファイルのbufferデータを取得 const pdfBuffer = Buffer.from(pdfBytes); // S3に保存するためのパラメータを設定 const putParams = { Bucket: [S3バケット名], Key: [S3ファイルパス/PDFファイル名], Body: pdfBuffer, ContentType: 'application/pdf', }; // S3に保存 await s3Client.putObject(putParams).promise();
以上で、変換したPDFファイルがS3に保存されました。
もし、画像からPDFへの変換が必要になった際に、参考になれば幸いです。
Node.js
0 件のコメント:
コメントを投稿