Sample code for 30+ languages & platforms
PHP Requires Chilkat v11.7.0+

Why a PDF Text Replacement Is Refused: the Font Rule

See more PDF Text Replacement Examples

A PDF stores glyphs drawn with particular fonts, so new text can only be drawn when the original font can draw it. This example shows the two common refusals. A font embedded as a subset carries only the glyphs the document used: a value made of other characters is refused with the reason missingGlyph, and the report names the font and the characters it lacks. A font that is neither one of the standard 14 nor embedded (here Verdana) is refused with nonStandardUnembeddedFont, because Chilkat cannot know what a viewer will draw for it. A non-embedded Arial, Times New Roman or Courier New is treated as the standard font every viewer substitutes for it.

Chilkat PHP Downloads

Chilkat2 PHP
<?php

use Chilkat2\JsonObject;
use Chilkat2\Pdf;

$success = false;

// This example requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.

// The PDF used in this example is available at quote_subset_font.pdf
// and letter_verdana.pdf

// 1. An embedded subset font: only the glyphs the document uses are in the PDF.
$pdf = new Pdf();
try {
    $pdf->LoadFile('qa_data/pdf/quote_subset_font.pdf');

    $json = new JsonObject();
    $jsonOut = new JsonObject();

    // The regular face's subset carries the characters of the quotation's text, among them the digits of
    // "58341".  A new number made of those digits can be drawn...
    $json->UpdateString('labels[0].label', 'Quote #:');
    $json->UpdateString('labels[0].value', '58314');
    $pdf->TextReplace('check', $json, $jsonOut);
} catch (\Chilkat2\Exception $e) {
    echo $e->getMessage(), "\n";
    exit;
}

echo '58314: ok = ', ($jsonOut->BoolOf('ok') ? 'true' : 'false'), "\n";

// ...but "Q" and "-" are not in the subset (nothing in the quotation's regular text uses them).
$json->UpdateString('labels[0].value', 'Q-58341');
try {
    $pdf->TextReplace('check', $json, $jsonOut);
} catch (\Chilkat2\Exception $e) {
    echo $e->getMessage(), "\n";
    exit;
}

echo 'Q-58341: ok = ', ($jsonOut->BoolOf('ok') ? 'true' : 'false'), "\n";
if (!$jsonOut->BoolOf('ok')) {
    // The problem names the font and the characters it cannot draw.
    echo '    reason: ', $jsonOut->StringOf('problems[0].reason'), "\n";
    echo '    font: ', $jsonOut->StringOf('problems[0].font'), "\n";
    echo '    missing: ', $jsonOut->StringOf('problems[0].chars'), "\n";
}

// "apply" with a problem returns false and changes nothing.
try {
    $pdf->TextReplace('apply', $json, $jsonOut);
    $success = true;
} catch (\Chilkat2\Exception $e) {
    $success = false;
}
echo 'apply returned ', ($success ? 'true' : 'false'), ', applied = ', ($jsonOut->BoolOf('applied') ? 'true' : 'false'), "\n";

// 2. A font that is not embedded and not one of the standard 14.
$pdf2 = new Pdf();
try {
    $pdf2->LoadFile('qa_data/pdf/letter_verdana.pdf');

    $json2 = new JsonObject();
    $json2->UpdateString('labels[0].label', 'Account Number:');
    $json2->UpdateString('labels[0].value', '0000099999');
    $pdf2->TextReplace('check', $json2, $jsonOut);
} catch (\Chilkat2\Exception $e) {
    echo $e->getMessage(), "\n";
    exit;
}

echo 'Verdana, not embedded: ok = ', ($jsonOut->BoolOf('ok') ? 'true' : 'false'), ', reason: ', $jsonOut->StringOf('problems[0].reason'), ', font: ', $jsonOut->StringOf('problems[0].font'), "\n";

// Sample output:

// 58314: ok = true
// Q-58341: ok = false
//     reason: missingGlyph
//     font: AAAAAA+DejaVuSans
//     missing: Q-
// apply returned false, applied = false
// Verdana, not embedded: ok = false, reason: nonStandardUnembeddedFont, font: Verdana