X Enterprises
fastify-xpdf

mergePDFs

Merge multiple PDF buffers into a single document using pdf-lib.

mergePDFs

Merge an ordered array of PDF buffers into a single document using pdf-lib. All pages from each source are appended in order.

Signature

fastify.xPDF.mergePDFs(
  pdfBuffers: Buffer[],
  options?: MergeOptions,
): Promise<MergeResult>

interface MergeOptions {
  filename?: string
  saveToStorage?: boolean
  folder?: string
}

interface MergeResult {
  buffer: Buffer
  filename: string
  size: number
  pageCount: number          // total pages in merged output
  storageKey?: string
  url?: string
}

Params

NameTypeRequiredDescription
pdfBuffersBuffer[]YesNon-empty array of valid PDF buffers, merged in order
options.filenamestringNoOutput filename
options.saveToStoragebooleanNoUpload result to xStorage
options.folderstringNoStorage folder override

Returns

MergeResult — includes pageCount (total pages in the merged document) in addition to the standard PdfResult fields.

Throws

ErrorWhen
[xPDF] pdfBuffers must be a non-empty array...pdfBuffers is empty, null, or not an array
[xPDF] One or more invalid PDF buffers providedAny buffer in the array doesn't start with %PDF
[xPDF] Failed to process PDF during mergeCorrupt or unreadable PDF encountered

Examples

Combine cover page, body, and appendix

fastify.post("/contracts/:id/compile", async (request, reply) => {
  const [cover, body, appendix] = await Promise.all([
    fastify.xPDF.generateFromHtml(coverHtml),
    fastify.xPDF.generateFromHtml(bodyHtml),
    fastify.xPDF.generateFromHtml(appendixHtml),
  ]);

  const { buffer, pageCount, filename } = await fastify.xPDF.mergePDFs(
    [cover.buffer, body.buffer, appendix.buffer],
    { filename: `contract-${request.params.id}.pdf` },
  );

  return reply
    .header("Content-Type", "application/pdf")
    .header("Content-Disposition", `attachment; filename="${filename}"`)
    .send(buffer);
});

Merge multiple uploaded PDFs and save to storage

fastify.post("/documents/merge", async (request, reply) => {
  const parts = await request.saveRequestFiles();
  const buffers = await Promise.all(parts.map((p) => p.toBuffer()));

  const { url, pageCount } = await fastify.xPDF.mergePDFs(buffers, {
    saveToStorage: true,
    folder: "merged",
    filename: `merged-${Date.now()}.pdf`,
  });

  return { url, pageCount };
});

See Also

AI Context

package: "@xenterprises/fastify-xpdf"
method: fastify.xPDF.mergePDFs(pdfBuffers, options?)
use-when: Merge multiple PDF buffers into a single document using pdf-lib
params: pdfBuffers (Buffer[]), options ({ saveToStorage, filename, folder })
returns: { buffer, size, pageCount } | { buffer, size, pageCount, storageKey, url }
Copyright © 2026