Some test text!

Discord Logo

Chat with us

PDFTron is now Apryse, learn more here.

PDF patterns and shadings in PHP

More languages

More languages
Java (Android)
C++
C#
C# (.NET Core)
Go
Java
Kotlin
Obj-C
JS (Node.js)
PHP
Python
Ruby
Swift
C# (UWP)
VB
C# (Xamarin)

Sample PHP code for using PDFTron SDK to create various patterns and shadings in PDF files. Learn more about our PHP PDF Library and PDF Editing & Manipulation Library.

Get Started Samples Download

To run this sample, get started with a free trial of Apryse SDK.

<?php
//---------------------------------------------------------------------------------------
// Copyright (c) 2001-2022 by PDFTron Systems Inc. All Rights Reserved.
// Consult LICENSE.txt regarding license information.
//---------------------------------------------------------------------------------------
if(file_exists("../../../PDFNetC/Lib/PDFNetPHP.php"))
include("../../../PDFNetC/Lib/PDFNetPHP.php");
include("../../LicenseKey/PHP/LicenseKey.php");

// Relative path to the folder containing the test files.
$input_path = getcwd()."/../../TestFiles/";
$output_path = $input_path."Output/";

function CreateTilingPattern($doc) 
{
	$writer = new ElementWriter();	
	$builder = new ElementBuilder();

	// Create a new pattern content stream - a heart. ------------
	$writer->Begin($doc->GetSDFDoc());
	$builder->PathBegin();
	$builder->MoveTo(0, 0);
	$builder->CurveTo(500, 500, 125, 625, 0, 500);
	$builder->CurveTo(-125, 625, -500, 500, 0, 0);
	$heart = $builder->PathEnd();
	$heart->SetPathFill(true); 
	
	// Set heart color to red.
	$heart->GetGState()->SetFillColorSpace(ColorSpace::CreateDeviceRGB()); 
	$heart->GetGState()->SetFillColor(new ColorPt(1.0, 0.0, 0.0)); 
	$writer->WriteElement($heart);

	$pattern_dict = $writer->End();

	// Initialize pattern dictionary. For details on what each parameter represents please 
	// refer to Table 4.22 (Section '4.6.2 Tiling Patterns') in PDF Reference Manual.
	$pattern_dict->PutName("Type", "Pattern");
	$pattern_dict->PutNumber("PatternType", 1);

	// TilingType - Constant spacing.
	$pattern_dict->PutNumber("TilingType",1); 

	// This is a Type1 pattern - A colored tiling pattern.
	$pattern_dict->PutNumber("PaintType", 1);

	// Set bounding box
	$pattern_dict->PutRect("BBox", -253, 0, 253, 545);

	// Create and set the matrix
	$pattern_mtx = new Matrix2D(0.04,0.0,0.0,0.04,0.0,0.0);
	$pattern_dict->PutMatrix("Matrix", $pattern_mtx);

	// Set the desired horizontal and vertical spacing between pattern cells, 
	// measured in the pattern coordinate system.
	$pattern_dict->PutNumber("XStep", 1000);
	$pattern_dict->PutNumber("YStep", 1000);
	
	return $pattern_dict; // finished creating the Pattern resource
}

function CreateImageTilingPattern($doc) 
{
	$writer = new ElementWriter();	
	$builder = new ElementBuilder();

	// Create a new pattern content stream - a single bitmap object ----------
	$writer->Begin($doc->GetSDFDoc());
	global $input_path;
	$image = Image::Create($doc->GetSDFDoc(), $input_path."dice.jpg");
	$img_element = $builder->CreateImage($image, 0.0, 0.0, (double)$image->GetImageWidth(), (double)$image->GetImageHeight());
	$writer->WritePlacedElement($img_element);
	$pattern_dict = $writer->End();

	// Initialize pattern dictionary. For details on what each parameter represents please 
	// refer to Table 4.22 (Section '4.6.2 Tiling Patterns') in PDF Reference Manual.
	$pattern_dict->PutName("Type", "Pattern");
	$pattern_dict->PutNumber("PatternType",1);

	// TilingType - Constant spacing.
	$pattern_dict->PutNumber("TilingType", 1); 

	// This is a Type1 pattern - A colored tiling pattern.
	$pattern_dict->PutNumber("PaintType", 1);

	// Set bounding box
	$pattern_dict->PutRect("BBox", -253, 0, 253, 545);

	// Create and set the matrix
	$pattern_mtx = new Matrix2D(0.3,0.0,0.0,0.3,0.0,0.0);
	$pattern_dict->PutMatrix("Matrix", $pattern_mtx);

	// Set the desired horizontal and vertical spacing between pattern cells, 
	// measured in the pattern coordinate system.
	$pattern_dict->PutNumber("XStep", 300);
	$pattern_dict->PutNumber("YStep", 300);
	
	return $pattern_dict; // finished creating the Pattern resource
}

