Free PDF IRM Protector For RMS / SharePoint 2010

I am currently in the middle of a side, personal project that I am really sick of not having on hand, an PDF IRM protector that integrates with SharePoint! I am sure anyone that has done this before has run into this particular requirement, and while I haven’t done any VC++ in a while now, I am cooking up this code.

So the next couple site posts while be about building the protector which will extend on the meager MSFT documentation regarding the subject.

Enough post filler, time to get back to coding this sucker up!


Returning The SharePoint Start Workflow Link

Building the “Start Workflow” link is pretty straight forward. I am pretty sure there are better ways to do it, but here is an approach when you have to build the link using a string return. How it works is pretty straightforward. Consuming a SPListItem and SPWorkflowAssociation parameter, the SPListItem exposes the ParentList and ID properties and the SPWorkflowAssociation provides the InstantiationUrl and Id properties. The only field level stuff is I was passing a finish url in the query string (_finalurl in the below). When the link is built, it is cleaned up using the inherent SPHttpUtility.UrlKeyValueEncode method.

private string _finalurl;

public static string QueryStringAppend(string url, string args)
if (string.IsNullOrEmpty(url))
return url;
var num = url.LastIndexOf(“?”);
switch (num)
case -1:
return (string.Format(“{0}?{1}”, url, args));
return num == (url.Length – 1) ? url + args : string.Format(“{0}&{1}”, url, args);

protected string BuildWorkflowStartLink(SPListItem listItem, SPWorkflowAssociation workflowAssociation)
var builder = new StringBuilder();
builder.Append(SPHttpUtility.UrlPathEncode(string.Format(“{0}/{1}”, Web.Url, workflowAssociation.InstantiationUrl), true));
string url = _finalurl ?? Request.QueryString[“Source”];
url = QueryStringAppend(url, string.Format(“{0}={1}”, FinishIdName ?? “ID”, listItem.ID));
if (!string.IsNullOrEmpty(url))
return builder.ToString();