Wrangling Management Over PDFs with the Adobe PDF Embed API

No Comments

By our final estimate, there are actually extra PDFs on the planet than atoms within the universe (not verified by exterior sources) so chances are high, occasionally, you’re going to run right into a PDF doc or two. Browsers do a fairly good job of dealing with PDFs. Usually, clicking a hyperlink to a PDF will open a brand new tab in your browser with customized UI and rendering per browser. Right here’s the identical PDF opened in Edge, Chrome, Firefox, and Safari, respectively:

As anticipated, every browser places its personal spin on issues however one factor is constant — all of them take over your complete viewport to render the PDF. Whereas that is helpful for giving the reader as a lot actual property to eat the PDF as potential, it could generally be fascinating to have extra management over the PDF expertise. That is the place the Adobe PDF Embed API is available in. The PDF Embed API is a free JavaScript library that allows you to show PDFs inline with the remainder of your content material together with supplying you with management over the instruments UI, supporting annotations and occasions, and extra. Let’s stroll by some examples of what it’s prefer to work with the library.

Getting a key

Earlier than we start, you’ll must register for a key. In case you head over to our Getting Began web page, you’ll see a hyperlink to allow you to create new credentials:

In case you don’t have an account with Adobe but you’ll must create one. You’ll be prompted to present the credentials a reputation and an utility area. Whereas the title isn’t terribly vital, the appliance area is. The important thing you get might be restricted to a selected area. You possibly can solely enter one area right here, so to start out, you should use localhost or use cdpn.io because the area if you wish to attempt it on CodePen. If you wish to use the API in each native and manufacturing environments, you’ll be able to create a number of tasks within the console or use HOSTS file configurations. (The flexibility to specify a number of domains for credentials is on the radar.)

Hit the stunning blue “Create Credentials” button and also you’ll get your key:

In case you’re curious and wish to see what the Embed API can do instantly, click on on “Get Code Samples” which brings you to an interactive on-line demo. However since we’re hardcore coders who construct our personal editors earlier than we go to work, let’s dive proper right into a easy instance.

Constructing a demo

First, let’s construct an HTML web page that hosts our PDF. I’ve been an internet developer for twenty years and am now an knowledgeable at designing lovely HTML pages. Right here’s what I got here up:

<html>
<head></head>
<physique>
<h1>Cats are Every little thing</h1>
<p>
Cats are so extremely superior that I really feel like
we should always discuss them extra. Here is a PDF
that talks about how superior cats are.
</p>

<!– PDF right here! –>

<p>
Did you want that? Was it superior? I believe it was superior!
</p>
</physique>
</html>

I put it up a little bit of CSS, after all:

I actually don’t know why Adobe employed me as a developer evangelist as a result of, clearly, I must be on a design crew. Anyway, how can we get our PDF in there? Step one is so as to add our library SDK:

<script src=”https://documentcloud.adobe.com/view-sdk/fundamental.js”></script>

Now we’d like a little bit of JavaScript. When our library hundreds, it fires an occasion referred to as adobe_dc_view_sdk.prepared. Relying on the way you load your scripts and your framework of alternative, it’s potential the occasion fires earlier than you even get an opportunity to examine for it.

We are able to additionally examine for the existence of window.AdobeDC. We are able to deal with each by chaining to a perform that can arrange our PDF.

if (window.AdobeDC) displayPDF();
else {
doc.addEventListener(“adobe_dc_view_sdk.prepared”, () => displayPDF());
}

perform displayPDF() {
console.log(‘Lets do some AWESOME PDF stuff!’);
}

Alright, so how can we show the PDF? To just accept all of the defaults we will use the next snippet:

