Node.jsを使ってPDFファイルを1つのPDFにマージする方法

This article was translated from English: Does it need improvement?
Translated
View the article in English

IronPDFを使用すると、Node.jsで複数のPDFファイルを数行のコードで単一のドキュメントにマージできます。 各ファイルを PdfDocument.fromFile() で読み込み、配列を PdfDocument.merge() に渡し、結果を toFile() で保存します。

Quickstart: PDFファイルをマージas-heading:2()

//:path=/static-assets/pdf/content-code-examples/how-to/nodejs-merge-pdf/quickstart-merge.js
// Install: npm install ironpdf
const IronPdf = require('ironpdf');

async function quickMerge() {
  const docs = await Promise.all([
    IronPdf.PdfDocument.fromFile('doc1.pdf'),
    IronPdf.PdfDocument.fromFile('doc2.pdf'),
    IronPdf.PdfDocument.fromFile('doc3.pdf'),
  ]);
  const merged = await IronPdf.PdfDocument.merge(docs);
  await merged.toFile('merged-output.pdf');
}

quickMerge();
//:path=/static-assets/pdf/content-code-examples/how-to/nodejs-merge-pdf/quickstart-merge.js
// Install: npm install ironpdf
const IronPdf = require('ironpdf');

async function quickMerge() {
  const docs = await Promise.all([
    IronPdf.PdfDocument.fromFile('doc1.pdf'),
    IronPdf.PdfDocument.fromFile('doc2.pdf'),
    IronPdf.PdfDocument.fromFile('doc3.pdf'),
  ]);
  const merged = await IronPdf.PdfDocument.merge(docs);
  await merged.toFile('merged-output.pdf');
}

quickMerge();
JAVASCRIPT

IronPDFは、HTMLからPDFへの変換、ドキュメントのアセンブリ、システムレベルのPDFツールを使用せずにPDFの変更を行うNode.js用のPDF操作ライブラリです。 ドキュメントをマージする際には、各ソースファイルからフォント、画像、埋め込みフォーム、ページの幾何学情報を保持します。

本番環境にデプロイする前に、IronPDFライセンスキーを設定して、トライアルの透かしを削除し、完全な出力を有効にしてください。 オペレーティングシステム用のレンダリングエンジンを設定するには、IronPdfEngineの構成ガイドに従ってください。


Node.jsで複数のPDFファイルをマージする方法は?

PdfDocument.merge()PdfDocument オブジェクトの配列を受け取り、ソースドキュメントが配列に現れる順序で各ページを含む新しいドキュメントを返します。 この操作は非破壊的です。元のファイルオブジェクトは変更されません。

//:path=/static-assets/pdf/content-code-examples/how-to/nodejs-merge-pdf/merge-pdfs.js
const IronPdf = require('ironpdf');

async function mergePdfs(outputFilePath, inputFiles) {
  // Load all source documents in parallel
  const pdfDocs = await Promise.all(
    inputFiles.map(file => IronPdf.PdfDocument.fromFile(file))
  );

  // Combine into one document, preserving page order
  const mergedPdf = await IronPdf.PdfDocument.merge(pdfDocs);

  // Write the result to disk
  await mergedPdf.toFile(outputFilePath);
  console.log(`Merged PDF saved to ${outputFilePath}`);
}

(async () => {
  const inputFiles = ['report-jan.pdf', 'report-feb.pdf', 'report-mar.pdf'];
  await mergePdfs('quarterly-report.pdf', inputFiles);
})();
//:path=/static-assets/pdf/content-code-examples/how-to/nodejs-merge-pdf/merge-pdfs.js
const IronPdf = require('ironpdf');

async function mergePdfs(outputFilePath, inputFiles) {
  // Load all source documents in parallel
  const pdfDocs = await Promise.all(
    inputFiles.map(file => IronPdf.PdfDocument.fromFile(file))
  );

  // Combine into one document, preserving page order
  const mergedPdf = await IronPdf.PdfDocument.merge(pdfDocs);

  // Write the result to disk
  await mergedPdf.toFile(outputFilePath);
  console.log(`Merged PDF saved to ${outputFilePath}`);
}

(async () => {
  const inputFiles = ['report-jan.pdf', 'report-feb.pdf', 'report-mar.pdf'];
  await mergePdfs('quarterly-report.pdf', inputFiles);
})();
JAVASCRIPT

Promise.all() はソースファイルを1つずつではなく並列で読み込みます。これは、大規模なコレクションを処理する際に重要です。 merge() 呼び出しは、ドキュメントを配列の順序通りに連結するため、出力で表示させたい順序でファイルを配列に配置してください。

