Node 上で PDF ファイルを作成する方法

ここでは Node 上で PDF を生成する方法を紹介します。 特によく使用されている pdfkitpdfmake という二つのライブラリを取りあげます。

どちらもとても多機能で、とてもカバーしきれないので簡単な手軽な実行例を示すことを目標にします。

フォントの準備

今回の実行例ではカスタムのフォントが利用できることを確かめるために、 以下のフォントファイル (ttf) を使用しています。

  • Lilita One (LilitaOne-Regular.ttf)
  • M PLUS 1p (MPLUS1p-Regular.ttf)
  • Sawarabi Gothic (SawarabiGothic-Regular.ttf)

Google Fonts からダウンロードしました。

そして Node プロジェクト内に fonts という名前のフォルダを作り、その中に ttf ファイルを保存しています。

pdfkit による PDF の生成

PDFKit では複数ページの PDF の作成ができたり、Canvas を使う方法と同様の方法でベクター図形を描いたり、 様々な API が用意されています。

pdfkit のインストール

pdfkit は次のコマンドでインストールできます。MIT ライセンスで利用できます。

npm install pdfkit

ドキュメント類は本家サイトに充実しています。

PDFKit

pdfkit の利用例

次のコードを実行すると file1.pdf というファイルが現在のディレクトリに作成されます。

const fs = require('fs');
const PDFDocument = require('pdfkit');

const pdf = new PDFDocument({
  size: 'LEGAL',
  info: {
    Title: 'Title!',
    Author: 'Author!',
  }
});

const loream = `Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla varius tortor eget ligula auctor, in porta odio consequat. 

Integer sollicitudin mauris eget neque cursus consectetur. Duis dignissim lacus sed tortor aliquet fringilla. Praesent elementum leo diam. Duis sed ullamcorper enim. Nulla eleifend, nisi sed tempor pharetra, sem magna placerat nulla, in varius felis orci id nulla.`;

pdf.font('Times-Roman').text(loream).moveDown();
pdf.font('fonts/LilitaOne-Regular.ttf').text('This is LilitaOne!').moveDown(0.5);
pdf.font('fonts/MPLUS1p-Regular.ttf').text('こんにちは!').moveDown();

pdf.pipe(fs.createWriteStream('file1.pdf'))
  .on('finish', () => {
    console.log('A PDF file has been created.');
  });

pdf.end();

表示例は次の通りです。

pdfmake を用いた PDF ファイルの作成

pdfmake のインストール

pdfmake は次のコマンドでインストール可能です。

npm install pdfmake

本家サイトのドキュメントは次をみてください。

pdfmake

pdfmake の利用例

レギュラーフォント、太文字フォントなど、どれも同じものを指定していますが、実際にはそれぞれ適切なフォントを必要に応じてセットしてください。

const fonts = {
  SawarabiGothic: {
    normal: 'fonts/SawarabiGothic-Regular.ttf',
    bold: 'fonts/SawarabiGothic-Regular.ttf',
  },
  LilitaOne: {
    normal: 'fonts/LilitaOne-Regular.ttf',
    bold: 'fonts/LilitaOne-Regular.ttf',
    italics: 'fonts/LilitaOne-Regular.ttf',
    bolditalics: 'fonts/LilitaOne-Regular.ttf'
  },
};

const PdfPrinter = require('pdfmake');
const printer = new PdfPrinter(fonts);
const fs = require('fs');

const docDefinition = {
  content: [
    { text: 'This is a header', style: 'title' },
    'No styling here, this is a standard paragraph',
    { text: 'こんにちは。これはPDFのサンプルです。日本語が入力可能かどうか確認しています。これが表示できればとても助かります。', margin: [0, 10] },
    { qr: 'https://nodejs.keicode.com/' , fit: '50' },
    { text: 'これはマージンを指定しています。', margin: [0, 10]},
    { text: '複数のスタイルを指定しています。', style: ['h1', 'style2'] }
  ],
  styles: {
    title: {
      font: 'LilitaOne',
      fontSize: 24,
    },
    h1: {
      font: 'SawarabiGothic',
      fontSize: 18,
      bold: true
    },
    style2: {
      alignment: 'right',
      color: 'blue',
    }
  },
  defaultStyle: {
    font: 'SawarabiGothic',
    fontSize: 14,
  }
};

const pdfDoc = printer.createPdfKitDocument(docDefinition);
pdfDoc.pipe(fs.createWriteStream('file2.pdf'));
pdfDoc.end();

PDF の表示例は次の通りです。

スタイルの指定も簡単ですし、QR コードの埋め込みもとても簡単にできていることがわかります。

以上、ここでは Node 上で PDF を作成する例を紹介しました。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Node.js 入門