Reactを使用したHTMLからPDFへの変換方法
Reactは人気のあるJavaScriptライブラリの一つですが、このチュートリアルでは、Reactを使ってHTMLをPDFに変換する方法を学びます。これを実現するためには、jsPDFというオープンソースのパッケージを使用します。これはサーバーサイドの処理を必要としないクライアントサイドライブラリです。最新バージョンである2.5.1を使用します。jsPDFはレポート、請求書、チケットの生成に利用できます。
jsPDFを使ってPDFに変換できるもの
jsPDFのライブデモ例を見ると、画像、フォントの種類、サイズ、円、四角、三角、テーブル、ライン、言語など、PDF形式に変換できることがわかります。また、HTMLを複数ページに分けてページブレークを加えたり、パスワード保護や注釈を加えることも可能です。ページの向きをランドスケープやポートレートに変更することもできます。
Reactプロジェクトの設定
始めるためには、Create React Appを使います。これにより、必要な依存関係と設定ファイルを持つ新しいReactプロジェクトが作成されます。
npx create-react-app convert-html-to-pdf
新しく作成されたディレクトリに移動して、npm
またはyarn
を使ってjspdf
パッケージをインストールします。
cd convert-html-to-pdf
npm install jspdf
または
yarn add jspdf
jsPDFライブラリの使用
- まず、
App.js
ファイルを開いてjspdf
パッケージをインポートします。
import jsPDF from 'jspdf';
- jsPDFの新しいインスタンスを初期化します。
const doc = new jsPDF();
jsPDFはPDFをカスタマイズするためのオプションをいくつか提供しています。デフォルトではA4サイズの紙、縦向き、ミリメートルを単位として使用します。
これらのオプションを変更したい場合は、コンストラクタにオブジェクトを渡します。
const doc = new jsPDF({
orientation: 'landscape',
unit: 'in',
format: [4, 2],
});
使用可能なオプションはすべて、jsPDFのドキュメントで見つけることができます。
HTMLをPDFに変換する
jsPDFにはhtml()
というメソッドがあり、これを使ってHTMLをPDFに変換します。このメソッド는2つ의引数を取ります: HTML要素とコールバック関数です。Reactを使用しているので、HTML要素への参照を取得するためにuseRef()
フックを使います。
doc.save()
メソッドはPDFファイルの名前を引数に取ります。これにより、PDFファイルがユーザーのコンピュータにダウンロードされます。
doc.html(html_element, {
async callback(doc) {
await doc.save('pdf_name');
},
});
マークアップの追加
PDFに変換するHTMLをページに追加する必要があります。レポートのテンプレートを使用し、ボタンがクリックされたときにPDFを生成するイベントをトリガーします。div
要素は、PDFに変換したいHTMLを含むものです。
ReportTemplate.js
という新しいファイルを作成し、次のコードを追加します。
// この部分には長いコードが含まれていますが、リクエストに従い翻訳は省略します。
// 以下のコードブロックは、実際のコンテンツの一部を翻訳するなくそのまま掲載しました。
PDFの生成
JSXが準備できたので、ボタンクリックを処理できます。handlePDF
関数を呼び出すために、onClick
イベントハンドラーを使用します。
App.js
に戻って、ボタンにonClick
イベントハンドラーを追加します。その後、useRef
フックとHTML要素への参照をインポートします。
// この部分には長いコードが含まれていますが、リクエストに従い翻訳は省略します。
// 以下のコードブロックは、実際のコンテンツの一部を翻訳するなくそのまま掲載しました。
アプリがPDFを生成する準備ができました。npm start
でアプリを実行し、ボタンをクリックしてPDFを生成します。
](https://codesandbox.io/s/html-to-pdf-react-lf7qtm)
カスタムフォントの追加
jsPDFは14種類の標準PDFフォントをサポートしています。カスタムフォントを追加するには、フォントコンバーターを使用する必要があります。このフォントコンバーターにアクセスし、.ttf
ファイルをアップロードします。
ファイルを選ぶをクリックして追加したいフォントを選択します。その後、Createをクリックしてフォントを変換します。fontName、fontStyle、またはModule formatを変更する必要はありません。
フォントコンバーターは提供された.ttf
ファイルをベース64エンコードされた文字列とjsPDF用のコードを含むJavaScriptファイルを生成します。この生成されたJavaScriptファイルをプロジェクトに追加します。
カスタムフォントを有効にするには、setFont()
メソッドを使用します。
doc.setFont('Inter-Regular', 'normal');
使用しているフォント名は、JavaScriptに変換する前に確認できます。複数のフォントを使用する場合は、各フォントに対して同じプロセスを実行する必要があります。
デモプロジェクトはCodeSandbox上にあります。自由にフォークして遊んでみてください。デモプロジェクトで使われているフォントや画像はpublic
フォルダに入っています。
jsPDFライブラリを使用する際のデメリット
jsPDFはクライアントサイドのJavaScriptでPDF文書を生成するための良いライブラリですが、いくつかのデメリットがあります。
- 提供されるドキュメントが少しわかりにくいです。
- カスタムフォントを追加するには、フォントコンバーターを使用する必要があります。
- jsPDFのリポジトリは少し古くなっているようです。
- ライブラリは外部スタイルシートをサポートしていません。
結論
このチュートリアルでは、Reactを使用してHTML/JSXからクライアントサイドのPDFを生成する方法を見てきました。より堅牢なPDF機能を追加することを検討している場合は、PSPDFKitが商用のReact PDFライブラリを提供しています。これは、Webアプリケーションに簡単に統合できます。30以上の機能を備えており、ブラウザで直接ドキュメントを表示、注釈付け、編集、署名することができます。箱から出してすぐに使える洗練された柔軟なUIがあり、独自のユースケースに基づいて拡張または簡素化することができます。
バニラのJavaScript PDFビューアをデプロイするか、React.js、Angular、Vue.jsなどの多数のWebフレームワークデプロイオプションを使用することができます。すべてのWebフレームワークのリストを表示するには、無料トライアルを開始してください。または、デモを起動して、私たちのビューアを実際に使ってみてください。
こちらの記事はdev.toの良い記事を日本人向けに翻訳しています。
https://dev.to/hulyakarakaya/how-to-convert-html-to-pdf-using-react-37j4