Skip to content

fix: prevent dangling refs from surviving full-save renumbering - #92

Merged
Mythie merged 1 commit into
mainfrom
fix/dangling-ref-object-collisions
Aug 31, 2026
Merged

fix: prevent dangling refs from surviving full-save renumbering#92
Mythie merged 1 commit into
mainfrom
fix/dangling-ref-object-collisions

Conversation

@Mythie

@Mythie Mythie commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Refs to undefined objects kept their old numbers through renumbering,
so later signing updates could reuse those numbers and break signature
validation. Dangling refs are now written as null per PDF 1.7 §7.3.10.

Refs to undefined objects kept their old numbers through renumbering,
so later signing updates could reuse those numbers and break signature
validation. Dangling refs are now written as null per PDF 1.7 §7.3.10.
@vercel

vercel Bot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
core Ready Ready Preview Aug 28, 2026 5:21am

@github-actions

Copy link
Copy Markdown
Contributor

Benchmark Results

Comparison

Load PDF

Benchmark Mean p99 RME Samples
libpdf 18.67ms 20.14ms ±1.8% 27
pdf-lib 220.49ms 230.00ms ±1.5% 10
@cantoo/pdf-lib 213.90ms 221.84ms ±1.0% 10

Create blank PDF

Benchmark Mean p99 RME Samples
libpdf 70μs 164μs ±2.0% 7133
pdf-lib 357μs 1.32ms ±2.5% 1403
@cantoo/pdf-lib 471μs 1.66ms ±2.8% 1061

Add 10 pages

Benchmark Mean p99 RME Samples
libpdf 124μs 260μs ±1.0% 4044
pdf-lib 436μs 1.82ms ±3.3% 1150
@cantoo/pdf-lib 453μs 2.37ms ±4.5% 1103

Draw 50 rectangles

Benchmark Mean p99 RME Samples
libpdf 367μs 1.07ms ±1.8% 1363
pdf-lib 1.61ms 6.98ms ±8.9% 310
@cantoo/pdf-lib 1.78ms 4.85ms ±7.3% 283

Load and save PDF

Benchmark Mean p99 RME Samples
libpdf 18.49ms 27.19ms ±4.2% 28
pdf-lib 326.59ms 340.43ms ±1.5% 10
@cantoo/pdf-lib 597.17ms 610.71ms ±1.0% 10

Load, modify, and save PDF

Benchmark Mean p99 RME Samples
libpdf 333.40ms 348.98ms ±1.4% 10
pdf-lib 316.84ms 326.15ms ±1.4% 10
@cantoo/pdf-lib 550.65ms 595.66ms ±3.7% 10

Extract single page from 100-page PDF

Benchmark Mean p99 RME Samples
libpdf 3.47ms 4.17ms ±0.7% 144
pdf-lib 8.76ms 11.91ms ±2.0% 58
@cantoo/pdf-lib 9.20ms 10.43ms ±1.6% 55

Split 100-page PDF into single-page PDFs

Benchmark Mean p99 RME Samples
libpdf 39.50ms 45.81ms ±3.1% 13
pdf-lib 77.08ms 95.20ms ±10.1% 7
@cantoo/pdf-lib 76.63ms 79.45ms ±3.0% 7

Split 2000-page PDF into single-page PDFs (0.9MB)

Benchmark Mean p99 RME Samples
libpdf 749.76ms 749.76ms ±0.0% 1
pdf-lib 1.33s 1.33s ±0.0% 1
@cantoo/pdf-lib 1.41s 1.41s ±0.0% 1

Copy 10 pages between documents

Benchmark Mean p99 RME Samples
libpdf 4.47ms 5.25ms ±1.2% 112
pdf-lib 11.28ms 13.21ms ±1.2% 45
@cantoo/pdf-lib 13.16ms 21.01ms ±3.6% 38

Merge 2 x 100-page PDFs

Benchmark Mean p99 RME Samples
libpdf 14.55ms 15.44ms ±0.9% 35
pdf-lib 51.36ms 53.23ms ±1.5% 10
@cantoo/pdf-lib 61.39ms 62.62ms ±0.9% 9

Fill FINTRAC form fields

