SetaPDF Demos

Tile a Page

This demo tiles a single PDF document page into multiple pages.

PHP
<?php

// load and register the autoload function
require_once '../../../../../bootstrap.php';

// prepare some files
$files = [
    $assetsDirectory . '/pdfs/Brand-Guide.pdf',
    $assetsDirectory . '/pdfs/camtown/Terms-and-Conditions.pdf'
];

$path = displayFiles($files);

$tileCount = 4;
$pageNumber = 1;

if (($tileCount & ($tileCount - 1)) !== 0) {
    throw new InvalidArgumentException('per page is not a square from 2');
}

$gridSizeX = 1;
$gridSizeY = 1;

// calculate grid size
for ($a = $tileCount; $a > 1; $a /= 2) {
    if ($gridSizeY === $gridSizeX) {
        $gridSizeY *= 2;
    } else {
        $gridSizeX = $gridSizeY;
    }
}

// determine the orientation of the new document
if ($gridSizeX === $gridSizeY) {
    $orientation = SetaPDF_Core_PageFormats::ORIENTATION_PORTRAIT;
} else {
    $orientation = SetaPDF_Core_PageFormats::ORIENTATION_LANDSCAPE;
}

// load the original document
$originalDocument = SetaPDF_Core_Document::loadByFilename($path);
// get the pages instance of the original document
$originalPages = $originalDocument->getCatalog()->getPages();

// create a new writer for the new document
$writer = new SetaPDF_Core_Writer_Http(basename($path), true);

// create a new document
$newDocument = new SetaPDF_Core_Document($writer);

// get the pages instance of the new document
$newPages = $newDocument->getCatalog()->getPages();


// get the page that needs to be resized
$originalPage = $originalPages->getPage($pageNumber);

// convert the page to an XObject
$pageXObject = $originalPage->toXObject($newDocument);

// get the width and height in the correct orientation
$pageFormat = SetaPDF_Core_PageFormats::getFormat($originalPage->getWidthAndHeight(), $orientation);

// calculate the new width and height for the XObject.
$objectWidth  = $pageFormat['width'] * $gridSizeX;
$objectHeight = $pageFormat['height'] * $gridSizeY;

// calculate the start position for drawing.
$currentX = 0;
$currentY = ($pageFormat['height']) * ($gridSizeY - 1);

// create the new pages
for ($newPageNumber = 1; $newPageNumber <= $tileCount; $newPageNumber++) {

    // create a new page
    $newPage = $newPages->create($originalPage->getWidthAndHeight(), $orientation);

    // draw the original page with its new width, height and position onto the new page
    $pageXObject->draw(
        $newPage->getCanvas(),
        $currentX * -1,
        $currentY * -1,
        $objectWidth,
        $objectHeight
    );

    // recalculate the current drawing position
    $currentX += ($objectWidth) / $gridSizeX;
    if ($currentX >= $objectWidth) {
        $currentX = 0;
        $currentY -= $objectHeight / $gridSizeY;

    }
}

$newDocument->getCatalog()->setPageLayout(SetaPDF_Core_Document_PageLayout::TWO_COLUMN_LEFT);
$newDocument->save()->finish();