ReactでPDFを扱う!表示から生成まで完全解説

react icon
React

こんにちは、とまだです。

ReactでWebアプリを作っていて、「PDFファイルを画面に表示したい」と思ったことはありませんか?

または「データからPDFを自動生成したい」なんて要望を受けたことがある方もいるでしょう。

実は、ReactにはPDFを扱うための便利なライブラリがあるんです。

今回は、PDFの表示から生成まで、初心者の方でも実装できるように解説していきます。

React PDFとは?

React PDFには大きく分けて2つの種類があります。

まるで双子のように名前は似ているけれど、役割は全然違うんです。

PDFを表示する「react-pdf」

こちらは、既存のPDFファイルをブラウザ上で表示するためのライブラリです。

図書館で本を開いて読むような感覚ですね。

PDFを生成する「@react-pdf/renderer」

一方こちらは、Reactコンポーネントを使ってPDFを作成するライブラリです。

まるでワープロソフトで文書を作るような感覚で、PDFを生成できます。

どちらを使うかは、やりたいことによって決まります。

まずは「表示」から見ていきましょう。

PDFを表示する方法

PDFの表示は、react-pdfを使えば簡単に実現できます。

まずはインストールから始めます。

npm install react-pdf

このコマンドでライブラリがインストールされます。

続いて、実際の実装を見てみましょう。

import { useState } from "react";
import { Document, Page } from "react-pdf";

function PdfViewer() {
  const [numPages, setNumPages] = useState(null);

  function onDocumentLoadSuccess(pdf) {
    setNumPages(pdf.numPages);
  }

  return (
    <div>
      <Document file="/sample.pdf" onLoadSuccess={onDocumentLoadSuccess}>
        {Array.from(new Array(numPages), (el, index) => (
          <Page key={index} pageNumber={index + 1} />
        ))}
      </Document>
    </div>
  );
}

export default PdfViewer;

このコードのポイントは、DocumentとPageという2つのコンポーネントです。

Documentは本全体、Pageは各ページを表していると考えると分かりやすいですね。

読み込みが完了すると、自動的に全ページが表示される仕組みになっています。

よくある質問

PDFの表示について、よく聞かれる質問をまとめました。

  • 外部サイトのPDFも表示できる?
  • ページを1枚ずつ表示したい
  • 拡大・縮小機能は付けられる?
  • モバイルでも正常に表示される?

これらはすべて実装可能です。

ただし、外部サイトのPDFを読み込む場合は、CORSの設定に注意が必要です。

実際の開発での活用シーン

PDFの表示機能は、様々な場面で活躍します。

例えば、こんなケースを想像してみてください。

オンラインショップの場合

お客様が過去の請求書を確認したいとき。

わざわざダウンロードしなくても、その場で内容を確認できます。

便利ですよね。

社内システムの場合

契約書のドラフトを関係者で確認するとき。

メールで送り合うよりも、システム上で直接見られる方が効率的です。

共有も簡単になります。

教育サービスの場合

教材のPDFを生徒に配布するとき。

ブラウザ内で直接閲覧できれば、学習体験がスムーズになります。

ダウンロードの手間も省けますね。

PDFを生成する方法

次は、PDFの生成について見ていきましょう。

@react-pdf/rendererを使います。

npm install @react-pdf/renderer

インストールが完了したら、実装に入ります。

import React from "react";
import { Page, Text, View, Document, StyleSheet, PDFDownloadLink } from "@react-pdf/renderer";

const styles = StyleSheet.create({
  page: {
    backgroundColor: "#ffffff",
    padding: 20
  },
  section: {
    marginBottom: 10
  }
});

function MyPDF() {
  return (
    <Document>
      <Page style={styles.page}>
        <View style={styles.section}>
          <Text>React PDFで生成したサンプル</Text>
        </View>
        <View style={styles.section}>
          <Text>ここにテキストを配置できます</Text>
        </View>
      </Page>
    </Document>
  );
}

function App() {
  return (
    <div>
      <PDFDownloadLink document={<MyPDF />} fileName="sample.pdf">
        {({ loading }) => (loading ? "生成中..." : "PDFをダウンロード")}
      </PDFDownloadLink>
    </div>
  );
}

このコードは、HTMLとCSSを書く感覚でPDFを作成できます。

Viewはdivタグ、Textはpタグのようなものだとイメージしてください。

StyleSheetでスタイルを定義するのも、CSSと似ていますね。

使い分けのポイント

PDFの表示と生成、どちらを選ぶべきか迷うこともあるでしょう。

そんなときは、以下のポイントを参考にしてください。

PDF表示(react-pdf)がおすすめの場合

既存のPDFファイルがある場合はこちらです。

具体的には以下のような状況です。

  • サーバーに保存されているPDFを見せたい
  • 外部から取得したPDFを表示したい
  • PDFの内容を変更する必要がない

PDF生成(@react-pdf/renderer)がおすすめの場合

動的にPDFを作る必要がある場合はこちらです。

例えば以下のようなケースです。

  • ユーザーの入力データから請求書を作成
  • データベースの情報から帳票を生成
  • カスタマイズ可能なレポートを作成

どちらも便利なツールですが、目的に応じて使い分けることが大切です。

実装時の注意点

PDFを扱う際には、いくつか気をつけたい点があります。

事前に知っておけば、トラブルを避けられます。

ファイルサイズの問題

PDFは画像を含むと大きくなりがちです。

まるで重い荷物を運ぶように、読み込みに時間がかかることがあります。

対策として、以下の方法があります。

  • CDNを活用して配信を高速化
  • 画像の圧縮や最適化を行う
  • 必要に応じてページ単位で読み込む

セキュリティの考慮

機密情報を含むPDFを扱う場合は要注意です。

まるで金庫の鍵のように、アクセス管理が重要になります。

以下の対策を検討しましょう。

  • 認証済みユーザーのみアクセス可能にする
  • PDFのURLを推測されにくくする
  • 一定時間でアクセスできなくする

ブラウザの互換性

すべてのブラウザで同じように表示されるとは限りません。

まるで方言のように、ブラウザごとに微妙な違いがあります。

主要なブラウザでテストすることが大切です。

まとめ

ReactでPDFを扱う方法を見てきました。

表示には「react-pdf」、生成には「@react-pdf/renderer」を使います。

それぞれ得意分野が違うので、目的に応じて選びましょう。

最初は簡単な実装から始めて、徐々に機能を追加していくのがおすすめです。

PDFの扱いは一見難しそうに見えますが、実は基本を押さえれば意外とシンプルです。

今回紹介した方法を参考に、ぜひ実際のプロジェクトで試してみてください。

共有:

著者について

とまだ

とまだ

フルスタックエンジニア

Learning Next の創設者。Ruby on Rails と React を中心に、プログラミング教育に情熱を注いでいます。初心者が楽しく学べる環境作りを目指しています。

著者の詳細を見る →