The project is in a healthy, maintained state
Lightweight Ruby library for inspecting PDF binary headers, counting /Type /Page dictionary objects, validating xref tables, and merging multiple PDF byte streams.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
 Dependencies
 Project Readme

utilvo-pdf-merger

Lightweight, zero-dependency library for inspecting PDF binary headers (%PDF-1.x), counting /Type /Page objects, validating cross-reference (xref) tables, and merging multiple PDF byte streams into a single document with renumbered indirect objects.

Built as the open-source companion library for the Merge PDF document processing utility, utilvo-pdf-merger allows developers to pre-validate PDF buffers, verify %%EOF markers, count total pages across multi-file batches, and concatenate uncompressed PDF streams programmatically in Node.js, Python, Go, Rust, PHP, Ruby, Elixir, Dart, Swift, Lua, and .NET.

Architecture & How It Works

When combining multiple PDF files into a single document, raw byte concatenation is invalid because each PDF file contains its own independent object numbering (1 0 obj, 2 0 obj, ...) and a byte-offset cross-reference (xref) table at the end of the file:

  1. Header & Integrity Inspection (inspectPdf / inspect_pdf): Reads the first 1,024 bytes of each buffer to verify the %PDF-1.x specification header and scans the trailer for a valid %%EOF marker.
  2. Page Tree Counting (countPdfPages / count_pdf_pages): Scans indirect dictionary objects matching /Type /Page\b(?!s) to count leaf page nodes while excluding parent /Type /Pages catalog containers.
  3. Indirect Object Renumbering & xref Reconstruction (mergePdfBuffers / merge_pdf_bytes): Extracts page content streams across all input documents, assigns sequential object IDs under a unified /Type /Pages root array (/Kids [...]), and calculates exact byte offsets (%010d 00000 n ) to emit a standards-compliant xref table and trailer dictionary.

Installation

Node.js (npm)

npm install utilvo-pdf-merger

Python (PyPI)

pip install utilvo-pdf-merger

Rust (Cargo)

cargo add utilvo-pdf-merger

Go

go get github.com/utilvo/utilvo-pdf-merger

Dart / Flutter

dart pub add utilvo_pdf_merger

Elixir (Hex)

{:utilvo_pdf_merger, "~> 1.0"}

Ruby (RubyGems)

gem install utilvo-pdf-merger

Usage Examples

JavaScript / TypeScript

import { inspectPdf, countPdfPages, mergePdfBuffers } from 'utilvo-pdf-merger';

// 1. Inspect an individual PDF buffer before merging
const info = inspectPdf(pdfBytes);
console.log(info.version, info.pageCount, info.isValid);

// 2. Merge multiple PDF byte buffers into a single PDF document
const mergedBytes = mergePdfBuffers([pdfBufferA, pdfBufferB]);

Python

from utilvo_pdf_merger import inspect_pdf, count_pdf_pages, merge_pdf_bytes

# 1. Validate PDF header, EOF marker, and page count
info = inspect_pdf(pdf_bytes)
print(info["version"], info["page_count"], info["is_valid"])

# 2. Merge multiple PDF byte streams into a unified PDF
merged = merge_pdf_bytes([pdf_a, pdf_b])

Rust

use utilvo_pdf_merger::{inspect_pdf, count_pdf_pages, merge_pdf_buffers};

let info = inspect_pdf(&pdf_bytes);
assert!(info.is_valid);

let merged = merge_pdf_buffers(&[&pdf_a, &pdf_b]);

Go

import utilvopdfmerger "github.com/utilvo/utilvo-pdf-merger"

info := utilvopdfmerger.InspectPdf(pdfBytes)
merged, err := utilvopdfmerger.MergePdfBuffers([][]byte{pdfA, pdfB})

API Reference

Function Parameters Returns Description
inspectPdf / inspect_pdf bytes: Uint8Array | bytes PdfInspectionResult Extracts PDF specification version (1.4–2.0), page count, and %%EOF integrity status.
countPdfPages / count_pdf_pages bytes: Uint8Array | bytes number Counts leaf /Type /Page dictionary entries (excluding /Type /Pages parent nodes).
mergePdfBuffers / merge_pdf_bytes documents: Array<Uint8Array | bytes> Uint8Array | bytes Extracts page content streams and constructs a consolidated PDF document with a unified /Pages root and rebuilt xref table.

License

MIT