ヒントファイルパスを絶対パスとして、またはNode.jsプロセスの作業ディレクトリに相対的なパスとして渡します。 fromFile() メソッドは、スクリプトファイル自体を基準とした相対パスを解決しません。

コードの各部分は何をするのですか?

  • PdfDocument.fromFile(): ディスクからPDFを読み込み、PdfDocumentオブジェクトを返します。 完全なメソッドシグネチャについては、IronPDF for Node.js APIリファレンスを参照してください。
  • Promise.all(): すべてのファイル読み込み操作を同時に実行し、複数のドキュメントをマージする際の総読み込み時間を短縮します。 このパターンは、マルチスレッドおよび同時実行のPDF生成シナリオにも適しています。
  • PdfDocument.merge(): 読み込まれたドキュメントの配列を単一の PdfDocument に連結し、各ソースの書式、画像、および埋め込みコンテンツをすべて保持します。
  • toFile(): 結合されたドキュメントを指定されたパスに書き込みます。 PDF圧縮と組み合わせて、必要に応じて出力ファイルサイズを削減します。

各PDFから特定のページをマージするにはどうすればよいですか?

すべてのソースドキュメントからすべてのページを渡すことは常に目標とは限りません。 各入力ファイルから特定のページ範囲を結合するには、ドキュメントを merge() に渡す前に、必要なページを抽出してください。

//:path=/static-assets/pdf/content-code-examples/how-to/nodejs-merge-pdf/merge-specific-pages.js
const IronPdf = require('ironpdf');

// Each entry specifies a file and the range of pages to include (zero-indexed)
const pageRanges = [
  { file: 'contract.pdf',  startPage: 0, endPage: 2 },
  { file: 'appendix.pdf',  startPage: 0, endPage: 0 },
  { file: 'signature.pdf', startPage: 0, endPage: 0 },
];

async function mergeSpecificPages(outputFile, ranges) {
  const pdfsToMerge = [];

  for (const range of ranges) {
    const pdf = await IronPdf.PdfDocument.fromFile(range.file);
    // extractPages returns a new PdfDocument with only the specified page range
    const pages = pdf.extractPages(range.startPage, range.endPage);
    pdfsToMerge.push(pages);
  }

  const merged = await IronPdf.PdfDocument.merge(pdfsToMerge);
  await merged.toFile(outputFile);
}

mergeSpecificPages('assembled-contract.pdf', pageRanges);
//:path=/static-assets/pdf/content-code-examples/how-to/nodejs-merge-pdf/merge-specific-pages.js
const IronPdf = require('ironpdf');

// Each entry specifies a file and the range of pages to include (zero-indexed)
const pageRanges = [
  { file: 'contract.pdf',  startPage: 0, endPage: 2 },
  { file: 'appendix.pdf',  startPage: 0, endPage: 0 },
  { file: 'signature.pdf', startPage: 0, endPage: 0 },
];

async function mergeSpecificPages(outputFile, ranges) {
  const pdfsToMerge = [];

  for (const range of ranges) {
    const pdf = await IronPdf.PdfDocument.fromFile(range.file);
    // extractPages returns a new PdfDocument with only the specified page range
    const pages = pdf.extractPages(range.startPage, range.endPage);
    pdfsToMerge.push(pages);
  }

  const merged = await IronPdf.PdfDocument.merge(pdfsToMerge);
  await merged.toFile(outputFile);
}

mergeSpecificPages('assembled-contract.pdf', pageRanges);
JAVASCRIPT

extractPages(startPage, endPage) は0から始まるページインデックスを受け付けます。 0, 0 を指定すると最初のページのみが抽出され、0, 2 を指定すると最初の 3 ページが抽出されます。 このループは、merge()でそれらを連結して最終出力とします。

このパターンは、別々のファイルに保管されている署名ページ、付録、および表紙から契約を組み立てる際に役立ちます。 ソースごとに重要なページを正確に収集することができ、ディスク上でファイルを重複させることはありません。

ご注意IronPDFのページインデックスはゼロベースです。 ドキュメントのページ1はインデックス0、ページ2はインデックス1、以降同様です。)}]


マージされたPDFにヘッダーとフッターを追加する方法

マージ後、結果のドキュメントで addHtmlHeader() および addHtmlFooter() を呼び出し、すべてのページでヘッダーとフッターが統一されるようにしてください。 これらのメソッドはHTML文字列とオプションオブジェクトを受け入れます。

//:path=/static-assets/pdf/content-code-examples/how-to/nodejs-merge-pdf/merge-with-headers-footers.js
const IronPdf = require('ironpdf');

