TFORMer SDK - DLL/Library  9
Generate Output

This sample demonstrates different ways to generate output based on a FormLayout and on JobData.

See also:
Basic Concept / Printing
#ifdef _WIN32

  #define TECIT_DLLIMPORT
  #include "TFormer.h"
  #undef  TECIT_DLLIMPORT

#else

  #define TECIT_DLLIMPORT
  #define _TEC_UNIX
  #define TEC_UNIX_BUILD

  #include <TECITStd/TECITStd.h>
  #include <TFormer.h>

  #undef  TECIT_DLLIMPORT
  #undef  TECIT_DLLIMPORT
  #undef  _TEC_UNIX
  #undef  TEC_UNIX_BUILD

#endif

//-------------------------------------------------------------------------------------------
// 
//-------------------------------------------------------------------------------------------
ERRCODE ConnectToStandAloneForm (HTFORM hTForm)
{
  ERRCODE eCode = ErrOk;

  // Select the stand-alone FormLayout
  eCode = TFormer_SetRepositoryName (hTForm, "C:/Documents and Settings/All Users/Application Data/TEC-IT/TFORMer/9/Examples/Command Line/ODBCReportPDF/ODBCReportPDF.tff");

  return eCode;
}

//-------------------------------------------------------------------------------------------
// 
//-------------------------------------------------------------------------------------------
ERRCODE ConnectToRepositoryBasedForm (HTFORM hTForm)
{
  ERRCODE eCode = ErrOk;

  // Select the Repository based FormLayout
  eCode = TFormer_SetRepositoryName (hTForm, "C:/Documents and Settings/All Users/Application Data/TEC-IT/TFORMer/9/Examples/Demo Repository/Demos.tfr");
  eCode = TFormer_SetProjectName    (hTForm, "TFORMer_Runtime_Examples");
  eCode = TFormer_SetFormName       (hTForm, "BarcodeLabels");

  return eCode;
}

//-------------------------------------------------------------------------------------------
// 
//-------------------------------------------------------------------------------------------
ERRCODE RecordSetDataSample ()
{
  ERRCODE eCode = ErrOk;

  // Create a new Job instance

  // Select the FormLayout (stand-alone or Repository-based)
  // ...

  // Clear the Data Cache
  eCode = TFormer_ResetData         (hTForm);

  // Create a new Record
  eCode = TFormer_NewRecord         (hTForm);
  // Populate the Record with key/value pairs to define the DataField values
  eCode = TFormer_SetVarValue       (hTForm, "ArticleName",   "Speaker System HF1");
  eCode = TFormer_SetVarValue       (hTForm, "ArticleNo",     "12001234");
  eCode = TFormer_SetVarValue       (hTForm, "ArticlePrice",  "498.98");

  // Create a Second Record
  eCode = TFormer_NewRecord         (hTForm);
  // This Record should be printed two times
  eCode = TFormer_SetRecordCopy     (hTForm, 2);
  // Populate the Record with key/value pairs to define the DataField values
  eCode = TFormer_SetVarValue       (hTForm, "ArticleName",   "Record Box 12 CDs");
  eCode = TFormer_SetVarValue       (hTForm, "ArticleNo",     "12021231");
  eCode = TFormer_SetVarValue       (hTForm, "ArticlePrice",  "8.85");

  // Select PDF output
  if (eCode == ErrOk)
    eCode = TFormer_SetPrinterType  (hTForm, ePrinterType_PDFFile);

  // To /temp/out.pdf
  if (eCode == ErrOk)
    eCode = TFormer_SetOutputName   (hTForm, "/temp/out.pdf");

  // Generate output based on the FormLayout and the JobData
  if (eCode == ErrOk)
    eCode = TFormer_Print           (hTForm);

  return eCode;
}

