Page 41 is where the packet went soft
A closing binder landed back in my inbox with a complaint I have heard too many times: “the first half is fine, the rest looks photocopied.” Pages 1–40 still let me drag a cursor across a sentence. From page 41 the cursor drew a box around a picture of text. Logos that had been vectors were now 110-pixel-wide smears. The file had grown from 18 MB of sources to 64 MB, which is the opposite of what people expect from a “merge and optimize” button.
The second source had been a 46-page scan mixed with a native export from Word. The tool in the middle had not joined PDFs. It had reprinted every page as a JPEG, then wrapped those JPEGs in a new PDF. That is a photo album with a .pdf extension. It opens. It is not the document you started with.
Quality in a merge is mostly a question of whether page objects moved or whether pixels were invented. If you remember one test, use that one. Highlight a word in each source, then highlight the same word in the result.
What a page-copy merge actually does
Merge PDF on PDFSwift loads pdf-lib 1.17.1 in the browser, creates an empty PDFDocument, and for each file you added calls copyPages across every page index. Those page objects are appended in list order and written out with save(). No canvas. No JPEG step. The bytes stay in the tab. There is no upload to a PDFSwift file endpoint for this operation.
On a current laptop, a 12-page text packet finishes in well under two seconds because the work is copying objects, not painting them. A 400-page phone-scan set is a different machine problem. Each source is decoded into memory together, so a phone with little free RAM will stall or kill the tab somewhere around a few hundred megabytes of combined input. Desktop Chrome and Firefox tolerate more. iOS Safari is usually the first to quit.
Practical ceiling, measured by tab crashes rather than a server quota: stay under roughly 150 MB total on a phone, and under roughly 400 MB on an 8 GB desktop. If the status sits on “Merging…” for more than a minute, split the job into two merges and join those results. The second merge is still a page copy. You do not pay a quality tax for doing it in stages.
| Method | Text after export | Size behavior | Wrong job for it |
|---|---|---|---|
pdf-lib copyPages | Still selectable if the source text was real text | Close to the sum of the sources | Shrinking a scan for email |
| Print to PDF from a browser | Often reflowed or subset differently | Unpredictable | Preserving exact page geometry |
| Render-to-JPEG rebuild | Picture of text. Search dies | Can jump up or down depending on DPI | Anything you may still need to copy from |
| Screenshot stitch | Illegible at print size | Bloated | Every professional packet |
Order is a content bug, not a cosmetic one
File pickers sort by name. Your reading order is a story. I prefix files on disk as 01-cover.pdf, 02-agreement.pdf, 03-exhibit-a.pdf because I have shipped a signature page in front of the clause it signs. The list inside the tool is what becomes the page sequence. Numeric names only help if you add the files in that sequence, or if you remove and re-add until the list matches the outline.
A four-file close last month:
01-cover.pdf— 2 pages, 180 KB, native text.02-spa.pdf— 38 pages, 1.1 MB, embedded fonts, a few comment marks we had already accepted.03-disclosure.pdf— 22 pages, 14 MB, mixed scan.04-signature.pdf— 1 page, 90 KB.
Combined result: 63 pages, about 16 MB. I searched for a unique phrase from each file (“Seller’s Knowledge”, “Exhibit A-3”, “IN WITNESS WHEREOF”). All four hits landed. Then I opened the seam between page 40 and 41, because that is where file two ended and the scan began. The scan was still a scan. The SPA text was still text. That is the correct outcome. A merge should not “improve” a scan, and it should not damage a digital page that was already sharp.
Where quality actually dies
It dies in a later step that people confuse with merging. Compress PDF on this site does not squeeze streams in place. It renders each page through PDF.js and rebuilds a PDF of JPEGs. High is scale 1.7 at JPEG 0.88. Balanced is 1.35 / 0.72. Small is 1.05 / 0.58. That is the right tool when a mailbox rejects the attachment. It is the wrong tool to run “just in case” on the archival copy.
Keep two files. packet-2026-04-master.pdf is the page-copy merge. packet-2026-04-email.pdf is the compressed sibling, created only after the master passed the highlight test. If someone later asks for the version the printer can use, you still have it. Overwriting the master with the email copy is how teams lose a week.
Fonts fail for a different reason. If the source PDF never embedded the font, no merge can invent the outlines. Re-export that one file from the authoring app with fonts embedded, then merge again. Substitution that appears only in the combined file usually means a tool subsetted or swapped families while reprinting. Page copy does not do that swap.
Rotation is metadata on the page. A sideways phone scan stays sideways after a clean merge, which is honest and annoying. Fix it first with Rotate PDF, then merge. Doing it afterward also works, but you will rotate inside a larger file and it is easier to miss a page.
What copyPages will not rebuild for you
Bookmarks and the document outline are not reconstructed as a tidy combined table of contents. If readers live in a 200-page packet, add a one-page contents sheet as the first file. Hyperlinks that pointed at a different PDF will dangle. Replace the important ones with page numbers in that cover note.
Form fields and annotations usually travel with the page dictionary, but I do not promise a fillable packet. Test one field after export if someone still has to type into it. For signature packets, place the visible signature after the page order is frozen. Signing a draft order means signing the wrong page when you reshuffle.
Password-protected sources fail inside PDFDocument.load. The status line will say the files need to be valid and unlocked. There is no password prompt on the merge page. Unlock a copy you are allowed to open, merge that copy, and leave the locked original in the archive folder.
Damaged xref tables and half-written incremental saves fail the same way. Open each source alone in a reader before you blame the merge. If a file will not open alone, re-export it from the app that created it.
A short pass I actually run
Add the files. Read the list out loud. Merge. Check page count against the sum. Search one rare string per source. Zoom a logo to 200% on a native page and on a scan page. They should look like their parents, not like each other.
If the count is short, a file was skipped or a range was wrong in an earlier split. If text that used to select no longer selects, you did not merge. You reprinted. Throw that export away and run the page-copy path on the originals.
Mixed page sizes survive. A phone photo page next to A4 is legal PDF. It is also a surprise at the print shop. If the recipient will print, say so in the email, or normalize sizes before the merge. The merge step will not quietly scale everything to A4, and you should not want it to.
For AI work later, this master is the right input only when the model needs the whole story. A 200-page join makes a sloppy summary. Split PDF the chapter you care about, then summarize that piece. Merging and splitting are not in conflict. They are how you control context.