let adobeDCView = new AdobeDC.View({clientId: ADOBE_KEY, divId: “mypdf” });
adobeDCView.previewFile({
content material:{location: {url: “https://static.raymondcamden.com/enclosures/cat.pdf”}},
metaData:{fileName: “cat.pdf”}
});

Let’s break that down. First, we create a brand new AdobeDC.View object. The clientId worth is the important thing from earlier. The divId is the ID of a <div> within the DOM the place the PDF will render. I eliminated the HTML remark I had earlier and dropped in an empty <div> with that ID. I additionally used some CSS to specify a width and top for it:

#mypdf {
width: 100%;
top: 500px;
}

The previewFile technique takes two fundamental arguments. The primary is the PDF URL. The PDF Embed API works with both URLs or File Guarantees. For URLs, we wish to guarantee we’ve obtained CORS setup correctly. The second worth is metadata in regards to the PDF which, on this case, is the filename. Right here’s the end result:

Right here’s a whole CodePen of the instance, and sure, you’ll be able to clone this, modify it, and proceed to make use of the important thing.

CodePen Embed Fallback

You’ll discover the UI accommodates the identical instruments you’d count on in any PDF viewer, together with issues like the power so as to add notes and annotations.

Word the “Save” icon within the determine above. When downloaded, the PDF will embrace the feedback and beautiful marker drawings.

Customizing the expertise

Alright, you’ve seen the essential instance, so let’s kick it up a bit and customise the expertise. One of many first methods we might do that’s by altering the embed mode which controls how the PDF is displayed. The library has 4 completely different ones supported:

Sized Container — The default mode used to render a PDF inside a <div> container. It renders one web page at a time.Full Window — Like Sized Container in that it’s going to “fill” its mother or father <div>, however shows your complete PDF in a single “stream” you’ll be able to scroll by.In-Line — Shows it in an internet web page, like Sized Container, however renders each web page in a vertical stack. Clearly, don’t use this with some massive 99-page PDF except you hate your customers. (However for those who already show a kind of “Join our e-newsletter” modal home windows when an individual visits your website, or your website autoplays movies, then by all means, go forward and do that.)Lightbox — Shows the PDF in a centered window whereas greying out the remainder of the content material. The UI to shut the show is robotically included.

To specify a distinct view, a second argument of choices might be handed. For instance:

perform displayPDF() {
console.log(‘Lets do some AWESOME PDF stuff!’);
let adobeDCView = new AdobeDC.View({clientId: ADOBE_KEY, divId: “mypdf” });
adobeDCView.previewFile({
content material:{location: {url: “https://static.raymondcamden.com/enclosures/cat.pdf”}},
metaData:{fileName: “cat.pdf”}
},
{
embedMode: “IN_LINE”
});
}

Word that in in-line mode, the peak specified to your div might be ignored in order that the PDF can stretch it’s legs a bit. You possibly can view this model of the demo right here: https://codepen.io/cfjedimaster/pen/OJpJRKr

Let’s contemplate one other instance – utilizing lightbox together with a button lets us give the consumer the prospect to load the PDF when they need. We are able to modify our HTML like so:

<html>
<head></head>
<physique>
<h1>Cats are Every little thing</h1>
<p>
Cats are so extremely superior that I really feel like
we should always discuss them extra. Here is a PDF
that talks about how superior cats are.
</p>

<!– PDF right here! –>
<button id=”showPDF” disabled>Present PDF</button>

<p>
Did you want that? Was it superior? I believe it was superior!
</p>
</physique>
</html>

I’ve added a disabled button to the HTML and eliminated the empty <div>. We received’t want it because the lightbox mode will use a modal view. Now we modify the JavaScript:

const ADOBE_KEY = ‘b9151e8d6a0b4d798e0f8d7950efea91’;

if(window.AdobeDC) enablePDF();
else {
doc.addEventListener(“adobe_dc_view_sdk.prepared”, () => enablePDF());
}

perform enablePDF() {
let btn = doc.querySelector(‘#showPDF’);
btn.addEventListener(‘click on’, () => displayPDF());
btn.disabled = false;
}

perform displayPDF() {
console.log(‘Lets do some AWESOME PDF stuff!’);
let adobeDCView = new AdobeDC.View({clientId: ADOBE_KEY });
adobeDCView.previewFile({
content material:{location: {url: “https://static.raymondcamden.com/enclosures/cat.pdf”}},
metaData:{fileName: “cat.pdf”}
},
{
embedMode: “LIGHT_BOX”
});
}

There are two fundamental adjustments right here. First, checking that the library is loading (or has loaded) runs enablePDF, which removes the disabled property from the button and provides a click on occasion. This runs displayPDF. Discover how the initializer does not use the divId anymore. Second, word the embedMode mode change. You possibly can do that your self through the Pen under.

CodePen Embed Fallback

You could have extra customization choices as nicely, together with tweaking the UI menus and icons to allow and disable varied options:

adobeDCView.previewFile({
content material:{location: {url: “https://static.raymondcamden.com/enclosures/cat.pdf”}},
metaData:{fileName: “cat.pdf”}
},
{
showDownloadPDF: false,
showPrintPDF: false,
showAnnotationTools: false,
showLeftHandPanel: false
});

You can probably guess what this does, however right here’s a shot with the default choices:

And right here’s the way it appears with these choices disabled:

By the way in which, simply so we’re clear, we positively know that disabling the obtain button doesn’t “shield” the PDF seen right here, the URL continues to be seen in through View Supply.

Once more, that is solely a small instance, so make sure to examine the customization docs for extra examples.

Working with the API and dealing with occasions

Together with customizing the UI, we additionally get superb grained management over the expertise after it’s loaded. That is supported with an API that may return details about the PDF in addition to the power to pay attention for occasions.

Working with the API makes use of the results of the previewFile technique. We haven’t used that but, but it surely returns a Promise. One use of the API is to get metadata. Right here’s an instance:

let resultPromise = adobeDCView.previewFile({
content material:{location: {url: “https://static.raymondcamden.com/enclosures/cat.pdf”}},
metaData:{fileName: “cat.pdf”}
}, { embedMode:”SIZED_CONTAINER” });

resultPromise.then(adobeViewer => {
adobeViewer.getAPIs().then(apis => {
apis.getPDFMetadata()
.then(end result => console.log(end result))
.catch(error => console.log(error));
});
});

This returns:

{
‘numPages’:6,
‘pdfTitle’:’Microsoft Phrase – Document1′,
‘fileName’:”
}

Together with API calls, we even have deep analytics integration. Whereas the docs go into nice element (and discuss integration with Adobe Analytics), you’ll be able to deal with PDF viewing and interacting occasions in any means that is smart to you.

For instance, since we all know what number of pages are in a PDF, and we will pay attention for occasions like viewing a web page, we will discover when an individual has considered each web page. To construct this, I modified the JavaScript, like so:

const ADOBE_KEY = ‘b9151e8d6a0b4d798e0f8d7950efea91’;

//used to trace what we have learn
const pagesRead = new Set([1]);
let totalPages, adobeDCView, shownAlert=false;

if(window.AdobeDC) displayPDF();
else {
doc.addEventListener(“adobe_dc_view_sdk.prepared”, () => displayPDF());
}

perform displayPDF() {
console.log(‘Lets do some AWESOME PDF stuff!’);
adobeDCView = new AdobeDC.View({clientId: ADOBE_KEY, divId: “mypdf” });

let resultPromise = adobeDCView.previewFile({
content material:{location: {url: “https://static.raymondcamden.com/enclosures/cat.pdf”}},
metaData:{fileName: “cat.pdf”}
}, { embedMode:”SIZED_CONTAINER” });

resultPromise.then(adobeViewer => {
adobeViewer.getAPIs().then(apis => {
apis.getPDFMetadata()
.then(end result => {
totalPages = end result.numPages;
console.log(‘totalPages’, totalPages);
listenForReads();
})
.catch(error => console.log(error));
});
});

}

perform listenForReads() {

const eventOptions = {
enablePDFAnalytics: true
}

adobeDCView.registerCallback(
AdobeDC.View.Enum.CallbackType.EVENT_LISTENER,
perform(occasion) {
let web page = occasion.information.pageNumber;
pagesRead.add(web page);
console.log(`view web page ${web page}`);
if(pagesRead.measurement === totalPages && !shownAlert) {
alert(‘You learn all of it!’);
shownAlert = true;
}
}, eventOptions
);

}

Discover that after I get details about the web page rely, I run a perform that begins listening for web page viewing occasions. I exploit a Set to document every distinctive web page, and when the full equals the variety of pages within the PDF, I alert a message. (In fact, we don’t know if the reader really learn the textual content.) Whereas admiditely a bit lame, you’ll be able to play with this your self right here:

const ADOBE_KEY = ‘b9151e8d6a0b4d798e0f8d7950efea91’;

//used to trace what we have learn
const pagesRead = new Set([1]);
let totalPages, adobeDCView, shownAlert=false;

if(window.AdobeDC) displayPDF();
else {
doc.addEventListener(“adobe_dc_view_sdk.prepared”, () => displayPDF());
}

perform displayPDF() {
console.log(‘Lets do some AWESOME PDF stuff!’);
adobeDCView = new AdobeDC.View({clientId: ADOBE_KEY, divId: “mypdf” });

let resultPromise = adobeDCView.previewFile({
content material:{location: {url: “https://static.raymondcamden.com/enclosures/cat.pdf”}},
metaData:{fileName: “cat.pdf”}
}, { embedMode:”SIZED_CONTAINER” });

resultPromise.then(adobeViewer => {
adobeViewer.getAPIs().then(apis => {
apis.getPDFMetadata()
.then(end result => {
totalPages = end result.numPages;
console.log(‘totalPages’, totalPages);
listenForReads();
})
.catch(error => console.log(error));
});
});

}

perform listenForReads() {

const eventOptions = {
listenOn: [ AdobeDC.View.Enum.PDFAnalyticsEvents.PAGE_VIEW ],
enablePDFAnalytics: true
}

adobeDCView.registerCallback(
AdobeDC.View.Enum.CallbackType.EVENT_LISTENER,
perform(occasion) {
/*
console.log(“Sort ” + occasion.sort);
console.log(“Knowledge ” + JSON.stringify(occasion.information));
*/
let web page = occasion.information.pageNumber;
pagesRead.add(web page);
console.log(`view web page ${web page}`);
if(pagesRead.measurement === totalPages && !shownAlert) {
alert(‘You learn all of it!’);
shownAlert = true;
}
}, eventOptions
);

}

Learn how to study extra

I hope this introduction to the Embed API has been helpful. Listed below are some assets that can assist you get deeper into it:

Begin off by perusing the docs because it does an awesome job going over all the main points.We’ve obtained a stay demo that allows you to see every thing in motion and can even generate code for you.When you have questions or want help, we’ve obtained a discussion board for questions and you should use the adobe-embed-api on StackOverflow as nicely.If it’s essential work with PDFs on the server degree, we’ve obtained the Adobe PDF Instruments API in addition to a loopy cool Adobe Doc Technology device chances are you’ll like. These aren’t free just like the PDF Embed API, however you’ll be able to trial them for six months and take a look at them out by signing up.

Lastly, we’re completely open to suggestions on this. In case you’ve obtained strategies, concepts, questions, or anything, be happy to achieve out!

The submit Wrangling Management Over PDFs with the Adobe PDF Embed API appeared first on CSS-Methods.

You possibly can help CSS-Methods by being an MVP Supporter.

    About Marketing Solution Australia

    We are a digital marketing company with a focus on helping our customers achieve great results across several key areas.

    Request a free quote

    We offer professional SEO services that help websites increase their organic search score drastically in order to compete for the highest rankings even when it comes to highly competitive keywords.

    Subscribe to our newsletter!

    More from our blog

    See all posts

    Leave a Comment