Combine several PDFs into one file, in the order you choose. Built on your device, with text and links kept.
Merging copies each page object as it is. The map below follows your list above: change the order or skip a page and it redraws.
A PDF isn't one long picture, it's a set of numbered objects: pages, fonts, images and a table of contents that ties them together. Step through a merge.
Each PDF is opened and its object table is read, every page, font and image gets an ID number. Nothing is rendered or changed yet.
Your browser just built three small PDFs. Each one numbers its objects from 1 and carries its own copy of Helvetica, and two of them embed the same logo. Merge them with or without sharing duplicates, then download every file and open it. The byte counts are real.
1 0 obj << /Type /Catalog /Pages 2 0 R /Outlines 3 0 R /PageMode /UseOutlines >>2 0 obj << /Type /Pages /Kids [9 0 R 11 0 R 14 0 R 16 0 R 18 0 R 20 0 R 22 0 R] /Count 7 >>
Object numbers can be renumbered silently. But some things are looked up by name or stored once per document, and two files often use the same names. Pick one to see what goes wrong and how a careful merger handles it.
/AcroForm /Fields (Name) = "Ana Ruiz" (Date) = "2026-03-31"
/AcroForm /Fields (Name) = "" (Sign) signature
The most common merge problems, why they happen and the quickest fix.
The same job in the six tools you're most likely to find on a server or in a script. Most copy objects structurally, as this page does. Ghostscript is the exception: it redraws every page.
qpdf --empty --pages a.pdf b.pdf -- out.pdfStructural copy with renumbering. Document-level data such as bookmarks comes only from the primary input, which here is empty.pdftk a.pdf b.pdf cat output out.pdfStructural copy. Handles let you pick ranges from each input: A=a.pdf B=b.pdf cat A1-3 B2 output out.pdf.pdfunite a.pdf b.pdf out.pdfJoins whole files in order. No page selection, and no options.mutool merge -o out.pdf a.pdf 1-3 b.pdfStructural copy. A page range can follow each input file.w = PdfWriter(); w.append("a.pdf"); w.append("b.pdf"); w.write("out.pdf")Structural copy from code. append() also accepts page ranges and outline options.gs -sDEVICE=pdfwrite -o out.pdf a.pdf b.pdfInterprets every page and writes a new PDF. Fonts and images are rebuilt and can be recompressed, so it is not a lossless copy.Merging is usually one step of a bigger job. These tools handle what comes before or after, all in your browser, no upload.