1. Help Center
  2. Development
  3. PDF template customization

Customizing your quote layout (PDF)

EducationLink quotes are a blank canvas, you can have literally any quote layout you would like.



Imagine the perfect quote. Or imagine exactly the quote you currently have. If you would like both on EducationLink, being generated automatically with up-to-date course information, insurance prices and student information from a click of a button, we've got you covered.

How does it work?

EducationLink's PDF generation engine can create the most complex of PDFs. It's the same engine used by Google GStuite (!), we're talking about first-class, never-seen in the international education industry engine.

All it takes is a template file (HTML) and based on this file, it'll create your quote.

How can I get a customized PDF quote?

There are two options:

  1. If you don't have technical knowledge: We can customize it for you, usually takes one meeting to understand what you want, and one meeting to present the quote customized.
  2. If you do have technical knowledge: We can provide you the documentation and technical details you may need to customize yourself. If you have web development skills, you can already customize the quote template.

Dynamic Quotes customization

If you would like to learn more about Dynamic Quote customization, check our article: Using Dynamic Quotes API to build your own Dynamic Quote. This is an advanced article and will require development skills.

The technical aspects of customizing your PDF quote

If you have the technical knowledge, you can use this guide to help you customize your own layout of the quote. You will need the following skills:

Before generating the quote in PDF, EducationLink uses an HTML template to server-side render it using Vue.js and only then will use the output (HTML) to generate the PDF. While our PDF engine will support pretty much every CSS3 and HTML5 tags and specifications, we advise to use it with caution.

Our PDF engine supports CSS Selectors 4 specification mostly.

The biggest advantage of having HTML templates is that you can create any layout you would like. You have available the entire quote information, organization information and user info to create the layout with any variable. You can also apply any transformation by using Javascript and Vue.js.

When running the SSR you have the below variables available (all variables are in camelCase):

  • student:
    • firstName
    • middleName
    • lastName
    • office
    • phone
    • email
    • visas (Array containing: visaExpireDate, visa, visaGrantDate, visaComments)
  • user:
    • profile (firstName, lastName, phone, position)
    • office
  • organization:
    • name
    • logo
    • color
    • cover
    • slogan
    • address
    • offices
    • websiteUrl
    • facebookUrl
    • twitterUrl
    • instagramUserName
    • youtubeChannelUrl
    • blogUrl
    • paymentOptions
  • contact:
    • office
  • courses:
  • groupesCourses:
  • services:
  • groupedServices:
  • insurance:
  • groupedInsurance:
  • accommodation:
  • groupedAccommodation:
  • governmentFees:
  • groupedGovernmentFees:
  • airTickets:
  • groupedAirTickets:
  • allServices:
  • groupedAllServices:
  • currency
  • options:
    • comments
    • lang
    • custom
    • expireDate
    • quoteType
    • layout
    • endDate
    • currency
    • type

All products (courses, insurance, etc) have the same definitions, which are below. Grouped products are grouped by the provider name, and are always an array (even if empty) with the keys "name" and "value". The "value" key is an array.

Product definition:

  • name
  • providerDetails
    • name
    • marketingDetails (websiteUrl, logo)
  • type
  • startDate
  • endDate
  • duration
  • firstPayment
  • firstPaymentAmount
  • accommodationDetails (if existent and if product type is accommodation):
  • fees (Array):
    • type
    • amount
    • comments
    • applyCommission
  • tuitionFee
  • materialFee
  • enrollmentFee
  • nonTuitionFee
  • totalAmount
  • _id
  • installments (array):
    • iTuitionFee
    • iMaterialFee
    • iEnrollmentFee
    • iNonTuitionFee
    • comments
    • dueDate
  • comment

Any TypeError, ReferenceError or any other Javascript error will prevent the SSR to happen which will prevent the quote to be generated.

We do not impose hard limits on the input size, output size, numbers of pages, or document complexity. The only limit is time to complete. Simple documents may only take a few seconds to generate, and a more complicated document with many external resources to fetch or scripts to run may take several minutes to create. The limit is 1 minute. If your document goes over this time limit, it will be killed, and an error will be returned.

Any request for the resource should be HTTPS.

Auxiliary functions are available to help you style and deal with data when rendering it:

  • formatDate(date, format, localeId)
  • formatUrl(url)
  • $moment(...arguments)
  • $humanize(date, localeId)
  • $toLocaleString(number)
  • shadeColor(color, percentage)
  • currencyConversion(from, to, amount)
  • quoteTotalFirstPayment(quote)
  • quoteInitialPaymentAU(quote)
  • quoteCoursePlusServices(quote, course)
  • quoteTotalServices(quote)
  • quoteTotalGroupProducts(products)
  • $getColor(imageUrl, raw = false, type = 'DarkVibrant', opacity = 1, gradient = false)
  • sortByDueDateInstallments(products)
  • getCurrencyFxRates(from, to = ['CAD', 'COP', 'IATA', 'USD'])