async function mergeWithHeadersFooters(inputFiles, outputFile) {
  const docs = await Promise.all(
    inputFiles.map(f => IronPdf.PdfDocument.fromFile(f))
  );
  const mergedPdf = await IronPdf.PdfDocument.merge(docs);

  // Apply a styled header to every page
  await mergedPdf.addHtmlHeader('<h3 style="color:#333;">Quarterly Report</h3>', {
    height: 25,
    drawDividerLine: true,
  });

  // Apply a page-numbering footer
  await mergedPdf.addHtmlFooter('<p style="font-size:10px;">Page {page} of {total-pages}</p>', {
    height: 20,
    drawDividerLine: true,
  });

  await mergedPdf.toFile(outputFile);
}

mergeWithHeadersFooters(['q1.pdf', 'q2.pdf', 'q3.pdf'], 'annual-report.pdf');
//:path=/static-assets/pdf/content-code-examples/how-to/nodejs-merge-pdf/merge-with-headers-footers.js
const IronPdf = require('ironpdf');

async function mergeWithHeadersFooters(inputFiles, outputFile) {
  const docs = await Promise.all(
    inputFiles.map(f => IronPdf.PdfDocument.fromFile(f))
  );
  const mergedPdf = await IronPdf.PdfDocument.merge(docs);

  // Apply a styled header to every page
  await mergedPdf.addHtmlHeader('<h3 style="color:#333;">Quarterly Report</h3>', {
    height: 25,
    drawDividerLine: true,
  });

  // Apply a page-numbering footer
  await mergedPdf.addHtmlFooter('<p style="font-size:10px;">Page {page} of {total-pages}</p>', {
    height: 20,
    drawDividerLine: true,
  });

  await mergedPdf.toFile(outputFile);
}

mergeWithHeadersFooters(['q1.pdf', 'q2.pdf', 'q3.pdf'], 'annual-report.pdf');
JAVASCRIPT

{page} および {total-pages} プレースホルダーは、レンダリング時にマージされたドキュメントのページ数に基づいて解決されます。 drawDividerLine: true を使用して、ヘッダーやフッターをページ本文から視覚的に区切ってください。

マージ後にヘッダーとフッターを適用することで、結合ドキュメントのすべてのページに同じ処理が施され、ソースファイルに関係なく同じ結果を得られます。 ヘッダーとフッターの完全な構成オプションについては、HTMLヘッダーとフッターの例を参照してください。


パスワードでマージされたPDFを保護する方法

マージ後に、セキュリティオプションオブジェクトを使用して saveAs() を呼び出すことで、パスワード保護とアクセス制限を適用してください。 これにより、結合されたドキュメントへの不正アクセスを防ぎます。

//:path=/static-assets/pdf/content-code-examples/how-to/nodejs-merge-pdf/merge-with-security.js
const IronPdf = require('ironpdf');

async function mergeWithSecurity(inputFiles, outputFile) {
  const docs = await Promise.all(
    inputFiles.map(f => IronPdf.PdfDocument.fromFile(f))
  );
  const mergedPdf = await IronPdf.PdfDocument.merge(docs);

  // Restrict the merged document to print-only access
  await mergedPdf.saveAs(outputFile, {
    userPassword: 'viewerpass',
    ownerPassword: 'adminpass',
    allowUserAnnotations: false,
    allowUserCopyPasteContent: false,
    allowUserFormData: false,
    allowUserPrinting: true,
  });
}

mergeWithSecurity(['invoice-1.pdf', 'invoice-2.pdf'], 'secured-invoices.pdf');
//:path=/static-assets/pdf/content-code-examples/how-to/nodejs-merge-pdf/merge-with-security.js
const IronPdf = require('ironpdf');

async function mergeWithSecurity(inputFiles, outputFile) {
  const docs = await Promise.all(
    inputFiles.map(f => IronPdf.PdfDocument.fromFile(f))
  );
  const mergedPdf = await IronPdf.PdfDocument.merge(docs);

  // Restrict the merged document to print-only access
  await mergedPdf.saveAs(outputFile, {
    userPassword: 'viewerpass',
    ownerPassword: 'adminpass',
    allowUserAnnotations: false,
    allowUserCopyPasteContent: false,
    allowUserFormData: false,
    allowUserPrinting: true,
  });
}

mergeWithSecurity(['invoice-1.pdf', 'invoice-2.pdf'], 'secured-invoices.pdf');
JAVASCRIPT

