1tomany/pdf-pack-bundle

Symfony bundle for the 1tomany/pdf-pack library

Maintainers

Package info

github.com/1tomany/pdf-pack-bundle

Type:symfony-bundle

pkg:composer/1tomany/pdf-pack-bundle

Statistics

Installs: 0

Dependents: 0

Suggesters: 0

Stars: 1

Open Issues: 0

v0.6.1 2026-03-05 07:08 UTC

This package is auto-updated.

Last update: 2026-03-05 07:09:36 UTC


README

This package wraps the 1tomany/pdf-pack library into an easy to use Symfony bundle.

Installation

composer require 1tomany/pdf-pack-bundle

Configuration

Below is the complete configuration for this bundle. To customize it for your Symfony application, create a file named onetomany_pdfpack.yaml in config/packages/ and make the necessary changes.

onetomany_pdfpack:
    client: "poppler"
    poppler_client:
        pdfinfo_binary: "pdfinfo"
        pdftoppm_binary: "pdftppm"
        pdftotext_binary: "pdftotext"

when@test:
    onetomany_pdfpack:
        client: "mock"

Usage

Symfony will autowire the necessary classes after the bundle is installed. Any constructor argument typed with OneToMany\PdfPack\Contract\Action\ExtractActionInterface or OneToMany\PdfPack\Contract\Action\ReadActionInterface will allow you to interact with the concrete extractor client via the act() method.

<?php

namespace App\File\Action\Handler;

use OneToMany\PdfPack\Contract\Action\ExtractActionInterface;
use OneToMany\PdfPack\Contract\Action\ReadActionInterface;
use OneToMany\PdfPack\Request\ExtractRequest;
use OneToMany\PdfPack\Request\ReadRequest;

final readonly class UploadFileHandler
{
    public function __construct(
        private ReadActionInterface $readAction,
        private ExtractActionInterface $extractAction,
    ) {
    }

    public function handle(string $filePath): void
    {
        // Read PDF metadata like page count
        $request = new ReadRequest($filePath);

        // @see OneToMany\PdfPack\Response\ReadResponse
        $response = $this->readAction->act($request);

        // Rasterize all pages of a PDF
        $request = new ExtractRequest($filePath)
            ->fromPage(1) // First page to extract
            ->toPage(null) // Last page to extract, NULL for all pages
            ->asPngOutput() // Generate PNG images
            ->atResolution(150); // At 150 DPI

        // @see OneToMany\PdfPack\Response\ExtractResponse
        foreach ($this->extractAction->act($request) as $page) {
            // $page->getData() or $page->toDataUri()
        }

        // Extract text from pages 2 through 8
        $request = new ExtractRequest($filePath, 2, 8)->asTextOutput();

        // @see OneToMany\PdfPack\Response\ExtractResponse
        foreach ($this->extractAction->act($request) as $page) {
            // $page->getData() or $page->toDataUri()
        }
    }
}

Testing

If you wish to avoid interacting with an external process in your test environment, you can take advantage of the MockClient by simply setting the onetomany_pdfpack.client parameter to the value "mock" in your Symfony service configuration for the test environment.

when@test:
    onetomany_pdfpack:
        client: "mock"

Without changing any other code, Symfony will automatically inject the MockClient instead of the default PopplerClient for your tests.

Creating your own client

Don't want to use Poppler? No problem! Create your own extractor class that implements the OneToMany\PdfPack\Contract\Client\ClientInterface interface and tag it accordingly.

<?php

namespace App\PdfPack\Client\Magick;

use OneToMany\PdfPack\Contract\Client\ClientInterface;
use OneToMany\PdfPack\Contract\Request\ExtractRequest;
use OneToMany\PdfPack\Contract\Request\ReadRequest;
use OneToMany\PdfPack\Contract\Response\ReadResponse;

final readonly class MagickClient implements ClientInterface
{
    public function read(ReadRequest $request): ReadResponse
    {
        // Add your implementation here
    }

    public function extract(ExtractRequest $request): \Generator
    {
        // Add your implementation here
    }
}
onetomany_pdfpack:
    client: "magick"

services:
    App\PdfPack\Client\Magick\MagickClient:
        tags:
            - { name: onetomany.pdfpack.client, key: magick }

That's it! Again, without changing any code, Symfony will automatically inject the correct extractor client for the action interfaces outlined above.

Credits

License

The MIT License