Benchmark Mean p99 RME Samples
libpdf 20.20ms 25.45ms ±3.0% 25
pdf-lib 27.54ms 36.14ms ±5.4% 19
@cantoo/pdf-lib 27.15ms 36.53ms ±5.2% 19

Fill and flatten FINTRAC form

Benchmark Mean p99 RME Samples
libpdf 17.62ms 24.69ms ±4.7% 29
pdf-lib FAILED - - 0
@cantoo/pdf-lib 30.09ms 41.25ms ±5.6% 17
Copying

Copy pages between documents

Benchmark Mean p99 RME Samples
copy 1 page 1.13ms 2.21ms ±2.6% 444
copy 10 pages from 100-page PDF 4.70ms 8.52ms ±2.5% 107
copy all 100 pages 8.03ms 9.98ms ±1.3% 63

Duplicate pages within same document

Benchmark Mean p99 RME Samples
duplicate page 0 1.00ms 1.40ms ±0.8% 498
duplicate all pages (double the document) 1.01ms 1.36ms ±0.7% 497

Merge PDFs

Benchmark Mean p99 RME Samples
merge 2 small PDFs 1.57ms 2.00ms ±1.2% 319
merge 10 small PDFs 8.14ms 12.89ms ±2.7% 62
merge 2 x 100-page PDFs 14.69ms 20.58ms ±2.5% 35
Drawing

benchmarks/drawing.bench.ts

Benchmark Mean p99 RME Samples
draw 100 rectangles 605μs 1.26ms ±1.7% 827
draw 100 circles 914μs 1.70ms ±1.4% 547
draw 100 lines 564μs 1.15ms ±1.2% 888
draw 100 text lines (standard font) 1.64ms 2.77ms ±1.6% 305
create 10 pages with mixed content 1.49ms 3.13ms ±2.2% 337
Forms

benchmarks/forms.bench.ts

Benchmark Mean p99 RME Samples
get form fields 3.21ms 6.68ms ±4.5% 156
fill text fields 12.64ms 16.63ms ±3.4% 40
read field values 2.84ms 5.30ms ±2.3% 177
flatten form 7.99ms 9.01ms ±1.0% 63
Loading

benchmarks/loading.bench.ts

Benchmark Mean p99 RME Samples
load small PDF (888B) 62μs 179μs ±1.4% 8036
load medium PDF (19KB) 90μs 125μs ±0.4% 5546
load form PDF (116KB) 1.32ms 2.57ms ±1.7% 380
load heavy PDF (2.0MB) 18.54ms 19.39ms ±1.1% 27
Saving

benchmarks/saving.bench.ts

Benchmark Mean p99 RME Samples
save unmodified (19KB) 115μs 310μs ±2.9% 4358
save with modifications (19KB) 843μs 1.64ms ±1.8% 593
incremental save (19KB) 178μs 370μs ±1.2% 2810
save heavy PDF (2.0MB) 17.91ms 18.31ms ±0.7% 28
incremental save heavy PDF (2.0MB) 19.13ms 22.17ms ±1.8% 27
Splitting

Extract single page

Benchmark Mean p99 RME Samples
extractPages (1 page from small PDF) 1.13ms 2.20ms ±2.9% 442
extractPages (1 page from 100-page PDF) 3.52ms 4.07ms ±0.7% 143
extractPages (1 page from 2000-page PDF) 58.42ms 73.10ms ±6.4% 10

Split into single-page PDFs

Benchmark Mean p99 RME Samples
split 100-page PDF (0.1MB) 40.19ms 44.59ms ±2.1% 13
split 2000-page PDF (0.9MB) 718.92ms 718.92ms ±0.0% 1

Batch page extraction

Benchmark Mean p99 RME Samples
extract first 10 pages from 2000-page PDF 55.65ms 56.79ms ±0.7% 9
extract first 100 pages from 2000-page PDF 60.06ms 62.08ms ±1.4% 9
extract every 10th page from 2000-page PDF (200 pages) 66.46ms 67.90ms ±1.2% 8
Environment
  • Runner: Linux (X64)
  • Runtime: Bun 1.4.0
  • Libraries: @libpdf/core 0.4.1 (this repo), pdf-lib 1.17.1, @cantoo/pdf-lib 2.9.1

Results are machine-dependent.

@Mythie
Mythie merged commit ae05108 into main Aug 31, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant