pdfrx_engine

Build Test

pdfrx_engine is a platform-agnostic PDF rendering and manipulation engine built on top of PDFium. It provides low-level PDF document APIs for viewing, editing, combining PDF documents, and importing images without any Flutter dependencies, making it suitable for use in pure Dart applications, CLI tools, or server-side PDF processing.

This package depends on pdfium_dart for PDFium FFI bindings and is a part of pdfrx Flutter plugin, which adds UI widgets and Flutter-specific features on top of this engine.

Multi-platform support

  • Android
  • iOS
  • Windows
  • macOS
  • Linux (even on Raspberry Pi)
  • Web (WASM) supported only on Flutter by pdfrx

Example Codes

Page Image Export

The following fragment illustrates how to use the PDF engine to load and render a PDF file:

import 'dart:io';
import 'package:image/image.dart' as img;
import 'package:pdfrx_engine/pdfrx_engine.dart';

void main() async {
  await pdfrxInitialize();

  final document = await PdfDocument.openFile('test.pdf');
  final page = document.pages[0]; // first page
  final pageImage = await page.render(
    width: page.width * 200 / 72,
    height: page.height * 200 / 72,
  );
  final image = pageImage!.createImageNF();
  await File('output.png').writeAsBytes(img.encodePng(image));
  pageImage.dispose();
  document.close();
}

You should call pdfrxInitialize() before using any PDF engine APIs to ensure the native PDFium library is properly loaded. For more information, see pdfrx Initialization

Page Manipulation Example

The following example demonstrates how to combine pages from multiple PDF documents:

import 'dart:io';
import 'package:pdfrx_engine/pdfrx_engine.dart';

void main() async {
  await pdfrxInitialize();

  // Open source PDF documents
  final doc1 = await PdfDocument.openFile('document1.pdf');
  final doc2 = await PdfDocument.openFile('document2.pdf');

  // Create a new PDF document
  final outputDoc = await PdfDocument.createNew(sourceName: 'combined.pdf');

  // Combine pages: first 3 pages from doc1, all pages from doc2, last page from doc1
  outputDoc.pages = [
    ...doc1.pages.sublist(0, 3),
    ...doc2.pages,
    doc1.pages.last,
  ];

  // Save the combined PDF
  final pdfData = await outputDoc.encodePdf();
  await File('combined.pdf').writeAsBytes(pdfData);

  // Clean up
  doc1.dispose();
  doc2.dispose();
  outputDoc.dispose();
}

Image-to-PDF Conversion Example

The following example shows how to convert JPEG images to PDF:

import 'dart:io';
import 'package:pdfrx_engine/pdfrx_engine.dart';

void main() async {
  await pdfrxInitialize();

  // Load JPEG image data
  final jpegData = await File('photo.jpg').readAsBytes();

  // Create PDF from JPEG (A4 size: 595 x 842 points)
  final doc = await PdfDocument.createFromJpegData(
    jpegData,
    width: 595,
    height: 842,
    sourceName: 'photo.pdf',
  );

  // Save to file
  final pdfData = await doc.encodePdf();
  await File('output.pdf').writeAsBytes(pdfData);

  doc.dispose();
}

For more complex examples including selective page combining with range specifications, see pdfcombine.dart.

For detailed guides and tutorials, see the documentation:

PDF API

When to Use pdfrx_engine vs. pdfrx

Use pdfrx_engine when:

  • Building CLI tools or server applications
  • You need PDF rendering without Flutter UI
  • Creating custom PDF processing pipelines
  • Working in pure Dart environments

Use pdfrx when:

  • Building Flutter applications
  • You need ready-to-use PDF viewer widgets
  • You want features like text selection, search, and zoom controls
  • You prefer high-level APIs with Flutter integration

Libraries

pdfrx_engine