CHANGELOG.md

# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

## [0.2.0] - 2026-01-09

### Added

- Add render_page/2 function to convert PDF pages to PNG or JPEG images (thanks @nyo16!)

## [0.1.0] - 2025-10-10

### Added
- Initial release of Popplex - Elixir NIF wrapper for Poppler PDF library
- **Get page count** - `Popplex.get_page_count/1` function to retrieve the number of pages in a PDF file
  - Returns `{:ok, count}` on success or `{:error, reason}` on failure
  - Supports both string and charlist paths
  - Fast NIF-based implementation using Poppler C++ API
- **Extract text content** - `Popplex.get_text/2` function to extract text from PDF documents
  - Extract text from all pages (default behavior)
  - Extract text from a specific page using `page: n` option (0-indexed)
  - Returns extracted text as binary string
  - Handles multi-page documents with page separators
- **Combine PDFs** - `Popplex.combine_pdfs/2` function to merge multiple PDF files
  - Uses `pdfunite` command-line tool (part of Poppler utilities)
  - Validates minimum 2 input files required
  - Checks file existence with helpful error messages
  - Returns `{:ok, output_path}` on success
- C++ NIF implementation (`c_src/popplex_nif.cpp`) using Poppler library
  - Memory-safe with RAII patterns and smart pointers
  - Proper error handling and informative error messages
  - Binary string returns for UTF-8 text content
- Comprehensive test suite
  - Unit tests for error cases and edge conditions
  - Integration tests with real PDF fixtures
  - 11 tests covering all major functionality
- Build system with `elixir_make`
  - Cross-platform Makefile for macOS and Linux
  - Automatic NIF compilation during `mix compile`
  - pkg-config integration for Poppler dependencies
- Complete documentation
  - Installation instructions for multiple platforms
  - Usage examples with error handling
  - API documentation with @spec types
  - Development guide and testing instructions
- GitHub Actions CI/CD pipeline
  - Tests against multiple Elixir/OTP version combinations (1.16-1.18, OTP 26-27)
  - Automated dependency installation (Poppler, build tools)
  - Unit and integration test runs
  - Code formatting and static analysis checks
  - Dependency caching for faster builds
- Contributing guidelines in `.github/CONTRIBUTING.md`
  - Development setup instructions
  - Code quality standards
  - PR process and checklist

### Technical Details
- Elixir 1.18+ compatibility
- OTP 26+ support
- C++11 standard
- Poppler C++ API binding
- NIF-based for native performance on page count and text extraction
- Command-line tool integration for PDF combining

[Unreleased]: https://github.com/mylanconnolly/popplex/compare/v0.1.0...HEAD
[0.1.0]: https://github.com/mylanconnolly/popplex/releases/tag/v0.1.0
[0.2.0]: https://github.com/mylanconnolly/popplex/releases/tag/v0.2.0