オフィス狛 技術部の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 件のコメント:
コメントを投稿