//-------------------------------------------------------------------------------------------
// 
//-------------------------------------------------------------------------------------------
ERRCODE CsvDataSample (HTFORM hTForm)
{
  ERRCODE eCode = ErrOk;

  // Create a new Job instance

  // Select the FormLayout (stand-alone or Repository-based)
  // ...

  // Here we import a CSV and specify separator and qualifier character
  eCode = TFormer_SetTxtDataFile    (hTForm, "c:/temp/Import.txt", ',', '\"');

  // Select PDF output
  if (eCode == ErrOk)
    eCode = TFormer_SetPrinterType  (hTForm, ePrinterType_PDFFile);

  // To /temp/out.pdf
  if (eCode == ErrOk)
    eCode = TFormer_SetOutputName   (hTForm, "/temp/out.pdf");

  // Generate output based on the FormLayout and the JobData
  if (eCode == ErrOk)
    eCode = TFormer_Print           (hTForm);

  return eCode;
}

//-------------------------------------------------------------------------------------------
// 
//-------------------------------------------------------------------------------------------
ERRCODE OdbcDataSample (HTFORM hTForm)
{
  ERRCODE eCode = ErrOk;


  // Select the stand-alone FormLayout named ODBCReportPDF.tff
  // This FormLayout is usually installed as part of the TFORMer Examples in
  // - Windows Vista or later: C:/Program Data/TEC-IT/TFORMer/9/Examples
  // - Older Microsoft Windows versions: C:/Documents and Settings/All Users/Application Data/TEC-IT/TFORMer/9/Examples
  eCode = TFormer_SetRepositoryName (hTForm, "C:/Documents and Settings/All Users/Application Data/TEC-IT/TFORMer/9/Examples/Command Line/ODBCReportPDF/ODBCReportPDF.tff");

  // Here we are using the installed sample ODBC connection named TFORMer_Sample
  eCode = TFormer_SetODBCData       (hTForm, "DSN=TFORMer_Sample", "", "", "SELECT * FROM tbl_Example");

  // Select PDF output
  if (eCode == ErrOk)
    eCode = TFormer_SetPrinterType  (hTForm, ePrinterType_PDFFile);

  // To /temp/out.pdf
  if (eCode == ErrOk)
    eCode = TFormer_SetOutputName   (hTForm, "/temp/out.pdf");

  // Generate output based on the FormLayout and the JobData
  if (eCode == ErrOk)
    eCode = TFormer_Print           (hTForm);

  return eCode;
}

//-------------------------------------------------------------------------------------------
// 
//-------------------------------------------------------------------------------------------
ERRCODE DataSourceDataSample (HTFORM hTForm)
{
  ERRCODE eCode = ErrOk;

  // Select the stand-alone FormLayout named (6) Samples_Picking List.tff
  // This FormLayout is usually installed as part of TFORMer in
  // - Windows Vista or later: C:/Program Data/TEC-IT/TFORMer/9/Templates
  // - Older versions of Microsoft Windows: C:/Documents and Settings/All Users/Application Data/TEC-IT/TFORMer/9/Templates
  TFormer_SetRepositoryName (hTForm, "C:/Documents and Settings/All Users/Application Data/TEC-IT/TFORMer/9/Templates/(6) Samples_Picking List.tff");

  // Here we are using the DataSource named "ODBC" defined inside the Formlayout
  eCode = TFormer_SetDatasourceName (hTForm, "ODBC");

  // Select PDF output
  if (eCode == ErrOk)
    eCode = TFormer_SetPrinterType  (hTForm, ePrinterType_PDFFile);

  // To /temp/out.pdf
  if (eCode == ErrOk)
    eCode = TFormer_SetOutputName   (hTForm, "/temp/out.pdf");

  // Generate output based on the FormLayout and the JobData
  if (eCode == ErrOk)
    eCode = TFormer_Print           (hTForm);

  return eCode;
}

//-------------------------------------------------------------------------------------------
// 
//-------------------------------------------------------------------------------------------
ERRCODE UseRecordSetData (HTFORM hTForm)
{
  ERRCODE eCode = ErrOk;

  // Clear the Data Cache
  eCode = TFormer_ResetData         (hTForm);

  // Create a new Record
  eCode = TFormer_NewRecord         (hTForm);
  // Populate the Record with key/value pairs to define the DataField values
  eCode = TFormer_SetVarValue       (hTForm, "Field1", "Value1");
  eCode = TFormer_SetVarValue       (hTForm, "Field2", "Value2");
  eCode = TFormer_SetVarValue       (hTForm, "Field3", "Value3");

  // Create and add more Records
  // ...

  return eCode;
}