userPassword を入力してドキュメントを開いてください。 ownerPassword は、権限設定そのものを制御します。 他の権限フラグを無効にした状態で allowUserPrinting: true を設定すると、受信者はドキュメントをPRINTできますが、編集、コピー、および注釈の追加はできなくなります。 利用可能な権限フラグの完全なリストについては、IronPDF Node.js APIリファレンスを参照してください。

重要ソースPDFがすでにパスワードで保護されている場合は、fromFile()を使用して読み込む際に、各ドキュメントの復号用パスワードを指定してください。 パスワードを指定せずに暗号化されたドキュメントをマージしようとするとエラーになります。)}]


PDFをマージし、デジタル署名を追加する方法

PDFをマージしてすぐに結果を署名すると、すべてのソースコンテンツをカバーする単一の署名付きドキュメントが生成されます。 結合された出力にデジタル証明書を添付するには、merge() の後に applySignature() を適用してください。

//:path=/static-assets/pdf/content-code-examples/how-to/nodejs-merge-pdf/merge-with-signature.js
const IronPdf = require('ironpdf');

async function mergeAndSign(inputFiles, outputFile, pfxPath, pfxPassword) {
  const docs = await Promise.all(
    inputFiles.map(f => IronPdf.PdfDocument.fromFile(f))
  );
  const mergedPdf = await IronPdf.PdfDocument.merge(docs);

  // Attach a digital signature using a PFX certificate
  await mergedPdf.applySignature(pfxPath, pfxPassword);
  await mergedPdf.toFile(outputFile);
}

mergeAndSign(
  ['section-a.pdf', 'section-b.pdf'],
  'signed-report.pdf',
  'certificate.pfx',
  'certpass'
);
//:path=/static-assets/pdf/content-code-examples/how-to/nodejs-merge-pdf/merge-with-signature.js
const IronPdf = require('ironpdf');

async function mergeAndSign(inputFiles, outputFile, pfxPath, pfxPassword) {
  const docs = await Promise.all(
    inputFiles.map(f => IronPdf.PdfDocument.fromFile(f))
  );
  const mergedPdf = await IronPdf.PdfDocument.merge(docs);

  // Attach a digital signature using a PFX certificate
  await mergedPdf.applySignature(pfxPath, pfxPassword);
  await mergedPdf.toFile(outputFile);
}

mergeAndSign(
  ['section-a.pdf', 'section-b.pdf'],
  'signed-report.pdf',
  'certificate.pfx',
  'certpass'
);
JAVASCRIPT

applySignature() メソッドは、証明書を PDF メタデータに埋め込むことで、読者がドキュメントの完全性を検証できるようにします。 このワークフローは、契約組み立てパイプラインで複数のセクションを結合し、配布前に共署名する場合によく使用されます。 証明書ベースの署名についての完全な手順は、デジタル署名の例を参照してください。

ヒント結合されたドキュメントに署名し、個々のソースファイルではなく、単一の証明書で結合された全体のドキュメントを証明するときに必要です。


一般的なPDFマージエラーをトラブルシュートする方法

マージ中のエラーのほとんどは、ファイルがない、メモリ不足、入力が壊れている、権限の問題の4つのカテゴリーに分類されます。 以下の表には、最も頻繁に発生する原因と各問題への対策が記載されています。

一般的なPDFマージエラーとその解決策
エラー考えられる原因ソリューション
ファイルが見つかりません間違ったパスまたは作業ディレクトリの不一致絶対パスを使用するか、プロセス作業ディレクトリを確認してください
JavaScriptヒープのメモリ不足多くの大きなPDFを同時に読み込むNode.jsメモリを増やします:node --max-old-space-size=4096 script.js
無効または壊れたPDFソースファイルが損傷しているか、有効なPDFではありません処理前にPDFリーダーでソースファイルを検証してください
権限が拒否されました入力に読み取りアクセスがない、または出力ディレクトリに書き込みアクセスがないオペレーティングシステムのファイルとディレクトリの権限を確認してください
暗号化されたソースPDF入力PDFには開くためのパスワードが必要ですパスワードを第二引数としてfromFile()に渡します

環境固有のセットアップ問題については、IronPDF変更履歴に既知の問題と修正が記載されています。 上記の表を確認しても問題が解決しない場合は、マージ呼び出しを try-catch ブロックで囲み、ライブラリからの完全なエラーメッセージを表示させてください。

注意fromFile() を呼び出す前に、入力配列内のすべてのファイルパスが存在することを必ず確認してください。 1つのファイルが欠落しているだけで、Promise.all() 呼び出し全体が拒否され、マージがキャンセルされます。)}]

