Forum Discussion
Creating a pdf file from Storyline running under an LMS
I know there are many excellent examples of how to create a pdf file in Storyline using javascript libraries such as jspdf and I have done this successfully in projects compiled for the web...
...but has anyone tackled this with an lms version? I know you could pass data to the lms using xAPI - but I really just want to click a button and "save" the pdf file created within the course using variables collected during the course.
Any ideas would be welcome.
- JohnCooper-be3cCommunity Member
Hi Matthew
Can I be really cheeky and ask another question? I have the pdf creation working great - thanks to you! But I'm now experimenting with adding a background image to the pdf using doc.addimage in the javascript.I have the necessary jspdf libraries loaded (I think) but I'm running into a CORS problem - I've checked other examples (like Devlin Peck's tutorial) and have included a img.crossOrigin statement just before declaring the image source (the image is in the output folder):
img.crossOrigin = "";img.src = "Inventory.png";BUT - I still get an error when I try and load the image, The error triggers the img.onerror = function {.......... code I have addedvar doc = new jsPDF();var img = new Image;img.onload = function() {.............img.onerror = function(e) {....The error message I get in the debug console is:Access to image at 'file:///C:/Users/John/Documents/CURRENT/xxxxxxxxxxx/xxxxxxxxxxx%20-%20Storyline%20output/Inventory.png'' from origin 'null' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome-extension, edge, https, chrome-untrusted.I'm using jspdf v1.5.3 and have tried loading the .debug version exactly as in Devlin's example)Any ideas would be appreciatedThanks, John - JohnCooper-be3cCommunity Member
Wow - swift response - thanks. I will try both of those.
- JohnCooper-be3cCommunity Member
Again your advice sorted my problem out instantly - I was being a complete dork! Of course I needed the image on a server - which, if I was testing my code on a web server, instead of on my local system, it would be! There are times I can be so dumb!
I guess the clue was in the error message "Cross origin requests are only supported for protocol schemes: http...." didn't really need to read further.
Loading the code I already had onto my server meant it ran perfectly... background image successfully added to pdf - just have to line my text up with the form, which is what the background image is and I'm good to go.
- MarkWCommunity Member
Hi John and Matt. I've used the Base64 method for background images but haven't tried the server method. What would that code look like? Apologies if this is super basic JavaScript.
- JohnCooper-be3cCommunity Member
Hi Mark
My code now looks like this:
//Create pdf
var doc = new jsPDF();
var img = new Image;
img.onload = function() {
doc.addImage(this, 'PNG', 0, 0, 210, 297);
doc.setFontSize(12);then I add all the text to the document
doc.save('Inventory.pdf');
}
img.onerror = function(e) {
console.log("Error code",e);
}
img.crossOrigin = "";
img.src = "Inventory.png";So "Inventory.png" is the name of my background image for my pdf and needs to be in the storyline output root folder. I am creating an A4 document in portrait. If you want to create a landscape form just swap the "210" and "297" parameters to load your png image and add 'landscape' to the new jsPDF line:
var doc = new jsPDF('landscape');
should do it
- MarkWCommunity Member
On a related note, if I want to reference the online version of jsPDF instead of packaging it with the course, how do I do that? Do I add some version of the code below to the story.html file?
<script src="https://unpkg.com/jspdf@latest/dist/jspdf.umd.min.js"></script>
- JohnCooper-be3cCommunity Member
Hi Mark
You should be able to use the construct you have given to load the latest version of jsPDF as you suggest.
But a bit of a heads up - some of the examples you will see posted here on heroes pre-date V2.0.0 of JsPDF - (in fact I use jsPDF V1.5.3) - So whereas I would load 'jspdf.debug.js' you, correctly, are loading "jspdf.umd.min.js"
As per the release notes for v2.0.0:
"We renamed the files in dist for consistency:
jspdf.debug/min.js
is nowjspdf.umd(.min).js
"I mention this in case anyone else is confused when they look at earlier code examples.
Cheers, John
- JohnCooper-be3cCommunity Member
Matt - do you know if the 'jspdf.umd.min.js' has the addimage library code in it?? That was the problem with older versions of 'jspdf.js' as I recall.
- MarkWCommunity Member
Last question :)
Do either of you know how to use a web object to avoid having to edit the story.html file after publish? I saw a post about it a while back but didn't fully understand it.
- MarkWCommunity Member
Thanks for all of your answers, John. I really appreciate it.
- MarkWCommunity Member
Thanks for the explanation, John. I've come accross a CORS error once or twice and wasn't sure what it meant. I've been using FTP for testing, as custom fonts seem to cause problems locally, too.
One more question, if I adapt the code you shared earlier and want to have different background images on each page of a multipage PDF, what would you suggest? I know how to generate new pages and suspect I would name images sequentially (page1.png, page2.png, etc.). Not quite sure of the other step, though...
- JohnCooper-be3cCommunity Member
Hi Mark
I haven't had the need to create multi-page pdf's yet but I see no problem in doing what you suggest. Just generate a new page and then use addimage.
Coincidentally, I submitted a proposal last week to a client that will require multi-page pdf's - so I may have to come to you to find out how to do it :)
I'm also looking at a more extensive javascript library pdf-lib which allows you to modify existing pdf files including filling out pdf forms. It looks really interesting. If I make progress with it I will create an article and publish it here.
- MarkWCommunity Member
I'm happy to help, though I suspect you're much more knowledgeable about all this.
And I'm curious to hear about your experience with the other javascript library. If it has the possibility to generate accessible PDFs, that would be especially appealing.