//-------------------------------------------------------------------------------------------
// 
//-------------------------------------------------------------------------------------------
ERRCODE UseCsvData (HTFORM hTForm)
{
  ERRCODE eCode = ErrOk;

  // Here we import a CSV and specify separator and qualifier character
  eCode = TFormer_SetTxtDataFile (hTForm, "path/data.csv", ',', '"');

  return eCode;
}

//-------------------------------------------------------------------------------------------
// 
//-------------------------------------------------------------------------------------------
ERRCODE UseXmlData (HTFORM hTForm)
{
  ERRCODE eCode = ErrOk;

  // Use the XML file InputData.XML as data source
  eCode = TFormer_SetXmlDataFile (hTForm, "path/data.xml");

  return eCode;
}

//-------------------------------------------------------------------------------------------
// 
//-------------------------------------------------------------------------------------------
ERRCODE UseOdbcData (HTFORM hTForm)
{
  ERRCODE eCode       = ErrOk;
  // Here we import data from an ODBC connection using the specified SQL SELECT statement
  eCode = TFormer_SetODBCData (
      hTForm,
      "DSN=TFORMer_Sample",
      NULL, /* User */
      NULL, /* Password */
      "SELECT * FROM tbl_Example"
  );

  return eCode;
}

//-------------------------------------------------------------------------------------------
// 
//-------------------------------------------------------------------------------------------
ERRCODE UseOdbcDataDSN (HTFORM hTForm)
{
  ERRCODE eCode = ErrOk;

  eCode = TFormer_SetODBCData (hTForm, "DSN=TFORMer_Sample", "", "", "SELECT * FROM tbl_Example");

  return eCode;
}

//-------------------------------------------------------------------------------------------
// 
//-------------------------------------------------------------------------------------------
ERRCODE UseDataSourceData (HTFORM hTForm)
{
  ERRCODE eCode = ErrOk;

  // The DataSource named myTextDataSource must be defined in the FormLayout or Repository
  // Retrieve data using the predefined data source myTextDataSource
  eCode = TFormer_SetDatasourceName   (hTForm, "myTextDataSource");
  // Set the DataSourceParameter named parFile
  eCode = TFormer_SetDSParameterValue (hTForm, "parFile", "/YourPath/InputData.txt");

  return eCode;
}

//-------------------------------------------------------------------------------------------
// **** Does this also iterate all global fields? Guess not, probably we would have to iterate global project AND local project
// set pszProjectName to NULL to iterate datafields of global Project
//-------------------------------------------------------------------------------------------
ERRCODE IterateUsedDataFields (HTFORM hTForm, LPCSTR pszProjectName)
{
  ERRCODE eCode = ErrOk;

  // Enumerate all DataFields in the Project
  HPROJECTVAR_ITERATOR  it                = TFormer_GetFirstProjectVarIt (hTForm, pszProjectName, &eCode);
  BOOL                  bProjectVarValid  = (it != NULL);
  LPCSTR                pszDataFieldName  = NULL;

  // TYPE_E_ELEMENTNOTFOUND should not be treated as error
  if (eCode == TYPE_E_ELEMENTNOTFOUND)
    eCode = ErrOk;

  // iterate all DataFields
  while (bProjectVarValid && (eCode == ErrOk))
  {
    // Query the DataField usage in the given FormLayout
    EVarUsage eVarUsage = TFormer_ProjectVarItGetUsage (hTForm, it, &eCode);
    if ((eVarUsage == eVarUsage_Normal) && (eCode == ErrOk))
    {
      pszDataFieldName = TFormer_ProjectVarItGetName (it, &eCode);
      if (pszDataFieldName != NULL && eCode == ErrOk)
        printf ("  %s\n", pszDataFieldName);
    }

    // get next DataField
    bProjectVarValid = (TFormer_GetNextProjectVarIt (it) == ErrOk);
  }
  // release iterator
  TFormer_FreeProjectVarIt (it);

  return eCode;
}

