ImageGear for C and C++ on Windows v19.3 - Updated
Getting Started with ArtX Annotations
User Guide > How to Work with... > Annotations > New Annotation API: ArtX > Getting Started with ArtX Annotations

The following tutorial explains how to add a text annotation as a watermark to a PDF document.

At the top of your main program module, you need to place the main ArtX public header file. It is required for the ArtX prototypes and macros:

 
Copy Code
i_ArtX.h

If you plan on using ArtX's GUI tools, including the toolbar and property you need to include:

 
Copy Code
i_ArtXGUI.h

Before you can load an image that can be marked up using ArtX functions, you need to attach the ArtX component using the ImageGear function IG_comm_comp_attach(). If you plan on working with PDF Annotations, then in addition to the PDF component, you will need to attach the Vector and U3D components (see Attaching Components).

 
Copy Code
// Attach ArtX component.
if ((IG_comm_comp_attach("ArtX") != IGE_SUCCESS))
{
   // This error usually occurs because the DLL cannot be found.
   cout << "ArtX component error." << endl;
   return false;
}

// Attach U3D component.
if ((IG_comm_comp_attach("U3D") != IGE_SUCCESS))
{
   // This error usually occurs because the DLL cannot be found.
   cout << "U3D component error." << endl;
   return false;
}

// Attach Vector component.
if ((IG_comm_comp_attach("Vect") != IGE_SUCCESS))
{
   // This error usually occurs because the DLL cannot be found.
   cout << "Vector component error." << endl;
   return false;
}

// Attach and initialize the PDF component.
if ((IG_comm_comp_attach("PDF") != IGE_SUCCESS) ||
       (IG_PDF_initialize(NULL) != IGE_SUCCESS))
{
   // This error usually occurs because a DLL or the Resource directory
   // cannot be found.
   cout << "PDF component error." << endl;
   return false;
}

The following method loads in a PDF document and iterates through all of the pages, putting a “Draft” text annotation on each page. The PDF document is then saved out with the PDF annotation on every page.

 
Copy Code
void ApplyTextWatermarkToAllPages(const string& fileIn)
{
   const int BorderThicknessInPixels = 2;
   const int OpacityTranslucent = 100;
   const AT_DIMENSION MaxHeightInImagePixels = 200;

   // Load the multi-page document.
   HMIGEAR document = 0;
   IG_mpi_create(&document, 0);
   IG_mpi_file_open((LPSTR)fileIn.c_str(), document, IG_FORMAT_PDF,
           IG_MP_OPENMODE_READONLY);

   // Get the page count.
   unsigned int pageCount = 0;
   IG_mpf_page_count_get(document, &pageCount);

   for (unsigned int pageNumber = 0; pageNumber < pageCount; pageNumber++)
   {
       // Get a handle to the page.
       HIGEAR page = 0;
       IG_mpi_page_get(document, pageNumber, &page);

       // Get the dimensions of the image and watermark text.
       AT_DIMENSION imageWidth = 0;
       AT_DIMENSION imageHeight = 0;
       UINT bitsPerPixel = 0;
       IG_image_dimensions_get(page, &imageWidth, &imageHeight, &bitsPerPixel);

       AT_DIMENSION boxWidth = imageWidth;
       AT_DIMENSION boxHeight = (std::min)(MaxHeightInImagePixels, imageHeight);
       // Choose a font size that is 85% height of the box height.
       float fontSize = boxHeight * 0.85f;

       // Create the ArtX page.
       HIG_ARTX_PAGE artPage = 0;
       IG_ARTX_page_create(&artPage);

       // Create the text mark.
       // X and Y coordinates to place image.
       AT_DIMENSION x = 1;
       AT_DIMENSION y = (imageHeight - boxHeight) / 2;
       AT_RECTANGLE rectangle = { x, y, boxWidth, boxHeight };
       AT_ARTX_FONT font = { fontSize, IG_ARTX_FONT_REGULAR, FALSE, "Arial" };
       AT_ARTX_BORDER border = { IG_ARTX_PEN_SOLID, BorderThicknessInPixels,
               {128, 128, 128, 0} };
       AT_BOOL borderShading = FALSE;
       AT_RGBQUAD fillColor = { 0, 0, 255, 0 };
       AT_RGBQUAD textColor = { 0, 0, 0, 0 };
       HIG_ARTX_TEXT mark = NULL;
       
       IG_ARTX_text_create(&rectangle, "Draft", IG_ARTX_TEXT_DIRECT_TEXT, &font,
               &border, borderShading, &fillColor, &textColor, OpacityTranslucent,
               NULL, NULL, &mark);

       // Add the text mark to the page.
       HIG_ARTX_TEXT markInPage = NULL;
       IG_ARTX_page_mark_add(artPage, mark, IG_ARTX_COORD_IMAGE, &markInPage);
       IG_ARTX_page_save(artPage, page);
       IG_ARTX_page_delete(artPage);
       IG_ARTX_mark_delete(mark);
   }

   // Save the file out with the new text watermark.
   const UINT firstPage = 0;
   IG_mpi_file_save("WatermarkText.pdf", document, firstPage, 0, pageCount,
           IG_FORMAT_PDF, IG_MPI_SAVE_OVERWRITE);

   // Cleanup the document and its pages.
   IG_mpi_delete(document);
}

Call this routine from your main function in your sample application passing in the path to a PDF document. Now you can compile and run your sample application. To see this code in a working sample, please see the AddWatermarkToPDF sample.