pdfjs-dist vs pdf-parse vs pdf-lib
PDF操作ライブラリの技術的比較:生成・解析・表示の選択基準
pdfjs-distpdf-parsepdf-lib類似パッケージ:

PDF操作ライブラリの技術的比較:生成・解析・表示の選択基準

pdf-libpdf-parsepdfjs-dist はいずれもJavaScript環境でPDFを扱うためのnpmパッケージですが、目的と機能が大きく異なります。pdf-libはPDFの生成・編集に特化したライブラリで、既存のPDFにテキストや画像を追加したり、ページを結合・分割したりできます。pdf-parseはPDFの内容(主にテキスト)を抽出することに特化しており、解析用途に適しています。一方、pdfjs-distはMozillaが開発するPDF.jsの配布版で、ブラウザ上でのPDFレンダリングや高精度なテキストレイヤーの取得を可能にします。これら3つは互いに補完的であり、同じプロジェクトで組み合わせて使うことも珍しくありません。

npmのダウンロードトレンド

3 年

GitHub Starsランキング

統計詳細

パッケージ
ダウンロード数
Stars
サイズ
Issues
公開日時
ライセンス
pdfjs-dist9,743,00652,99940.6 MB47618日前Apache-2.0
pdf-parse2,595,42616421.3 MB215ヶ月前Apache-2.0
pdf-lib08,364-3134年前MIT

PDF操作ライブラリの深掘り比較:pdf-lib vs pdf-parse vs pdfjs-dist

PDFをWebアプリで扱う際、「生成」「解析」「表示」という3つの主要な要件があります。pdf-libpdf-parsepdfjs-distはそれぞれ異なる領域に特化しており、混同するとアーキテクチャに無駄が生じます。この記事では、実際のコード例を交えながら、各ライブラリの役割と使い分けを明確にします。

📄 PDFの生成・編集:pdf-lib

pdf-libはPDFの作成と変更に特化しています。既存のPDFを読み込んでテキストや画像を重ね書きしたり、複数のPDFをマージしたりできます。ただし、PDFを画面に表示する機能はありません。

基本的なPDF生成

import { PDFDocument, StandardFonts } from 'pdf-lib';

// 新しいPDFドキュメントを作成
const pdfDoc = await PDFDocument.create();
const page = pdfDoc.addPage([500, 600]);

// フォントを埋め込み
const font = await pdfDoc.embedFont(StandardFonts.Helvetica);

// テキストを描画
page.drawText('Hello, world!', {
  x: 50,
  y: 500,
  size: 24,
  font
});

// Uint8Arrayとして出力
const pdfBytes = await pdfDoc.save();

既存PDFの編集

import { PDFDocument } from 'pdf-lib';

// 既存PDFを読み込み
const existingPdfBytes = await fetch('/form.pdf').then(res => res.arrayBuffer());
const pdfDoc = await PDFDocument.load(existingPdfBytes);
const pages = pdfDoc.getPages();
const firstPage = pages[0];

// 日付を追加
firstPage.drawText(new Date().toLocaleDateString(), {
  x: 100,
  y: 200,
  size: 12
});

const modifiedPdfBytes = await pdfDoc.save();

💡 注意: pdf-libはPDFの構造を変更できますが、視覚的レンダリングはできません。生成したPDFを表示するには別途<iframe>pdfjs-distが必要です。

🔍 テキスト抽出:pdf-parse

pdf-parseはPDFからプレーンテキストを抽出することに特化しています。Node.js環境専用で、ブラウザでは動作しません。レイアウトやスタイル情報は失われますが、シンプルなテキスト取得には十分です。

Node.jsでのテキスト抽出

// このコードはNode.js環境でのみ動作
const fs = require('fs');
const pdf = require('pdf-parse');

const dataBuffer = fs.readFileSync('document.pdf');
const result = await pdf(dataBuffer);

console.log(result.text); // 抽出されたテキスト
console.log(result.numpages); // ページ数

⚠️ 制限: pdf-parseテキストコンテンツのみを返し、座標やフォント情報などは含まれません。また、スキャンされたPDF(画像ベース)からはテキストを抽出できません。

👁️ ブラウザ表示と高度な解析:pdfjs-dist

pdfjs-distはMozillaのPDF.jsの公式配布版で、ブラウザでのPDF表示を実現します。CanvasやSVGを使って高品質にレンダリングし、テキスト選択や検索もサポートします。

PDFの表示

import * as pdfjsLib from 'pdfjs-dist';

