How do I use PDFDCEX to generate custom appearance for digital signature field?

Q:

I want to use PDFDCEX interface to generate the visual appearance of a digital signature field, but am unable to get the correct output.

A:

The following code can be placed into the PDFDCTest sample code, and will do what are asking. In particular the file doc_to_sign.pdf is located in the PDFNet SDK sample files (Samples/TestFiles).

PDFDoc pdfdoc(inputPath + "doc_to_sign.pdf");
pdfdoc.InitSecurityHandler();
// Use PDFDCEX to create a temp page and write graphic content to
PDFDCEX pdfDcEx;
HDC hDC = pdfDcEx.Begin(pdfdoc);
::StartPage(hDC);
HFONT hFont = NULL;
LOGFONT lg = { 0 };
lg.lfHeight = 100;
lg.lfWeight = 0;
lg.lfOutPrecision = OUT_DEFAULT_PRECIS;
lg.lfClipPrecision = CLIP_EMBEDDED;
wcscpy_s(lg.lfFaceName, LF_FACESIZE, L"Arial");
hFont = CreateFontIndirect(&lg);
SelectObject(hDC, hFont);
TextOutW(hDC, 0, 0, L"abc 不 码 abc", 11);
::EndPage(hDC);
pdfDcEx.End();
// doc_to_sign now has the temp as the last page of the document
// so grab it and then remove from the document page list
Page formx_src = pdfdoc.GetPage(pdfdoc.GetPageCount());
pdfdoc.PageRemove(pdfdoc.GetPageIterator(pdfdoc.GetPageCount()));
// reduce source page to minimum size to contain visible content
formx_src.SetCropBox(formx_src.GetVisibleContentBox());
// Now we can write the PDFDCEX generated graphical content to the target annotation
// which in this case is a signature field
Field field = pdfdoc.GetField("Signature1");
Annots::Widget widget(field.GetSDFObj());
ElementWriter writer;
ElementBuilder builder;
writer.Begin(pdfdoc);
Element formx = builder.CreateForm(formx_src);
writer.WritePlacedElement(formx);
SDF::Obj appearance_stream = writer.End();
appearance_stream.PutRect("BBox", 0, 0, formx_src.GetCropBox().Width(), formx_src.GetCropBox().Height());
widget.SetAppearance(appearance_stream);
// Done setting graphical appearance
outputFile = outputPath + "doc_to_sign.pdf";
pdfdoc.Save(outputFile.c_str(), SDF::SDFDoc::e_remove_unused, NULL);

Same code above can be used to change the appearance of any annotation, not just fields/widgets.

To actually add the digital signature, see the DigitalSignatures samples.