Add Image Above Placeholder
This demo extracts placeholders (like {{NAME}}
) and adds a white rectangle and an image as an overlay
to its location.
PHP
use setasign\SetaPDF2\Core\Canvas\Draw; use setasign\SetaPDF2\Core\Document; use setasign\SetaPDF2\Core\Image\Image; use setasign\SetaPDF2\Core\Writer\HttpWriter; use setasign\SetaPDF2\Core\XObject\Image as ImageXObject; use setasign\SetaPDF2\Extractor\Extractor; use setasign\SetaPDF2\Extractor\Result\Words; use setasign\SetaPDF2\Extractor\Strategy\WordStrategy; // load and register the autoload function require_once __DIR__ . '/../../../../../bootstrap.php'; $document = Document::loadByFilename( $assetsDirectory . '/pdfs/tektown/Laboratory-Report - with-sig-placeholders.pdf' ); // initate an extractor instance $extractor = new Extractor($document); // define the word strategy $strategy = new WordStrategy(); $extractor->setStrategy($strategy); // get the pages helper $pages = $document->getCatalog()->getPages(); // define a mapping of placeholders to images $images = [ 'SIGNATURE' => Image::getByPath( $assetsDirectory . '/images/Handwritten-Signature.png' )->toXObject($document) ]; // let's find all placeholders $matches = []; for ($pageNo = 1; $pageNo <= $pages->count(); $pageNo++) { /** * @var Words $words */ $words = $extractor->getResultByPageNumber($pageNo); $matches[] = [$pageNo, $words->search('/{{.*?}}/')]; } // iterate over the matches foreach ($matches AS list($pageNo, $results)) { /** @var Words $segments */ foreach ($results as $segments) { $name = trim($segments->getString(), "{} \n"); if (!isset($images[$name])) { continue; } // get the bounds of the found phrase $bounds = $segments->getBounds(); $rect = $bounds[0]->getRectangle(); // get the page object $page = $pages->getPage($pageNo); // make sure that the new content is encapsulated in a separate content stream $page->getContents()->encapsulateExistingContentInGraphicState(); // get the canvas object $canvas = $page->getCanvas(); // get some rect data $x = $rect->getLl()->getX(); $y = $rect->getLl()->getY(); $width = $rect->getWidth(); $height = $rect->getHeight(); // draw a white rectangle $canvas->draw() ->setNonStrokingColor(1) ->rect($x, $y, $width, $height, Draw::STYLE_FILL); /** * @var ImageXObject $image */ $image = $images[$name]; // draw the image fitted and centered to the placeholder area $maxWidth = $image->getWidth($height); $maxHeight = $image->getHeight($width); if ($maxHeight > $height) { $x += $width / 2 - $maxWidth / 2; $image->draw($canvas, $x, $y, null, $height); } else { $y += $height / 2 - $maxHeight / 2; $image->draw($canvas, $x, $y, $width, null); } } } // save and finish the document $document->setWriter(new HttpWriter('document.pdf', true)); $document->save()->finish();