PHPackages                             kauffinger/php-pdftk-mcpdf - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [PDF &amp; Document Generation](/categories/documents)
4. /
5. kauffinger/php-pdftk-mcpdf

ActiveLibrary[PDF &amp; Document Generation](/categories/documents)

kauffinger/php-pdftk-mcpdf
==========================

A PDF conversion and form utility based on mikehaertl/pdftk and vigicorp/php-mcpdf. Dynamically usable with mcpdf.

0.13.2(4y ago)0345—0%MITPHPPHP &gt;=5.3.0

Since Jul 11Pushed 4y agoCompare

[ Source](https://github.com/kauffinger/php-pdftk-mcpdf)[ Packagist](https://packagist.org/packages/kauffinger/php-pdftk-mcpdf)[ RSS](/packages/kauffinger-php-pdftk-mcpdf/feed)WikiDiscussions master Synced 1mo ago

READMEChangelogDependencies (3)Versions (54)Used By (0)

php-pdftk-mcpdf
===============

[](#php-pdftk-mcpdf)

[![GitHub Tests](https://github.com/mikehaertl/php-pdftk/workflows/Tests/badge.svg)](https://github.com/mikehaertl/php-pdftk/actions)[![Packagist Version](https://camo.githubusercontent.com/4f1bb4fbbc7745acd7fed1a7bf34365d883f49a4b10836f2cd47d689efa80288/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f6d696b6568616572746c2f7068702d706466746b3f6c6162656c3d76657273696f6e)](https://packagist.org/packages/mikehaertl/php-pdftk)[![Packagist Downloads](https://camo.githubusercontent.com/f09d34d89ff6fdb439faa8d3c191057b6bba59e634828df4ab7a913fef60f77f/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f6d696b6568616572746c2f7068702d706466746b)](https://packagist.org/packages/mikehaertl/php-pdftk)[![GitHub license](https://camo.githubusercontent.com/3983126f6c328443804935a635381c6398899fd866f418b9dcd74fe0f2b89a7d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f6d696b6568616572746c2f7068702d706466746b)](https://github.com/mikehaertl/php-pdftk/blob/master/LICENSE)[![Packagist PHP Version Support](https://camo.githubusercontent.com/e8bc26a1b35fff498736f83f14f6ef3b82afa0441de786867146008815886464/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f7068702d762f6d696b6568616572746c2f7068702d706466746b)](https://packagist.org/packages/mikehaertl/php-pdftk)

A PDF conversion and form utility based on pdftk AND mcpdf.

This is a crude integration of mcpdf as an extra layer - use php-pdftk custom commands to use mcpdf. This is specifically meant to be used when filling forms with UTF-8 characters. NOTE: This implementation depends upon you having symlinked "mcpdf" to execute mcpdf.

Features
--------

[](#features)

*php-pdftk-mcpd* brings the full power of `pdftk` and `mcpdf` to PHP - and more.

- Fill forms, either from a XFDF/FDF file or from a data array (UTF-8 safe for unflattened forms, requires pdftk 2.x !)
- Create XFDF or FDF files from PHP arrays (UTF-8 safe!)
- Create FDF files from filled PDF forms
- Combine pages from several PDF files into a new PDF file
- Split a PDF into one file per page
- Add background or overlay PDFs
- Read out meta data about PDF and form fields
- Set passwords and permissions
- Remove passwords

Requirements
------------

[](#requirements)

- The `pdftk` command must be installed and working on your system
- The `mcpdf` command must be installed and working on your system if you want to write UTF-8 chars
- This library is written for pdftk 2.x versions. You should be able to use it with pdftk 1.x but not all methods will work there. For details consult the man page of pdftk on your system.
- There is a [known issue](https://github.com/mikehaertl/php-pdftk/issues/150)on Ubuntu if you installed the `pdftk` package from snap. This version has no permission to write to the `/tmp` directory. You can either set another temporary directory as described below or use another package. For Ubuntu 18.10 there's also a `pdftk-java` package available via apt which should work fine. You can also install this package on Ubuntu 18.04 if you download it manually. Also check [this answer](https://askubuntu.com/a/1028983/175814)on askubuntu.

> **Note:** The pdftk version from the alternative PPA `ppa:malteworld/ppa` is no longer available. The author instead now points to his answer on askubuntu linked above.

Installation
------------

[](#installation)

This is meant as a drop-in replacement for your local `php-pdftk` installation. There is no composer package yet.

Examples
--------

[](#examples)

### Create instance for PDF files

[](#create-instance-for-pdf-files)

There are several ways to tell the `Pdf` instance which file(s) it should use. Some files may also require a password or need an alias to be used as a handle in some operations (e.g. cat or shuffle).

> **Note:** In version 2.x of pdftk a handle can be one or more upper case letters.

```
// Create an instance for a single file
$pdf = new Pdf('/path/to/form.pdf');

// Alternatively add files later. Handles are autogenerated in this case.
$pdf = new Pdf();
$pdf->addFile('/path/to/file1.pdf');
$pdf->addFile('/path/to/file2.pdf');

// Add files with own handle
$pdf = new Pdf();
$pdf->addFile('/path/to/file1.pdf', 'A');
$pdf->addFile('/path/to/file2.pdf', 'B');
// Add file with handle and password
$pdf->addFile('/path/to/file3.pdf', 'C', 'secret*password');

// Shortcut to pass all files to the constructor
$pdf = new Pdf([
  'A' => ['/path/to/file1.pdf', 'secret*password1'],
  'B' => ['/path/to/file2.pdf', 'secret*password2'],
]);
```

### Operations

[](#operations)

Please consult the `pdftk` man page for each operation to find out how each operation works in detail and which options are available.

For all operations you can either save the PDF locally through `saveAs($name)` or send it to the browser with `send()`. If you pass a filename to `send($name)` the client browser will open a download dialogue whereas without a filename it will usually display the PDF inline.

**IMPORTANT: You can always only perform *one* of the following operations on a single PDF instance. Below you can find a workaround if you need multiple operations.**

#### Fill Form

[](#fill-form)

Fill a PDF form with data from a PHP array or an XFDF/FDF file. Note how the Pdf instance is created using the options array.

```
use mikehaertl\pdftk\Pdf;

// Fill form with data array
$pdf = new Pdf('/full/path/to/form.pdf', [
            'command' => 'mcpdf'
        ]);
$result = $pdf->fillForm([
        'name'=>'ÄÜÖ äüö мирано čárka',
        'nested.name' => 'valX',
    ])
    ->needAppearances()
    ->saveAs('filled.pdf');

// Always check for errors
if ($result === false) {
    $error = $pdf->getError();
}

// Fill form from FDF
$pdf = new Pdf('form.pdf');
$result = $pdf->fillForm('data.xfdf')
    ->saveAs('filled.pdf');
if ($result === false) {
    $error = $pdf->getError();
}
```

**Note:** When filling in UTF-8 data, you should always add the `needAppearances()` option. This will make sure, that the PDF reader takes care of using the right fonts for rendering, something that pdftk can't do for you. Also note that `flatten()` doesn't really work well if you have special characters in your data.

#### Create a XFDF/FDF file from a PHP array

[](#create-a-xfdffdf-file-from-a-php-array)

This is a bonus feature that is not available from `pdftk`.

```
use mikehaertl\pdftk\XfdfFile;
use mikehaertl\pdftk\FdfFile;

$xfdf = new XfdfFile(['name' => 'Jürgen мирано']);
$xfdf->saveAs('/path/to/data.xfdf');

$fdf = new FdfFile(['name' => 'Jürgen мирано']);
$fdf->saveAs('/path/to/data.fdf');
```

#### Cat

[](#cat)

Assemble a PDF from pages from one or more PDF files.

```
use mikehaertl\pdftk\Pdf;

// Extract pages 1-5 and 7,4,9 into a new file
$pdf = new Pdf('/path/to/my.pdf');
$result = $pdf->cat(1, 5)
    ->cat([7, 4, 9])
    ->saveAs('/path/to/new.pdf');
if ($result === false) {
    $error = $pdf->getError();
}

// Combine pages from several files
$pdf = new Pdf([
    'A' => '/path/file1.pdf',                 // A is alias for file1.pdf
    'B' => ['/path/file2.pdf','pass**word'],  // B is alias for file2.pdf
    'C' => ['/path/file3.pdf','secret**pw'],  // C is alias for file3.pdf
]);
$result = $pdf->cat(1, 5, 'A')                // pages 1-5 from A
    ->cat(3, null, 'B')             // page 3 from B
    ->cat(7, 'end', 'B', null, 'east') // pages 7-end from B, rotated East
    ->cat('end',3,'A','even')       // even pages 3-end in reverse order from A
    ->cat([2,3,7], 'C')             // pages 2,3 and 7 from C
    ->saveAs('/path/new.pdf');
if ($result === false) {
    $error = $pdf->getError();
}
```

#### Shuffle

[](#shuffle)

Like `cat()` but create "*streams*" and fill the new PDF with one page from each stream at a time.

```
use mikehaertl\pdftk\Pdf;

$pdf = new Pdf([
    'A' => '/path/file1.pdf',     // A is alias for file1.pdf
    'B' => '/path/file2.pdf',     // B is alias for file2.pdf
]);

// new.pdf will have pages A1, B3, A2, B4, A3, B5, ...
$result = $pdf->shuffle(1, 5, 'A')    // pages 1-5 from A
    ->shuffle(3, 8, 'B')    // pages 3-8 from B
    ->saveAs('/path/new.pdf');
if ($result === false) {
    $error = $pdf->getError();
}
```

#### Burst

[](#burst)

Split a PDF file into one file per page.

```
use mikehaertl\pdftk\Pdf;

$pdf = new Pdf('/path/my.pdf');
$result = $pdf->burst('/path/page_%d.pdf');     // Supply a printf() pattern
if ($result === false) {
    $error = $pdf->getError();
}
```

#### Add background PDF

[](#add-background-pdf)

Add another PDF file as background.

```
use mikehaertl\pdftk\Pdf;

// Set background from another PDF (first page repeated)
$pdf = new Pdf('/path/my.pdf');
$result = $pdf->background('/path/back.pdf')
    ->saveAs('/path/watermarked.pdf');
if ($result === false) {
    $error = $pdf->getError();
}

// Set background from another PDF (one page each)
$pdf = new Pdf('/path/my.pdf');
$result = $pdf->multiBackground('/path/back_pages.pdf')
    ->saveAs('/path/watermarked.pdf');
if ($result === false) {
    $error = $pdf->getError();
}
```

#### Add overlay PDF

[](#add-overlay-pdf)

Add another PDF file as overlay.

```
use mikehaertl\pdftk\Pdf;

// Stamp with another PDF (first page repeated)
$pdf = new Pdf('/path/my.pdf');
$result = $pdf->stamp('/path/overlay.pdf')
    ->saveAs('/path/stamped.pdf');
if ($result === false) {
    $error = $pdf->getError();
}

// Stamp with another PDF (one page each)
$pdf = new Pdf('/path/my.pdf');
$result = $pdf->multiStamp('/path/overlay_pages.pdf')
    ->saveAs('/path/stamped.pdf');
if ($result === false) {
    $error = $pdf->getError();
}
```

#### Attach Files

[](#attach-files)

Add file attachments to the document or to a specific page.

```
use mikehaertl\pdftk\Pdf;

$files = [
    '/path/to/file1',
    '/path/to/file2',
]

// Add files at the document level
$pdf = new Pdf('/path/my.pdf');
$result = $pdf->attachFiles($files)
    ->saveAs('/path/withfiles.pdf');
if ($result === false) {
    $error = $pdf->getError();
}

// Add files to a specific page
$pdf = new Pdf('/path/my.pdf');
$page = 7;
$result = $pdf->attachFiles($files, $page)
    ->saveAs('/path/withfiles.pdf');
if ($result === false) {
    $error = $pdf->getError();
}
```

#### Unpack Files

[](#unpack-files)

Copy file attachments from a PDF to the given directory.

```
use mikehaertl\pdftk\Pdf;

$pdf = new Pdf('/path/my.pdf');
$result = $pdf->unpackFiles('/path/to/dir');
if ($result === false) {
    $error = $pdf->getError();
}
```

#### Generate FDF

[](#generate-fdf)

Create a FDF file from a given filled PDF form.

```
use mikehaertl\pdftk\Pdf;

// Create FDF from PDF
$pdf = new Pdf('/path/form.pdf');
$result = $pdf->generateFdfFile('/path/data.fdf');
if ($result === false) {
    $error = $pdf->getError();
}
```

#### Get PDF data

[](#get-pdf-data)

Read out metadata or form field information from a PDF file.

```
use mikehaertl\pdftk\Pdf;

// Get data
$pdf = new Pdf('/path/my.pdf');
$data = $pdf->getData();
if ($data === false) {
    $error = $pdf->getError();
}

// Get form data fields
$pdf = new Pdf('/path/my.pdf');
$data = $pdf->getDataFields();
if ($data === false) {
    $error = $pdf->getError();
}

// Get data as string
echo $data;
$txt = (string) $data;
$txt = $data->__toString();

// Get data as array
$arr = (array) $data;
$arr = $data->__toArray();
$field1 = $data[0]['Field1'];
```

#### How to perform more than one operation on a PDF

[](#how-to-perform-more-than-one-operation-on-a-pdf)

As stated above, you can only perform one of the preceeding operations on a single PDF instance. If you need more than one operation you can feed one `Pdf` instance into another:

```
use mikehaertl\pdftk\Pdf;

// Extract pages 1-5 and 7,4,9 into a new file
$pdf = new Pdf('/path/my.pdf');
$pdf->cat(1, 5)
    ->cat([7, 4, 9]);

// We now use the above PDF as source file for a new PDF
$pdf2 = new Pdf($pdf);
$result = $pdf2->fillForm(['name' => 'ÄÜÖ äüö мирано čárka'])
    ->needAppearances()
    ->saveAs('/path/filled.pdf');
if ($result === false) {
    $error = $pdf->getError();
}
```

### Options

[](#options)

You can combine the above operations with one or more of the following options.

```
use mikehaertl\pdftk\Pdf;

$pdf = new Pdf('/path/my.pdf');

$result = $pdf->allow('AllFeatures')      // Change permissions
    ->flatten()                 // Merge form data into document (doesn't work well with UTF-8!)
    ->compress($value)          // Compress/Uncompress
    ->keepId('first')           // Keep first/last Id of combined files
    ->dropXfa()                 // Drop newer XFA form from PDF
    ->dropXmp()                 // Drop newer XMP data from PDF
    ->needAppearances()         // Make clients create appearance for form fields
    ->setPassword($pw)          // Set owner password
    ->setUserPassword($pw)      // Set user password
    ->passwordEncryption(128)   // Set password encryption strength
    ->saveAs('new.pdf');
if ($result === false) {
    $error = $pdf->getError();
}

// Example: Fill PDF form and merge form data into PDF
// Fill form with data array
$result = $pdf = new Pdf('/path/form.pdf');
$pdf->fillForm(['name' => 'My Name'])
    ->flatten()
    ->saveAs('/path/filled.pdf');
if ($result === false) {
    $error = $pdf->getError();
}

// Example: Remove password from a PDF
$pdf = new Pdf;
$result = $pdf->addFile('/path/my.pdf', null, 'some**password')
    ->saveAs('/path/new.pdf');
if ($result === false) {
    $error = $pdf->getError();
}
```

### Shell Command

[](#shell-command)

The class uses [php-shellcommand](https://github.com/mikehaertl/php-shellcommand) to execute `pdftk`. You can pass `$options` for its `Command` class as second argument to the constructor:

```
use mikehaertl\pdftk\Pdf;

$pdf = new Pdf('/path/my.pdf', [
    'command' => '/some/other/path/to/pdftk',
    // or on most Windows systems:
    // 'command' => 'C:\Program Files (x86)\PDFtk\bin\pdftk.exe',
    'useExec' => true,  // May help on Windows systems if execution fails
]);
```

### Temporary File

[](#temporary-file)

Internally a temporary file is created via [php-tmpfile](https://github.com/mikehaertl/php-tmpfile). You can also access that file directly, e.g. if you neither want to send or save the file but only need the binary PDF content:

```
use mikehaertl\pdftk\Pdf;

$pdf = new Pdf('/path/my.pdf');
$result = $pdf->fillForm(['name' => 'My Name'])
    ->execute();
if ($result === false) {
    $error = $pdf->getError();
}
$content = file_get_contents( (string) $pdf->getTmpFile() );
```

If you have permission issues you may have to set a directory where your `pdftk` command can write to:

```
use mikehaertl\pdftk\Pdf;

$pdf = new Pdf('/path/my.pdf');
$pdf->tempDir = '/home/john/temp';
```

API
---

[](#api)

Please consult the source files for a full documentation of each method.

###  Health Score

31

—

LowBetter than 68% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity16

Limited adoption so far

Community16

Small or concentrated contributor base

Maturity62

Established project with proven stability

 Bus Factor1

Top contributor holds 77.1% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~81 days

Recently: every ~36 days

Total

36

Last Release

1485d ago

PHP version history (2 changes)0.1.0PHP &gt;=5.0.0

0.4.0PHP &gt;=5.3.0

### Community

Maintainers

![](https://www.gravatar.com/avatar/c0e9a29e1307758a7b7ebb40231f8fbf69522d6fa2b125652d1e8dc48c9f38c7?d=identicon)[kauffinger](/maintainers/kauffinger)

---

Top Contributors

[![mikehaertl](https://avatars.githubusercontent.com/u/675062?v=4)](https://github.com/mikehaertl "mikehaertl (121 commits)")[![kauffinger](https://avatars.githubusercontent.com/u/62616071?v=4)](https://github.com/kauffinger "kauffinger (7 commits)")[![bravadomizzou](https://avatars.githubusercontent.com/u/1663615?v=4)](https://github.com/bravadomizzou "bravadomizzou (7 commits)")[![mcdope](https://avatars.githubusercontent.com/u/3312979?v=4)](https://github.com/mcdope "mcdope (5 commits)")[![ah017](https://avatars.githubusercontent.com/u/1122168?v=4)](https://github.com/ah017 "ah017 (3 commits)")[![chaos0815](https://avatars.githubusercontent.com/u/915071?v=4)](https://github.com/chaos0815 "chaos0815 (3 commits)")[![allforme3](https://avatars.githubusercontent.com/u/11186922?v=4)](https://github.com/allforme3 "allforme3 (2 commits)")[![phoenixrvd](https://avatars.githubusercontent.com/u/3441385?v=4)](https://github.com/phoenixrvd "phoenixrvd (1 commits)")[![rhynodesigns](https://avatars.githubusercontent.com/u/2198266?v=4)](https://github.com/rhynodesigns "rhynodesigns (1 commits)")[![sukrosono](https://avatars.githubusercontent.com/u/3001652?v=4)](https://github.com/sukrosono "sukrosono (1 commits)")[![axessweb](https://avatars.githubusercontent.com/u/1068898?v=4)](https://github.com/axessweb "axessweb (1 commits)")[![Ayesh](https://avatars.githubusercontent.com/u/811553?v=4)](https://github.com/Ayesh "Ayesh (1 commits)")[![boesing](https://avatars.githubusercontent.com/u/2189546?v=4)](https://github.com/boesing "boesing (1 commits)")[![busgurlu](https://avatars.githubusercontent.com/u/1284742?v=4)](https://github.com/busgurlu "busgurlu (1 commits)")[![ibpavlov](https://avatars.githubusercontent.com/u/3340235?v=4)](https://github.com/ibpavlov "ibpavlov (1 commits)")[![peterchaula](https://avatars.githubusercontent.com/u/13304490?v=4)](https://github.com/peterchaula "peterchaula (1 commits)")

---

Tags

pdfpdftk

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/kauffinger-php-pdftk-mcpdf/health.svg)

```
[![Health](https://phpackages.com/badges/kauffinger-php-pdftk-mcpdf/health.svg)](https://phpackages.com/packages/kauffinger-php-pdftk-mcpdf)
```

###  Alternatives

[mikehaertl/php-pdftk

A PDF conversion and form utility based on pdftk.

1.0k10.9M11](/packages/mikehaertl-php-pdftk)[barryvdh/laravel-dompdf

A DOMPDF Wrapper for Laravel

7.3k87.6M276](/packages/barryvdh-laravel-dompdf)[mikehaertl/phpwkhtmltopdf

A slim PHP wrapper around wkhtmltopdf with an easy to use and clean OOP interface

1.6k20.0M43](/packages/mikehaertl-phpwkhtmltopdf)[tecnickcom/tcpdf

TCPDF is a PHP class for generating PDF documents and barcodes.

4.5k101.8M472](/packages/tecnickcom-tcpdf)[mpdf/mpdf

PHP library generating PDF files from UTF-8 encoded HTML

4.7k77.1M491](/packages/mpdf-mpdf)[knplabs/knp-snappy

PHP library allowing thumbnail, snapshot or PDF generation from a url or a html page. Wrapper for wkhtmltopdf/wkhtmltoimage.

4.5k68.3M56](/packages/knplabs-knp-snappy)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
