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

Fill a PDF Template: Replace {{placeholders}} with Values

See more PDF Text Replacement Examples

Demonstrates the TextReplace method on an invoice template whose values are written as placeholders such as {{customer}} and {{total}}. The "placeholders" object names each placeholder and the text to put in; every occurrence on the page is replaced, including a placeholder inside a sentence or inside a label such as "Tax ({{taxRate}}):". The text is redrawn with the font the template used, so the result looks like the template, and a value that is right-aligned in the template stays right-aligned. The changes are written by WriteFile.

Chilkat Visual FoxPro Downloads

Visual FoxPro
LOCAL lnSuccess
LOCAL loPdf
LOCAL loJson
LOCAL loJsonOut
LOCAL i
LOCAL lnCount_i

lnSuccess = 0

*  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 invoice_template.pdf

loPdf = CreateObject('Chilkat.Pdf')
lnSuccess = loPdf.LoadFile("qa_data/pdf/invoice_template.pdf")
IF (lnSuccess = 0) THEN
    ? loPdf.LastErrorText
    RELEASE loPdf
    CANCEL
ENDIF

*  The template has these placeholders in its page text:
*    {{customer}} (twice: "Bill To:" and the closing sentence), {{date}}, {{po}},
*    two item rows: {{qty1}} {{desc1}} {{price1}} {{amount1}} and {{qty2}} {{desc2}} {{price2}} {{amount2}},
*    {{subtotal}}, "Tax ({{taxRate}}):" with {{tax}}, and {{total}}.
loJson = CreateObject('Chilkat.JsonObject')
loJson.UpdateString("placeholders.customer","Acme Corp")
loJson.UpdateString("placeholders.date","2026-10-18")
loJson.UpdateString("placeholders.po","PO-88213")
loJson.UpdateString("placeholders.qty1","2")
loJson.UpdateString("placeholders.desc1","Cordless drill, 18 V")
loJson.UpdateString("placeholders.price1","$460.00")
loJson.UpdateString("placeholders.amount1","$920.00")
loJson.UpdateString("placeholders.qty2","6")
loJson.UpdateString("placeholders.desc2","Galvanized hinge, 4 inch")
loJson.UpdateString("placeholders.price2","$12.50")
loJson.UpdateString("placeholders.amount2","$75.00")
loJson.UpdateString("placeholders.subtotal","$995.00")
loJson.UpdateString("placeholders.taxRate","7.35%")
loJson.UpdateString("placeholders.tax","$73.13")
loJson.UpdateString("placeholders.total","$1,068.13")

*  "apply" makes every replacement, or none: if any value cannot be drawn with the
*  template's font, the method returns false, the PDF is unchanged, and jsonOut says why.
loJsonOut = CreateObject('Chilkat.JsonObject')
lnSuccess = loPdf.TextReplace("apply",loJson,loJsonOut)
IF (lnSuccess = 0) THEN
    ? "Not applied: " + loJsonOut.Emit()
    IF (lnSuccess = 0) THEN
        ? loPdf.LastErrorText
        RELEASE loPdf
        RELEASE loJson
        RELEASE loJsonOut
        CANCEL
    ENDIF

ENDIF

*  One entry per placeholder: the pages it was found on and how many times it was replaced.
i = 0
lnCount_i = loJsonOut.SizeOfArray("replacements")
DO WHILE i < lnCount_i
    loJsonOut.I = i
    ? loJsonOut.StringOf("replacements[i].field") + ": " + STR(loJsonOut.IntOf("replacements[i].count")) + " on page(s) " + loJsonOut.StringOf("replacements[i].pages")
    i = i + 1
ENDDO

*  The replacements stay in memory until the PDF is written.
lnSuccess = loPdf.WriteFile("qa_output/invoice_filled.pdf")
IF (lnSuccess = 0) THEN
    ? loPdf.LastErrorText
    RELEASE loPdf
    RELEASE loJson
    RELEASE loJsonOut
    CANCEL
ENDIF

? "Wrote qa_output/invoice_filled.pdf"

*  Sample output:

*  customer: 2 on page(s) 1
*  date: 1 on page(s) 1
*  po: 1 on page(s) 1
*  qty1: 1 on page(s) 1
*  desc1: 1 on page(s) 1
*  price1: 1 on page(s) 1
*  amount1: 1 on page(s) 1
*  qty2: 1 on page(s) 1
*  desc2: 1 on page(s) 1
*  price2: 1 on page(s) 1
*  amount2: 1 on page(s) 1
*  subtotal: 1 on page(s) 1
*  taxRate: 1 on page(s) 1
*  tax: 1 on page(s) 1
*  total: 1 on page(s) 1
*  Wrote qa_output/invoice_filled.pdf

RELEASE loPdf
RELEASE loJson
RELEASE loJsonOut