API > PDF bestanden maken


Wanneer de gebruikers van een website informatie willen opvragen of downloaden kan er dankzij nodum snel en gemakkelijk een PDF-bestand gegenereerd worden. In de map PDF plaats je een template voor het bestand en de variabele gegevens kunnen meegegeven worden in de aanroep van het genereren van het bestand. Hier wordt uitgelegd hoe het maken van een PDF-bestand in zijn werk gaat.

De PDF-API heeft een beperkt aantal functies. Er kan een bestand gegenereerd worden, verschillende pagina's kunnen worden samengevoegd of één bestand kan per pagina in meerdere bestanden worden gesplitst. Tot slot kan er nog een PNG-afbeelding worden gegenereerd van een enkele pagina, die als voorbeeldweergave kan dienen. Het genereren van het bestand vergt het meeste werk, daarom is dat het startpunt voor deze tutorial. De methode ziet er als volgt uit:
api.PDF_generate(string/string renderTemplate/renderHtml [, string outputFilename] [, string orientation=portrait] [, array arguments])

PDF genereren

Het benodigde template kan gemaakt worden in de standaardmap PDF. Optioneel kan er ook gekozen worden om een klein stuk HTML als string mee te geven aan de methode. Het is echter niet aan te raden om dit met grote templates te doen. In dit voorbeeld gebruiken we het volgende template, dat we in het nieuw te maken bestand 'voorbeeldbestand' plaatsen:

<style>
.kleurtje {
    color: red;
}
.bottom: {
    bottom: 0;
}
p {
    font-size: 1em;
}
h3 {
    font-weight: bolder !important;
}
</style>
<h3>
    Dit is een voorbeeld-PDF, gemaakt in nodum!
</h3>
<div class="row">
    <div class="col-md-9">
        <p>
            Dankzij nodum is het nu heel gemakkelijk om eigen PDF-bestanden te maken. Facturen, voorbeeldbrieven of informatiepagina's kunnen worden omgezet naar een PDF-pagina. Hoe gaaf is dat?!<br>
            Er kan ook gebruik gemaakt worden van variabelen. Kijk maar eens naar naar de volgende voorbeelden: <br>
            <ul>
                <li>Naam: {{ naam }}</li>
                <li>Leeftijd: {{ leeftijd }}</li>
            </ul>
            En zo kun je nog veel meer informatie gebruiken!
        </p>
    </div>
    <div class="col-md-3">
        <p>
            Het is zelfs mogelijk om (inline) CSS te gebruiken om <span class="kleurtje">kleurtjes</span> aan je tekst te geven. De generator luistert zelfs naar gedeeltelijke opmaak op basis van het nodum-template. 
        </p>
    </div>
</div>
<p>
Veel plezier met nodum!
Het nodum-team.
</p>

Zoals te zien kan het template overweg met inline CSS en met enkele standaardelementen van het nodum-template. Aan de hand van dit template kan nu het bestand gegenereerd worden:

    {% set data = {naam: 'José van Laar', leeftijd: '30'} %}
    {% set PDFfile = api.PDF_generate('voorbeeldbestand', 'voorbeeldbestand.pdf', portrait, data) %}
    {% do api.IO_staticFile( PDFfile.name ).set( PDFfile.data ) %}

De IO_*-API zorgt er in dit geval voor dat het PDF-bestand wordt opgeslagen in de static-map van het project waarin gewerkt wordt. Er kan ook gekozen worden om het bestand per email te versturen of te downloaden.

Watermerk toevoegen
Met de update van versie 2.1.4 is het mogelijk om ook een watermerk toe te voegen aan een PDF bestand. Dit kan op de volgende manier:

<html>
  <head>
    <style>
      #watermark { position: fixed; top: 0px; left: 200px; width: 300%; height: 300%; opacity: .2; }
    </style>
  </head>
  <body>
    <div id="watermark"><img src="logo_nodum.png"></div>
    <br /><br />
    <p>
      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam dictum purus arcu, non lobortis libero venenatis et. Phasellus faucibus, ligula sed hendrerit lobortis, libero risus lacinia lacus, tempor laoreet nisi nisi at felis. Aenean tempor massa nec auctor venenatis. Nullam id viverra mi. Sed et faucibus magna. Integer scelerisque risus ac felis ullamcorper sagittis. Vestibulum metus tortor, lobortis ac viverra quis, pellentesque sed nulla. Nullam congue nunc placerat risus venenatis, sit amet sagittis eros suscipit. Integer in ante eget mi dignissim pulvinar sed et lorem.
    </p>
  </body>
</html>


Het gedeelte tussen de <style></style> tags plaats je in je css en de overige code, plaats je in je HTML code. je hoeft binnen nodum niet <html></html> of <style></style> te schrijven.

PDF samenvoegen

Nodum maakt het tevens mogelijk om meerdere PDF-bestanden samen te voegen. De methode PDF_mergePages is als volgt opgebouwd:
api.PDF_mergePages(array pdfContents, bool withOutput)
De boolean-waarde withOutput zal als true meegegeven moeten worden, anders komt de juiste informatie niet mee in de uiteindelijke PDF. Met de onderstaande code kan ieder bestand in de 'static'-map van een project doorzocht worden op de extensie .pdf en wordt ieder bestand omgezet naar een verzamelbestand getiteld verzameling.pdf.

Wanneer deze code meerdere malen wordt uitgevoerd zal het bestand verzameling.pdf alleen maar groter worden. Ieder PDF-bestand wordt omgezet naar een nieuwe, dus ook de inhoud van verzameling.pdf.

{% set files     = api.IO_staticFile().ls('static/*.pdf') %} {# Alle files met de extensie .pdf worden opgehaald #}
{% set newFile   = api.PDF_mergePages(files, true) %} {# Sla alle bestanden op in newFile #}
{% do api.IO_staticFile('verzameling.pdf').set(newFile.pdf.data) %}

In de map 'static' is nu het bestand verzameling.pdf aangemaakt.

PDF/A genereren

Met de update van versie 2.1.1 is het mogelijk om PDF/A bestanden te genereren. Dit zijn niet veranderbare PDF bestanden die vaak worden gebruikt voor archivering.

{% set doc2pdf = api.Document_toPdf( api.IOstaticFile('sample.doc').get  , true ) %}
{% set pdf2pdfA = api.PDF_toPdfA( doc2pdf.document.data  , true) %}

{% do api.IO_staticFile('textdata-a.pdf').set(pdf2pdfA.document.data) %}