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ファイルを数行のコードで単一のドキュメントにマージできます。 各ファイルを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オブジェクトの配列を受け入れ、ソースドキュメントが配列に表示されている順序で各ページを含む新しいドキュメントを返します。 この操作は非破壊的です。元のファイルオブジェクトは変更されません。

//: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()は、より大きなコレクションを処理する場合に重要な並列でソースファイルを読み込みます。 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, 2は最初の3ページを抽出します。 ループは、merge()がそれらを最終出力に連結します。

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

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


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

私のお気に入りのこの種のライブラリはIronPDFです。PDFファイルの迅速で効率的な操作が可能です。また、PDF/A形式へのエクスポートやPDF文書へのデジタル署名といった多くの貴重な機能も備えています。

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

Milan Jovanovic

Microsoft MVP

ケーススタディを見る
Icon Quote related to 各PDFから特定のページをマージするにはどうすればよいですか?

IronOCRのおかげで私たちは年間$40,000を手作業の処理から節約し、生産性を向上させ、高影響のタスクにリソースを充てることができます。非常にお勧めします。

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

Brent Matzelle

最高技術責任者, OPYN

ケーススタディを見る
Icon Quote related to 各PDFから特定のページをマージするにはどうすればよいですか?

IronSuiteは私たちの業務において重要な役割を果たしています。これらは、フロアプランの作成や在庫管理の改善を含め、ビジネス全体の効率を向上させるツールです。

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

David Jones

リードソフトウェアエンジニア、Agorus Build

ケーススタディを見る

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

マージ後、結果ドキュメントで一貫したヘッダーとフッターを全ページに適用するために、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

マージされたドキュメントのページ数に対してレンダリング時に{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を設定することで、受信者は文書を印刷できますが、編集、コピー、および注釈は防止されます。 利用可能な権限フラグの完全なリストについては、IronPDF Node.js APIリファレンスを参照してください。

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


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

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

//: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.js fs.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.6 リリースされたばかり
Still Scrolling Icon

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

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