//-------------------------------------------------------------------------------------------
// 
//-------------------------------------------------------------------------------------------
ERRCODE PrintToPrinter (HTFORM hTForm)
{
  ERRCODE eCode           = ErrOk;
  LPCSTR  pszPrinterName  = NULL;
  // Select the printer name on Windows or Linux (CUPS printer name), use NULL for the default printer
  eCode = TFormer_SetPrinterName  (hTForm, pszPrinterName, NULL);

  // Print
  eCode = TFormer_Print           (hTForm);

  return eCode;
}

//-------------------------------------------------------------------------------------------
// 
//-------------------------------------------------------------------------------------------
ERRCODE PrintToPdf (HTFORM hTForm)
{
  ERRCODE eCode = ErrOk;

  // Select PDF output
  eCode = TFormer_SetPrinterType  (hTForm, ePrinterType_PDFFile);
  // To /temp/out.pdf
  eCode = TFormer_SetOutputName   (hTForm, "/temp/out.pdf");
  // Generate PDF
  eCode = TFormer_Print           (hTForm);

  return eCode;
}

//-------------------------------------------------------------------------------------------
// 
//-------------------------------------------------------------------------------------------
ERRCODE SetPrinterTypePdf (HTFORM hTForm)
{
  ERRCODE eCode = ErrOk;

  // Select PDF output to /temp/out.pdf with the PDFFILE prefix
  eCode = TFormer_SetPrinterName  (hTForm, "PDFFILE:/temp/out.pdf", NULL);

  // which is equivalent to

  // Select PDF output to /temp/out.pdf with setPrinterType and setOutputName
  eCode = TFormer_SetPrinterType  (hTForm, ePrinterType_PDFFile);
  eCode = TFormer_SetOutputName   (hTForm, "/temp/out.pdf");

  return eCode;
}

//-------------------------------------------------------------------------------------------
// 
//-------------------------------------------------------------------------------------------
void PrintToStream()
{
  // not supported by C API, included just for completeness
}

// Define the call-back function for streaming
ERRCODE __stdcall StreamCallback (BYTE* pBuffer, INT nSizeBuffer, DWORD dwFlags, LPARAM lParam)
{
  ERRCODE eCode = ErrOk;
  if      (dwFlags == eWriteCallBack_Data)
  {
    // Process data (copy or write the data to the stream)
  }
  else if (dwFlags == eWriteCallBack_Close)
  {
    // Close the current stream
  }
  else if (dwFlags == eWriteCallBack_Open)
  {
    // Open a new stream, the name which is set in TFormer_SetOutputName is provided via pBuffer (UTF8 encoded)
  }

  return eCode;
}

//-------------------------------------------------------------------------------------------
// 
//-------------------------------------------------------------------------------------------
ERRCODE PrintToStreams(HTFORM hTForm)
{
  ERRCODE eCode = ErrOk;

  // Generate a PNG image named StreamToFileExample.png
  // The provided OutputName is passed to call-back function
  // If multiple pages are generated page numbers will get appended (e.g. StreamToFileExample_002.png)
  eCode = TFormer_SetOutputName   (hTForm, "StreamToFileExample.png");
  eCode = TFormer_SetPrinterType  (hTForm, ePrinterType_ImagePng);

  // Generate PDF
  // Instead of #TFormer_Print use #TFormer_PrintToStream and provide the callback function.
  eCode = TFormer_PrintToStream   (hTForm, StreamCallback, (LPARAM)0);

  return eCode;
}

