Last month, I wrote up a post demonstrating how to use Adobe Acrobat Services with ColdFusion. This week I took some of the code I had written for that post and turned it into a proper GitHub project. You can find the latest code here:

To use this, you'll need credentials, which you can get and use for free for up to 500 transactions. (The docs go into detail about how that works.)

Currently I only have a subset of our APIs supported, but I plan to hit most of the rest in the next day or so. To give you an example of how it works, here's a sample that uses our Extract API.

First, you instantiate the component with your credentials. You would probably do this in your Application.cfc file instead of in one particular file.

asService = new acrobatservices(clientId=application.CLIENT_ID, clientSecret=application.CLIENT_SECRET);

Next, you can upload the PDF:

docpath = expandPath('../sourcefiles/adobe_security_thing.pdf');

asset = asService.createAsset(docpath);

And then you simply kick off the Extract job:

pollLocation = asService.createExtractJob(asset);

This returns a 'job' object that contains a URL you can check for status. I used a simple while loop for that:

done = false;
while(!done) {
	job = asService.getJob(pollLocation);
	writedump(var=job, label="Latest job status");

	if(job.status == 'in progress') {
		sleep(2 * 1000);
	} else done = true;


In the end, the job variable will contain two things - a link to the JSON output and a link to a zip file that contains any extract tables, images, and the JSON as well. Downloading the JSON is as simple as:

jsonpath = expandPath('../output/extract.json');
asService.downloadAsset(job.content, jsonpath);

Or, if you don't need to keep it (which, I would, because why process it more than once, but you do you), you can HTTP the JSON and work with it. Here's an example of that:

cfhttp(url=job.content.downloadUri, result="jsonRequest");
jsonResult = deserializeJSON(jsonRequest.filecontent);

// lets demo showing the headers
headers = jsonResult.elements.reduce((value, element) => {
	if(element.Path.find('H1')) value.append(element.Text);
	return value;
}, []);

This returns an array of headers that would be a useful summary for a PDF.

Anyway, I hope this is helpful to folks. I will remind everyone that my ColdFusion skills are perhaps a bit rusty so PRs are absolutely welcome at