How can I clip a form XObject?

Q: We are having some issue with a PDF RIP application. It seems that
PDF RIP does not respect the bbox in form XObject.

As a workaround we wold like to use PDFNet SDK to add an explicit
clipbox (based on form’s BBox entry ) to all form XObjects. I spent a
few minutes trying to put down some code but are unsure if we are on
the right track. This is as far as we have gotten.
If you could provide some suggestions it would be much appreciated.

ElementBuilder builder = new ElementBuilder();
ElementWriter writer = new ElementWriter();
Element element = builder.CreateForm(renderedPage, printBatch);
element.GetGState().SetTransform(printBatchMatrix);

writer.Begin(printBatchPage);
writer.WriteElement(builder.CreateGroupBegin());
writer.WritePlacedElement(element);

Rect bbox = new Rect();
element.GetBBox(bbox);
Rect clipRegion = builder.CreateRect(bbox.x1, bbox.y1, bbox.Width,
bbox.Height);

writer.WriteElement(builder.CreateGroupEnd());
writer.End();


A: The code should be along the following lines (it not tested so it
is not guaranteed that it will work immediately):

… Assuming C# …
// Create a form xobject. Use a separate builder so that a same form
xobject
// element can be referenced multiple times on a page.
ElementBuilder form_bld = new ElementBuilder();
Element form = form_bld.CreateForm(renderedPage, printBatch);

ElementBuilder builder = new ElementBuilder();
ElementWriter writer = new ElementWriter();

writer.Begin(printBatchPage);

// Output a form XObject clipped using its own BBox.
//-------------------------------------------------------
writer.WriteElement(builder.CreateGroupBegin());

form.SetTransform(printBatchMatrix);

Rect bbox = new Rect();
element.GetBBox(bbox);

Element clip_rect = builder.CreateRect(bbox.x1, bbox.y1, bbox.Width(),
bbox.Height()); clip_rect.SetPathClip(true);
clip_rect.SetPathStroke(false);
clip_rect.SetPathFill(false);
writer.WriteElement(clip_rect); // Write clip rect
writer.WriteElement(form); // Write form xobject
writer.WriteElement(builder.CreateGroupEnd());

//-------------------------------------------------------
// Draw another instance of the same form xobject

writer.WriteElement(builder.CreateGroupBegin());
form.SetTransform(printBatchMatrix2);
… same as above …
writer.WriteElement(builder.CreateGroupEnd());

//-------------------------------------------------------
// Clean-up

writer.End();
builder.Dispose();
writer.Dispose();
form_bld.Dispose();