pdf-lib、pdf-parse、pdfjs-dist はいずれもJavaScript環境でPDFを扱うためのnpmパッケージですが、目的と機能が大きく異なります。pdf-libはPDFの生成・編集に特化したライブラリで、既存のPDFにテキストや画像を追加したり、ページを結合・分割したりできます。pdf-parseはPDFの内容(主にテキスト)を抽出することに特化しており、解析用途に適しています。一方、pdfjs-distはMozillaが開発するPDF.jsの配布版で、ブラウザ上でのPDFレンダリングや高精度なテキストレイヤーの取得を可能にします。これら3つは互いに補完的であり、同じプロジェクトで組み合わせて使うことも珍しくありません。
PDFをWebアプリで扱う際、「生成」「解析」「表示」という3つの主要な要件があります。pdf-lib、pdf-parse、pdfjs-distはそれぞれ異なる領域に特化しており、混同するとアーキテクチャに無駄が生じます。この記事では、実際のコード例を交えながら、各ライブラリの役割と使い分けを明確にします。
pdf-libは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();
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からプレーンテキストを抽出することに特化しています。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はMozillaのPDF.jsの公式配布版で、ブラウザでのPDF表示を実現します。CanvasやSVGを使って高品質にレンダリングし、テキスト選択や検索もサポートします。
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はテキストの位置情報まで取得できるため、ハイライトや注釈の実装に使えます。ただし、バンドルサイズが大きいため、表示不要なら使わない方が賢明です。
多くのアプリでは、これらのライブラリを組み合わせて使います。
pdf-libでテンプレートにユーザー情報を埋め込むpdfjs-distで表示pdf-libで署名画像をPDFに合成pdf-parseを使用してテキストを抽出pdfjs-distで元のPDFを表示| 機能 | pdf-lib | pdf-parse | pdfjs-dist |
|---|---|---|---|
| PDF生成 | ✅ | ❌ | ❌ |
| PDF編集 | ✅ | ❌ | ❌ |
| テキスト抽出 | ❌ | ✅ (プレーンテキスト) | ✅ (位置情報付き) |
| ブラウザ表示 | ❌ | ❌ | ✅ |
| Node.js対応 | ✅ | ✅ | ⚠️ (制限あり) |
| ブラウザ対応 | ✅ | ❌ | ✅ |
pdf-libpdf-parse、フロントエンドならpdfjs-distpdfjs-dist一択誤解しやすい点として、「テキスト抽出=pdf-parse」と思いがちですが、ブラウザ環境ではpdf-parseは使えません。その場合はpdfjs-distのgetTextContent()を使う必要があります。
最後に:これらのライブラリは競合ではなく補完関係です。要件に応じて適切に組み合わせることで、堅牢なPDFワークフローを構築できます。
pdfjs-distはブラウザ上でPDFを表示・操作する必要がある場合に必須です。高品質なレンダリング、ページナビゲーション、テキスト選択、検索といった機能を提供します。また、テキストレイヤーを取得するAPIもあり、解析用途にも使えますが、バンドルサイズが大きいため、表示が不要なら他の軽量な選択肢を検討すべきです。
pdf-parseはPDFからテキストを抽出したい場合に選ぶべきです。Node.js環境でのバックエンド処理に特化しており、ブラウザでは動作しません。シンプルなAPIで手軽にテキスト取得が可能ですが、レイアウト情報やフォントスタイルなどのメタデータは取得できません。大量のPDFをバッチ処理してテキストインデックスを作成するような用途に適しています。
pdf-libはPDFの生成や編集が必要な場合に最適です。例えば、動的に契約書を作成したり、既存のPDFに署名や日付を追加したりするユースケースに向いています。ただし、PDFの描画(画面表示)や高度なテキスト抽出には対応していません。軽量でTypeScriptサポートも充実しているため、フロントエンドでのPDF操作に信頼性があります。
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.