An open API service indexing awesome lists of open source software.

https://github.com/kallefrombosnia/tinypdf-php

Minimal PDF creation library for PHP 8.2+. Zero dependencies, strongly typed, clean code.
https://github.com/kallefrombosnia/tinypdf-php

document markdown pdf php tinypdf

Last synced: 6 months ago
JSON representation

Minimal PDF creation library for PHP 8.2+. Zero dependencies, strongly typed, clean code.

Awesome Lists containing this project

README

          

# TinyPDF-PHP


TinyPDF-PHP Preview

[![Tests](https://github.com/kallefrombosnia/tinypdf-php/actions/workflows/tests.yml/badge.svg)](https://github.com/kallefrombosnia/tinypdf-php/actions/workflows/tests.yml)
[![Issues](https://img.shields.io/github/issues/kallefrombosnia/tinypdf-php.svg?style=flat-square)](https://github.com/kallefrombosnia/tinypdf-php/issues)

Minimal PDF creation library for PHP 8.2+. Zero dependencies, strongly typed, clean code architecture.

Port of [tinypdf](https://github.com/Lulzx/tinypdf) from TypeScript to PHP.

## Features

- Create PDFs from scratch with zero dependencies
- Strongly typed with PHP 8.2+ type declarations
- Clean architecture with interfaces and value objects
- Support for text, rectangles, lines, JPEG images, and clickable links
- Built-in markdown to PDF conversion
- Text measurement and alignment
- Color support (hex format)

## Installation

```bash
composer require kallefrombosnia/tinypdf-php
```

## Usage

### Basic PDF Creation

```php
use TinyPdf\TinyPdf;
use TinyPdf\TextOptions;
use TinyPdf\TextAlign;

$pdf = TinyPdf::create();

// Add a page (default US Letter: 612x792 points)
$pdf->page(function ($ctx) {
// Add text
$ctx->text('Hello World!', 50, 700, 24);

// Text with options
$ctx->text(
'Centered text',
50,
650,
16,
new TextOptions(
align: TextAlign::CENTER,
width: 500,
color: '#0066cc'
)
);

// Draw a rectangle
$ctx->rect(50, 600, 200, 100, '#ffcc00');

// Draw a line
$ctx->line(50, 580, 250, 580, '#000000', 2);
});

// Custom page size
$pdf->page(595, 842, function ($ctx) { // A4 size
$ctx->text('A4 Page', 50, 700, 18);
});

// Build and save
$pdfContent = $pdf->build();
file_put_contents('output.pdf', $pdfContent);
```

### Adding Images

```php
$pdf = TinyPdf::create();

$pdf->page(function ($ctx) {
$jpegData = file_get_contents('image.jpg');
$ctx->image($jpegData, 50, 500, 200, 150);
});

file_put_contents('output.pdf', $pdf->build());
```

### Markdown to PDF

```php
use TinyPdf\MarkdownConverter;

$markdown = <<convert($markdown);
file_put_contents('document.pdf', $pdfContent);
```

### Adding Clickable Links

```php
use TinyPdf\LinkOptions;

$pdf = TinyPdf::create();

$pdf->page(function ($ctx) {
$ctx->text('GitHub Repository', 50, 700, 12, new TextOptions(color: '#0066cc'));
$ctx->link('https://github.com/kallefrombosnia/tinypdf-php', 50, 695, 115, 20, new LinkOptions(underline: '#0066cc'));

$ctx->text('Check out Webflow agency', 50, 650, 12, new TextOptions(color: '#95a5a6'));
$ctx->link('https://www.flowout.com/', 50, 645, 150, 20);
});

file_put_contents('output.pdf', $pdf->build());
```

### Text Measurement

```php
use TinyPdf\TinyPdf;

$width = TinyPdf::measureText('Hello World', 24);
echo "Text width: {$width} points\n";
```

## Examples

The library includes several complete examples in the `examples/` directory:

### Running Examples

Run all examples at once:
```bash
php example.php
```

Or run individual examples:
```bash
# Basic text and shapes
php examples/basic/basic.php

# Professional invoice
php examples/invoice/invoice.php

# Markdown to PDF
php examples/markdown/markdown.php

# Multi-page document
php examples/multipage/multipage.php
```

### Available Examples

Each example includes its own README with detailed information and generated PDF output.

- **[Basic](examples/basic/)** - Text rendering, shapes, colors, alignment, and links ([preview](examples/basic/output.pdf))
- **[Invoice](examples/invoice/)** - Professional invoice template ([preview](examples/invoice/output.pdf))
- **[Receipt](examples/receipt/)** - Sales receipt template ([preview](examples/receipt/output.pdf))
- **[Report](examples/report/)** - Business report with charts ([preview](examples/report/output.pdf))
- **[Shipping Label](examples/shipping-label/)** - Package shipping label ([preview](examples/shipping-label/output.pdf))
- **[Markdown](examples/markdown/)** - Convert markdown to PDF ([preview](examples/markdown/output.pdf))
- **[Multi-Page](examples/multipage/)** - Multi-page documents ([preview](examples/multipage/output.pdf))
- **[Ticket](examples/ticket/)** - Event ticket design ([preview](examples/ticket/output.pdf))
- **[Data Export](examples/data-export/)** - Export data tables ([preview](examples/data-export/output.pdf))
- **[Service Agreement](examples/service-agreement/)** - Contract template ([preview](examples/service-agreement/output.pdf))

## API Reference

For detailed API documentation, see the inline documentation in the source code:
- [TinyPdf](src/TinyPdf.php) - Main factory class
- [PageContextInterface](src/Contracts/PageContextInterface.php) - Drawing operations (text, rect, line, image, link)
- [TextOptions](src/TextOptions.php) - Text rendering options
- [LinkOptions](src/LinkOptions.php) - Link configuration
- [MarkdownConverter](src/MarkdownConverter.php) - Markdown to PDF conversion

## Coordinate System

PDF uses a coordinate system where:
- Origin (0, 0) is at the bottom-left corner
- X increases to the right
- Y increases upward
- Units are in points (1/72 inch)

Common page sizes:
- US Letter: 612 x 792 points
- A4: 595 x 842 points

## Testing & Quality

```bash
composer test # Run all tests
composer test:coverage # Run tests with coverage
composer phpstan # Run static analysis
```

**77 tests** with comprehensive coverage including unit tests, architecture tests, and integration tests.

For detailed information about the test suite, coverage, and quality standards, see [tests/README.md](tests/README.md).

## License

MIT

## Credits

This is a PHP port of [tinypdf](https://github.com/Lulzx/tinypdf) by Lulzx.