//-------------------------------------------------------------------------------------------
// 
//-------------------------------------------------------------------------------------------
void ReportError (ERRCODE eCode, HTFORM hTForm, LPCSTR pszFunction)
{
  LPCSTR pszErrDescription = NULL;
  LPCSTR pszErrSource      = NULL;
  LPCSTR pszErrInformation = NULL;

  if (eCode == ErrOk)
    return;

  if (pszFunction)
    printf ("Error in %s\n", pszFunction);

  printf ("Error         : 0x%08x\n", eCode);

  if (hTForm)
  {
    pszErrDescription   = TFormer_GetLastErrorDescription (hTForm);
    pszErrInformation   = TFormer_GetLastErrorInformation (hTForm);
    pszErrSource        = TFormer_GetLastErrorSource      (hTForm);

    if (pszErrDescription && pszErrDescription[0])
      printf("TFError       : %s\n", pszErrDescription);

    if (pszErrInformation && pszErrInformation[0])
      printf("TFInformation : %s\n", pszErrInformation);

    if (pszErrSource && pszErrSource[0])
      printf("TFSource      : %s\n", pszErrSource);
  }
}

//-------------------------------------------------------------------------------------------
// M A I N
//-------------------------------------------------------------------------------------------
// Licenses TFORMer SDK and calls the various sample functions
//-------------------------------------------------------------------------------------------
int main(int argc, char* argv[])
{
  ERRCODE eCode   = ErrOk;
  HTFORM  hTForm  = NULL;
  // Allocate memory and retrieve TFORMer handle
  hTForm = TFormer_Init (NULL);
  if (!hTForm)
    return;

  // License TFORMer SDK by calling one of the following methods:
  // - TFormer_License: provides the license data manually
  // - TFormer_LicenseBase64: provides the license data from base64 string
  // - TFormer_LicenseFile: provides the license data from TFORMer.ini license file
  // Example:
  TFormer_License ("<your activation key>", "<your name>", LICKIND_WORKSTATION, 1, "<options>", "yyyymmdd", "<base64signature>");

  // Samples for stand-alone FormLayouts
  printf ("Stand-alone FormLayout samples\n");
  printf ("Connect to tff file ...\n");
  eCode = ConnectToStandAloneForm (hTForm);
  ReportError (eCode, hTForm, "ConnectToStandAloneForm");


  if (eCode == ErrOk)
  {
    printf ("Iterate used fields ...\n");
    eCode = IterateUsedDataFields (hTForm, NULL);
    ReportError (eCode, hTForm, "IterateUsedDataFields");
    eCode = ErrOk; // Clear Error
  }

  if (eCode == ErrOk)
  {
    printf ("Import data from ODBC ...\n");
    eCode = UseOdbcData (hTForm);
    ReportError (eCode, hTForm, "UseOdbcData");
  }

  if (eCode == ErrOk)
  {
    printf ("Print to default printer ...\n");
    eCode = PrintToPrinter (hTForm);
    ReportError (eCode, hTForm, "PrintToPrinter");
  }

  if (eCode == ErrOk)
  {
    printf ("Use Stream API ...\n");
    eCode = PrintToStreams (hTForm);
    ReportError (eCode, hTForm, "PrintToStreams");
  }

  // Samples for Repository files
  printf ("\n----------------------\nRepository samples\n");
  printf ("Connect to repository ...\n");
  eCode = ConnectToRepositoryBasedForm (hTForm);
  ReportError (eCode, hTForm, "ConnectToRepositoryBasedForm");

  if (eCode == ErrOk)
  {
    printf ("Set some data ...\n");
    eCode = UseRecordSetData (hTForm);
    ReportError (eCode, hTForm, "UseRecordSetData");
  }

  if (eCode == ErrOk)
  {
    printf ("Generate PDF ...\n");
    eCode = PrintToPdf (hTForm);
    ReportError (eCode, hTForm, "PrintToPdf");
  }

  // Free resources used by TFORMer SDK
  TFormer_Exit (hTForm);
}

© 2006-2026 - all rights reserved by TEC-IT Datenverarbeitung GmbH
Generated on Fri Feb 6 2026 10:32:55 for TFORMer SDK - DLL/Library with doxygen 1.7.6.1