How do I detect if a PDF page contais transparency?

You can detect if a PDF page has transparency using ElementReader (as shown in ElementReader rample - http://www.pdftron.com/pdfnet/samplecode.html#ElementReader).

To detect if there is transparency on a page you would need to check if there is any

a) Transparency groups

b) Blend modes

c) Opacity values smaller than 1

For this you can extend ProcessElements() along the following lines:

// Pseudo-code to check PDF page for transparency…
static bool CheckIfPageHasTransparency(ElementReader reader)
{
	Element element;
	while ((element = reader.Next()) != null) // Read page contents
	{
		if (ProcessGSChanges(element)) return true;
		if (element.GetType() == Element.Type.e_form)
		{
			reader.FormBegin();
			Obj grp = element.GetXObject().FindObj("Group");
			if (grp != null) {
				Obj grp_subtype = grp.FindObj("S");
				if(grp_subtype!=null && grp_subtype.IsName() && grp_subtype.GetName() == "Transparency"))
				return true;
			}
			ProcessElements(reader);
			reader.End();
			break;
			}
		}
	}

static bool ProcessGSChanges(Element element)
{
	GState gs=element.GetGState();
	for(GSChangesIterator itr=m_reader.GetChangesIterator(); itr.HasNext(); itr.Next())
	{
		switch(itr.Current()) {
			case GState.GStateAttribute.e_opacity_fill :
			if (gs.GetFillOpacity()<1) return true;
			break;
			case GState.GStateAttribute.e_opacity_stroke :
			if (gs.GetStrokeOpacity()<1) return true;
			break;
			case GState.GStateAttribute.e_soft_mask :
			if(gs.GetSoftMask() != null) return true;
			break;
			case GState.GStateAttribute.e_blend_mode:
			if(gs.GetBlendMode() != GState::e_bl_normal)
			return true;
			break;
			default:
			break;
		}
	}
	return false;
}
1 Like