Skip to content
huzpsb edited this page Oct 25, 2026 · 1 revision

Merge

Concatenate PDFs. Three modes: create (default), append to an existing file, and zip (interleave two files page by page).

Command line

pdfcpu2 merge outFile inFile... [flags]
Flag Meaning
-m, --mode create (default) | append | zip
-b, --bookmarks create bookmarks for merged files (skip with -b=false)
--bookmark-mode wrap (default, filename wrapper) | preserve (keep input trees)
-d, --divider insert a blank page between documents
-s, --sort sort inFiles by name
--opt / --optimize optimize before writing (default on; disable with --opt=false)
--rmsig remove signatures
pdfcpu2 merge out.pdf a.pdf b.pdf c.pdf
pdfcpu2 merge -s out.pdf quarterly/*.pdf        # sorted glob
pdfcpu2 merge -m append out.pdf new.pdf         # append to existing out.pdf
pdfcpu2 merge -m zip zipped.pdf odd.pdf even.pdf  # interleave two scans

stdin works for the first inFile in create mode:

cat cover.pdf | pdfcpu2 merge - - chapter1.pdf chapter2.pdf > book.pdf

Go API

package main

import (
	"context"

	"github.com/huzpsb/pdfcpu2/pkg/api"
	"github.com/huzpsb/pdfcpu2/pkg/pdfcpu/model"
)

func main() {
	ctx := context.Background()
	conf := model.NewDefaultConfiguration()

	// Create out.pdf from a list (divider page off)
	err := api.MergeCreateFile(ctx, []string{"a.pdf", "b.pdf"}, "out.pdf", false, conf)
	if err != nil {
		panic(err)
	}

	// Append to an existing file
	err = api.MergeAppendFile(ctx, []string{"c.pdf"}, "out.pdf", false, conf)

	// Zip two files page by page
	err = api.MergeCreateZipFile(ctx, "odd.pdf", "even.pdf", "zipped.pdf", conf)
	_ = err
}

For reader/writer-based streaming use api.Merge(ctx, destFile, inFiles, w, conf, dividerPage) or api.MergeRaw over []io.ReadSeeker.

Clone this wiki locally