Node.js自体がフライト前のパス検証のための便利なツールを提供します。 Node.jsfs.promises.accessメソッドを使用すると、IronPDFにファイルを渡す前に、そのファイルが読み取り可能かどうかを確認できます。 コミュニティ開発者が類似のマージエラ―シナリオをどのように処理しているかの質問については、Node.jsでのPDFマージに関するStack Overflowスレッドが追加のコンテキストを提供します。


Node.jsでのPDFマージの次のステップは何ですか?

上記の例では、最も一般的なマージシナリオをカバーしています:基本的なファイル結合、ページ範囲の選択、ヘッダーとフッターの挿入、パスワード保護、デジタル署名。 IronPDFは、マージされたページを通じたPDFフォームの管理新しいコンテンツのスタンプ、最終出力からのラスタライズされた画像の生成もサポートします。

30日間の無料トライアルを開始して、透かしなしでのマージをテストするか、ライセンスオプションを確認して導入を考慮します。

IronPDFの他の機能をご覧になりたいですか? 完全なAPIのウォークスルーと追加のガイドについては、IronPDF for Node.jsのドキュメントを参照してください。

よくある質問

Node.jsで複数のPDFファイルを1つに結合するにはどうすればいいですか?

PdfDocument.fromFile()を使用して各ファイルを読み込み、結果を配列に集め、その配列をPdfDocument.merge()に渡し、toFile()で出力を保存します。3つ以上のドキュメントをマージする際には、ファイルを並行して読み込むためにPromise.all()を使用してください。

IronPDF は PDF を結合するときに書式を保持しますか?

はい。IronPDF は、各ソースドキュメントからフォント、画像、埋め込みフォーム、およびページのジオメトリを保持します。結合された出力は、入力配列内にあるソースファイルの順番で、各ページの元のレイアウトを維持します。

各PDFから特定のページのみをマージするにはどうすればよいですか?

それぞれの読み込まれたドキュメントに対して、PdfDocument.merge()に渡す前にextractPages(startPage, endPage)を呼び出してください。ページのインデックスは0から始まるため、最初のページはインデックス0となります。返されるドキュメントには指定された範囲のみが含まれています。

結合されたPDFにヘッダーやフッターを追加できますか?

はい。マージ後、結果として生じたドキュメントに対してaddHtmlHeader()およびaddHtmlFooter()を呼び出します。両メソッドとも、HTML文字列とオプションオブジェクトを受け入れます。自動ページ番号付けには{page}および{total-pages}のプレースホルダーを使用してください。

Node.jsで結合したPDFにパスワードを設定するにはどうすればいいですか?

セキュリティオプションオブジェクトを指定し、userPasswordownerPassword、およびallowUserPrintingのような許可フラグを指定してsaveAs()を呼び出します。userPasswordはドキュメントを開くために必要です。ownerPasswordは許可設定を制御します。

ファイルが見つからないエラーでマージに失敗した場合、どうすればよいですか。

すべての入力ファイルパスがNode.jsプロセスの作業ディレクトリに対して正しいことを確認するか、絶対パスに切り替えてください。fs.promises.access()を使用して、PdfDocument.fromFile()を呼び出す前に各ファイルが読み取り可能であることを確認してください。

ソースPDFの1つが暗号化されている場合はどうなりますか?

暗号化されたPDFをパスワードなしで読み込もうとすると、エラーが発生し、Promise.all()全体の呼び出しが拒否されます。結合する前に、fromFile()の第2引数としてドキュメントのパスワードを指定してください。

IronPDFでPDFをマージするためにライセンスキーは必要ですか?

IronPDFは、開発中にライセンスキーがなくても動作しますが、出力ドキュメントにはトライアルの透かしが含まれます。透かしを削除して完全な機能を有効にするには、実運用環境に展開する前に有効なライセンスキーを設定してください。

Darrius Serrant
フルスタックソフトウェアエンジニア(WebOps)

Darrius Serrantは、マイアミ大学でコンピュータサイエンスの学士号を取得し、Iron SoftwareでフルスタックWebOpsマーケティングエンジニアとして働いています。若い頃からコーディングに惹かれ、コンピューティングを神秘的かつアクセス可能なものとし、創造性と問題解決のための完璧な媒体と考えていました。

Iron Softwareでは、新しいものを創造することと、複雑なコンセプトをより理解しやすくすることを楽しんでいます。Resident Developerの一人として、次世代に専門知識を共有するために、学生を教えることにも志願しました。

Darriusにとって、その仕事は価値があり、実際の影響があるため、満足感があります。

準備はできましたか?
バージョン: 2026.5 just released
Still Scrolling Icon

まだスクロールしていますか?

すぐに証拠が欲しいですか?
サンプルを実行するHTML が PDF に変換されるのを確認します。