// PDF.jsのワーカーを設定(必須)
pdfjsLib.GlobalWorkerOptions.workerSrc = '/pdf.worker.js';

const loadingTask = pdfjsLib.getDocument('/sample.pdf');
const pdf = await loadingTask.promise;

// 最初のページを取得
const page = await pdf.getPage(1);

// Canvasにレンダリング
const canvas = document.getElementById('pdf-canvas');
const viewport = page.getViewport({ scale: 1.5 });
canvas.height = viewport.height;
canvas.width = viewport.width;

const renderContext = {
  canvasContext: canvas.getContext('2d'),
  viewport
};
await page.render(renderContext).promise;

テキストレイヤーの取得

// 同じページからテキスト情報を取得
const textContent = await page.getTextContent();

// 各アイテムには{x, y, str, dir}などの情報が含まれる
textContent.items.forEach(item => {
  console.log(`${item.str} at (${item.transform[4]}, ${item.transform[5]})`);
});

💡 強み: pdfjs-distテキストの位置情報まで取得できるため、ハイライトや注釈の実装に使えます。ただし、バンドルサイズが大きいため、表示不要なら使わない方が賢明です。

🧩 実際のユースケースでの組み合わせ

多くのアプリでは、これらのライブラリを組み合わせて使います。

ケース1: 契約書の自動生成 → 表示 → 署名

  1. pdf-libでテンプレートにユーザー情報を埋め込む
  2. 生成されたPDFをpdfjs-distで表示
  3. ユーザーが署名欄に描画(Canvas)
  4. 再度pdf-libで署名画像をPDFに合成

ケース2: PDFアップロード → テキスト抽出 → 検索インデックス作成

  • バックエンドでpdf-parseを使用してテキストを抽出
  • 抽出テキストをElasticsearchに登録
  • フロントエンドではpdfjs-distで元のPDFを表示

📊 機能比較表

機能pdf-libpdf-parsepdfjs-dist
PDF生成
PDF編集
テキスト抽出✅ (プレーンテキスト)✅ (位置情報付き)
ブラウザ表示
Node.js対応⚠️ (制限あり)
ブラウザ対応

💡 選定のポイント

  • 「PDFを作る・編集する」必要がある?pdf-lib
  • 「PDFの中身をテキストで読みたい」だけ? → バックエンドならpdf-parse、フロントエンドならpdfjs-dist
  • 「PDFを画面に表示したい」?pdfjs-dist一択

誤解しやすい点として、「テキスト抽出=pdf-parse」と思いがちですが、ブラウザ環境ではpdf-parseは使えません。その場合はpdfjs-distgetTextContent()を使う必要があります。

最後に:これらのライブラリは競合ではなく補完関係です。要件に応じて適切に組み合わせることで、堅牢なPDFワークフローを構築できます。

選び方: pdfjs-dist vs pdf-parse vs pdf-lib

  • pdfjs-dist:

    pdfjs-distはブラウザ上でPDFを表示・操作する必要がある場合に必須です。高品質なレンダリング、ページナビゲーション、テキスト選択、検索といった機能を提供します。また、テキストレイヤーを取得するAPIもあり、解析用途にも使えますが、バンドルサイズが大きいため、表示が不要なら他の軽量な選択肢を検討すべきです。

  • pdf-parse:

    pdf-parseはPDFからテキストを抽出したい場合に選ぶべきです。Node.js環境でのバックエンド処理に特化しており、ブラウザでは動作しません。シンプルなAPIで手軽にテキスト取得が可能ですが、レイアウト情報やフォントスタイルなどのメタデータは取得できません。大量のPDFをバッチ処理してテキストインデックスを作成するような用途に適しています。

  • pdf-lib:

    pdf-libはPDFの生成や編集が必要な場合に最適です。例えば、動的に契約書を作成したり、既存のPDFに署名や日付を追加したりするユースケースに向いています。ただし、PDFの描画(画面表示)や高度なテキスト抽出には対応していません。軽量でTypeScriptサポートも充実しているため、フロントエンドでのPDF操作に信頼性があります。

pdfjs-dist のREADME

PDF.js

PDF.js is a Portable Document Format (PDF) library that is built with HTML5. Our goal is to create a general-purpose, web standards-based platform for parsing and rendering PDFs.

This is a pre-built version of the PDF.js source code. It is automatically generated by the build scripts.

For usage with older browsers/environments, without native support for the latest JavaScript features, please see the legacy/ folder. Please see this wiki page for information about supported browsers/environments.

See https://github.com/mozilla/pdf.js for learning and contributing.