function CreateAxialShading($doc) 
{
	// Create a new Shading object ------------
	$pattern_dict = $doc->CreateIndirectDict();

	// Initialize pattern dictionary. For details on what each parameter represents 
	// please refer to Tables 4.30 and 4.26 in PDF Reference Manual
	$pattern_dict->PutName("Type", "Pattern");
	$pattern_dict->PutNumber("PatternType", 2); // 2 stands for shading
	
	$shadingDict = $pattern_dict->PutDict("Shading");
	$shadingDict->PutNumber("ShadingType",2);
	$shadingDict->PutName("ColorSpace","DeviceCMYK");
	
	// pass the coordinates of the axial shading to the output
	$shadingCoords = $shadingDict->PutArray("Coords");
	$shadingCoords->PushBackNumber(0);
	$shadingCoords->PushBackNumber(0);
	$shadingCoords->PushBackNumber(612);
	$shadingCoords->PushBackNumber(794);

	// pass the function to the axial shading
	$function = $shadingDict->PutDict("Function");
	$C0 = $function->PutArray("C0");
	$C0->PushBackNumber(1);
	$C0->PushBackNumber(0);
	$C0->PushBackNumber(0);
	$C0->PushBackNumber(0);

	$C1 = $function->PutArray("C1");
	$C1->PushBackNumber(0);
	$C1->PushBackNumber(1);
	$C1->PushBackNumber(0);
	$C1->PushBackNumber(0);
	
	$domain = $function->PutArray("Domain");
	$domain->PushBackNumber(0);
	$domain->PushBackNumber(1);

	$function->PutNumber("FunctionType", 2);
	$function->PutNumber("N", 1);


	return $pattern_dict;
}

//---------------------------------------------------------------------------------------

	PDFNet::Initialize($LicenseKey);
	PDFNet::GetSystemFontList();    // Wait for fonts to be loaded if they haven't already. This is done because PHP can run into errors when shutting down if font loading is still in progress.
	
	$doc = new PDFDoc();
	$writer = new ElementWriter();	
	$builder = new ElementBuilder();

	// The following sample illustrates how to create and use tiling patterns
	$page = $doc->PageCreate();
	$writer->Begin($page);

	$element = $builder->CreateTextBegin(Font::Create($doc->GetSDFDoc(), Font::e_times_bold), 1.0);
	$writer->WriteElement($element);  // Begin the text block

	$data = "G";
	$element = $builder->CreateTextRun($data);
	$element->SetTextMatrix(720.0, 0.0, 0.0, 720.0, 20.0, 240.0);
	$gs = $element->GetGState();
	$gs->SetTextRenderMode(GState::e_fill_stroke_text);
	$gs->SetLineWidth(4);

	// Set the fill color space to the Pattern color space. 
	$gs->SetFillColorSpace(ColorSpace::CreatePattern());
	$gs->SetFillColor(new PatternColor(CreateTilingPattern($doc)));

	$writer->WriteElement($element);
	$writer->WriteElement($builder->CreateTextEnd()); // Finish the text block

	$writer->End();	// Save the page
	$doc->PagePushBack($page);
	//-----------------------------------------------

	/// The following sample illustrates how to create and use image tiling pattern
	$page = $doc->PageCreate();
	$writer->Begin($page);

	$builder->Reset();
	$element = $builder->CreateRect(0, 0, 612, 794);

	// Set the fill color space to the Pattern color space. 
	$gs = $element->GetGState();
	$gs->SetFillColorSpace(ColorSpace::CreatePattern());
	$gs->SetFillColor(new PatternColor(CreateImageTilingPattern($doc)));
	$element->SetPathFill(true);		

	$writer->WriteElement($element);

	$writer->End();	// Save the page
	$doc->PagePushBack($page);
	//-----------------------------------------------

	/// The following sample illustrates how to create and use PDF shadings
	$page = $doc->PageCreate();
	$writer->Begin($page);

	$builder->Reset();
	$element = $builder->CreateRect(0, 0, 612, 794);

	// Set the fill color space to the Pattern color space. 
	$gs = $element->GetGState();
	$gs->SetFillColorSpace(ColorSpace::CreatePattern());
	$gs->SetFillColor(new PatternColor(CreateAxialShading($doc)));
	$element->SetPathFill(true);		

	$writer->WriteElement($element);

	$writer->End();	// save the page
	$doc->PagePushBack($page);
	//-----------------------------------------------

	$doc->Save($output_path."patterns.pdf", SDFDoc::e_remove_unused);
	PDFNet::Terminate();
	echo "Done. Result saved in patterns.pdf...\n";
?>