PDF-Tools SaaS - Azure Function

  • 30 minutes to read

PDF-Tools in SaaS

De “PDF-Tools” zoals we die kenden in de extensies (tem BC18) is voor SaaS (vanaf BC19) volledig herschreven geweest.
De dll wordt daarbij niet meer rechtstreeks gebruikt, maar in een Azure Function. Op zich blijft de bestaande dll wel gebruikt binnen de Azure Function, wat inhoudt dat de werking vrij analoog is.

Naast de wijziging van dll naar Azure Function is ook de opslag van de templates veranderd. De templates werden bewaard op de root-folder van BoCount Dynamics. Voor de SaaS versies (dus vanaf BC19) worden de bestanden bewaard als blob-veld op de document-tabel.
Het is echter zo dat bij eerste afdruk van een document, het systeem automatisch gaat zoeken naar de file op de root-folder en die importeren in het blob-veld van de document-tabel. Dat betekent dus dat bij een upgrade dit feilloos en zonder manuele aanpassing zal overgezet worden. Maar dus wel belangrijk om te weten dat bij een aanpassing aan de template het bestand moet opgeladen worden via de documenten tabel.

Nieuw PDF-Tools rapport maken

Om een compleet nieuw PDF-Tools rapport te maken, kan je gebruik maken van deze template:

report 50099 "PDFTool Template"
{
    ApplicationArea = All;
    Caption = 'Report Caption To Replace';
    DefaultRenderingLayout = PDFTools;
 
    dataset
    {
        dataitem(DataItemToReplace; "Integer")
        {
            dataitem(CopyLoop; "Integer")
            {
                DataItemTableView = sorting(Number);
 
                dataitem(PageLoop; "Integer")
                {
                    DataItemTableView = sorting(Number) where(Number = const(1));
 
                    trigger OnPostDataItem()
                    var
                        CFLBase64Convert: Codeunit "CFL Base64 Convert";
                        tempBlob: Codeunit "Temp Blob";
                        OutPutFileBase64: Text;
                        OutPutFileBase64WithStationary: Text;
                        DocumentTitle: Text;
                        NoOfLinesPerItem: Integer;
                    begin
                        Clear(PDFProgram);
 
                        CFLDocument.Get('DOCUMENT CODE TO REPLACE');
 
                        LanguageCode := CFLReportMgt.CFLGetLanguageForDocument('LANGUAGE CODE TO REPLACE');
                        CFLGetTranslations(LanguageCode);
 
                        DocumentTitle := CFLTranslationDictGet('DOCUMENT TITLE TO REPLACE');
                        DocumentName := DelChr(DocumentTitle + DelChr('DOCUMENT NO. TO REPLACE', '=', DelChr('DOCUMENT NO. TO REPLACE', '=', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')), '=', '/\:*?"<>|') + '.pdf';
 
                        intPage := 0;
                        intCounter := CFLDocument."CFL Lines per Page";
 
                        //Lines.Reset();
                        //SET THE FILTERS ON THE LINES
                        //if Lines.FindSet() then 
                        //    repeat
                        if CFLCheckLine() then begin
                            NoOfLinesPerItem := CFLGetNoOfLinesPerItem();
                            CFLAddLineToDocument(NoOfLinesPerItem);
                        end;
                        //    until Lines.Next() = 0;
 
                        CFLAddTotals();
 
                        OutPutFileBase64 := CFLClosePDF();
 
                        Clear(OutPutFileBase64WithStationary);
                        if CFLDocument."CFL Apply Stationary" <> CFLDocument."CFL Apply Stationary"::"CFL Never" then
                            OutPutFileBase64WithStationary := PDFProgram.CFLAddStationary(OutPutFileBase64, CFLGetStationaryBase64())
                        else
                            OutPutFileBase64WithStationary := OutPutFileBase64;
 
                        CFLBase64Convert.CFLBase64StringToTempBlob(OutPutFileBase64WithStationary, tempBlob);
                        PDFCopyWithStationary.Add(OutPutFileBase64WithStationary);
                        PDFCopy.Add(OutPutFileBase64);
                        PDFCopyIsCreated := true;
                    end;
                }
 
                trigger OnPreDataItem()
                var
                    NoOfLoops: Integer;
                begin
                    NoOfLoops := Abs(NoOfCopies) + 1;
                    if NoOfLoops <= 0 then
                        NoOfLoops := 1;
                    SetRange(Number, 1, NoOfLoops);
                end;
            }
 
            trigger OnPreDataItem()
            begin
                Clear(PDFProgram);
            end;
 
            trigger OnAfterGetRecord()
            begin
                Clear(PDFProgram);
            end;
        }
 
        dataitem(Base64Result; Integer)
        {
            DataItemTableView = sorting(Number) where(Number = const(1));
 
            column(PDFinBase64; Format(Base64))
            { }
 
            trigger OnPreDataItem()
            var
                CFLBoCountDynamicsMgt: Codeunit "CFL BoCount Dynamics Mgmt";
                OutPutFileWithStationary: Text;
            begin
                if PDFCopyIsCreated then begin
                    Clear(PDFProgram);
                    if PDFCopyIsCreated then begin
                        OutPutFileWithStationary := PDFProgram.CFLMergePDF(PDFCopyWithStationary, CFLBoCountDynamicsMgt.GetExtensionName(), CompanyName, '', '');
 
                        if (CFLDocument."CFL Apply Stationary" = CFLDocument."CFL Apply Stationary"::"CFL PDF") then
                            Base64.Add('Base64PDFPrint', PDFProgram.CFLMergePDF(PDFCopy, CFLBoCountDynamicsMgt.GetExtensionName(), CompanyName, '', ''))
                        else
                            Base64.Add('Base64PDFPrint', OutPutFileWithStationary);
 
                        Base64.Add('Base64PDF', OutPutFileWithStationary);
                    end;
                end;
            end;
        }
    }
 
    requestpage
    {
        SaveValues = false;
        layout
        {
            area(content)
            {
                group(Options)
                {
                    Caption = 'Options';
 
                    // field(NoOfCopies; NoOfCopies)
                    // {
                    //     ApplicationArea = All;
                    //     Caption = 'No. of Extra Copies';
                    // }
                }
            }
        }
 
        actions
        {
        }
    }
 
    rendering
    {
        layout(PDFTools)
        {
            Type = Custom;
            LayoutFile = './src/report/PDFTools.pdftools';
            Caption = 'PDFTools layout', Locked = true;
            Summary = 'PDFTools layout';
            MimeType = 'Application/Report/pdftools';
        }
    }
 
    trigger OnInitReport()
    begin
        ExtensionSetup.Get();
        CFLBoCountDynamicsSetup.Get();
    end;
 
    var
        NoOfCopies: Integer;
        ExtensionSetup: Record "Extension Setup";
        CFLBoCountDynamicsSetup: record "CFL BoCount Base Setup";
        CFLDocument: Record "CFL Document";
        CFLFunctions: Codeunit "CFL Functions";
        PDFProgram: Codeunit "CFL PDFProgram";
        CFLReportMgt: Codeunit "CFL Report Management";
        LanguageCode: Code[10];
        LanguageDict: Dictionary of [Text, Dictionary of [Text, Text]];
        TranslationDict: Dictionary of [Text, Text];
        DocumentName: Text;
        Base64: JsonObject;
        intpage: Integer;
        intcounter: Integer;
        PDFCopyIsCreated: Boolean;
        PDFCopy: List of [Text];
        PDFCopyWithStationary: List of [Text];
        //Lines: record "TABLE CONTAINING LINES";
 
    local procedure CFLCheckLine() AddLine: boolean
    begin
        AddLine := true;
    end;
 
    local procedure CFLGetNoOfLinesPerItem() NoOfLinesPerItem: integer
    begin
        NoOfLinesPerItem := 1;
    end;
 
    local procedure CFLAddLineToDocument(NoOfLinesPerItem: integer)
    begin
        if intCounter > CFLDocument."CFL Lines per Page" - NoOfLinesPerItem then
            CFLNewPage();
 
        PDFProgram.CFLSetfield('PDFFIELD TO REPLACE' + '.' + Format(intCounter), 'PDFVALUE TO REPLACE');
        //.....
 
        intCounter += NoOfLinesPerItem;
    end;
 
    local procedure CFLAddTotals()
    begin
    end;
 
    local procedure CFLNewPage()
    begin
        CFLAddPDF();
        intPage += 1;
        intCounter := 0;
 
        PDFProgram.CFLSetField('Pagina', Format(intPage));
 
        PDFProgram.CFLSetfield('PDFFIELD TO REPLACE', 'PDFVALUE TO REPLACE');
        //.....
    end;
 
    local procedure CFLAddPDF()
    var
        CFLBoCountDynamicsMgt: Codeunit "CFL BoCount Dynamics Mgmt";
        FormFlattening: Boolean;
    begin
        if (intPage = 0) then begin
            PDFProgram.CFLSetTemplate(CFLDocument.CFLGetFileBase64());
            PDFProgram.CFLUpdateTemplate(CFLDocument."CFL Lines per Page");
            PDFProgram.CFLSetOutputFile('');
            PDFProgram.CFLStartOutputFile(CFLBoCountDynamicsMgt.GetExtensionName(), CompanyName, DocumentName, '');
            PDFProgram.CFLStartFillPage();
        end else begin
            FormFlattening := true;
            PDFProgram.CFLEndFillPage(false, FormFlattening);
            PDFProgram.CFLAddPageToOutputFile();
            PDFProgram.CFLStartFillPage();
        end;
    end;
 
    local procedure CFLClosePDF() Base64Output: Text;
    var
        CFLWatermarkPosition: Enum "CFL Watermark Position";
        PageNoFormat: Text;
    begin
        CFLAddPDF();
        PDFProgram.CFLCloseOutputFile();
 
        PageNoFormat := TranslationDict.Get('PAGE') + ' : %1/%2';
        Base64Output := PDFProgram.CFLInvoke();
        Base64Output := PDFProgram.CFLAddWatermark(Base64Output, PageNoFormat, CFLWatermarkPosition::"CFL Bottomright", '50', '10', '', '', '', '');
    end;
 
    local procedure CFLGetStationaryBase64(): text
    var
        bgDocument: record "CFL Document";
    begin
        if (CFLBoCountDynamicsSetup."CFL Company Paper" <> '') then begin
            bgDocument.get(CFLBoCountDynamicsSetup."CFL Company Paper");
        end;
        if bgDocument."CFL File Content".HasValue then
            exit(bgDocument.CFLGetFileBase64());
    end;
 
    local procedure CFLGetTranslations(languageCode: Code[10])
    var
        CFLReportMgt: Codeunit "CFL Report Management";
    begin
        if not LanguageDict.ContainsKey(languageCode) then begin
            TranslationDict := CFLReportMgt.CFLLoadTranslationsInDictionary(languageCode, "CFL Translation Table"::"CFL Expression", '');
            LanguageDict.Add(languageCode, TranslationDict);
        end else begin
            TranslationDict := LanguageDict.Get(languageCode);
        end;
    end;
 
    local procedure CFLTranslationDictGet(DictionaryKey: Text) Translation: Text
    var
        CFLExpression: Record "CFL Expression";
        TranslationNotFoundErr: Label 'No translation found for %1 %2 in language %3';
    begin
        if not CFLTryGetTranslation(DictionaryKey, Translation) then begin
            Translation := DictionaryKey;
            Error(StrSubstNo(TranslationNotFoundErr, CFLExpression.TableCaption, DictionaryKey, LanguageCode));
        end;
    end;
 
    [tryfunction]
    internal procedure CFLTryGetTranslation(DictionaryKey: Text; var DictionaryValue: Text)
    begin
        DictionaryValue := TranslationDict.Get(DictionaryKey);
    end;
}

PDF-Tools rapporten extenden

De PDF-Tools rapporten zijn aangepast aan deze nieuwe werking en bevatten heel wat events die het mogelijk maken om het document aan te passen. Het is dus niet langer nodig om het rapport te kopiëren naar je maatwerk-extensie, maar je kan via de events de nodige aanpassingen doen aan het document.

Alle PDF-Tools rapporten zijn op dezelfde manier opgebouwd en bevatten in grote lijnen dezelfde events.

De events worden hieronder opgesomd.

Zie Voorbeeld van extenden van een PDF-Tools rapport.

Events in rapporten

Alle events in de rapporten hebben de eigenschap includesender=true. Er is dus toegang tot het rapport.

CFLOnAfterSetLineFilters

Via dit event heb je toegang tot de regels van het document. Het is mogelijk om de filters op de regels te gaan aanpassen.

CFLOnAfterCheckLine

Voordat een lijn wordt toegevoegd aan de PDF wordt via de functie CFLCheckLine bepaalt of de lijn op het document moet worden afgedrukt. Via dit event is het mogelijk hierin in te grijpen via de parameter Addline.

CFLOnAfterCheckIntrastat

Op bepaalde documenten (zoals factuur, creditnota) wordt intrastat-informatie weergegeven op basis van de functie CFLCheckIntrastat.
Via dit event is het mogelijk in te grijpen in het weergeven van de intrastat-informatie voor de gegeven regel. Dit kan door de parameter AddIntrastat aan te passen.

CFLonAfterGetNoOfLinesPerItem

Op de PDF-Tools rapporten worden de meerdere lijnen op de pdf samengehouden voor 1 regel. Dit gebeurt op basis van de functie CFLGetNoOfLinesPerItem.
Via dit event is het mogelijk in te grijpen op dit aantal lijnen via de parameter NoOfLinesPerItem.
Indien er afbeeldingen worden weergegeven, dan wordt het aantal lijnen voor de afbeelding in de parameter NoOfLinesForImage.

CFLOnBeforeAddLineToDocument

De lijnen op een pdf voor een documentregel worden ingevoegd door de functie CFLAddLineToDocument.
Via dit event is het mogelijk om een eigen invoeging te voorzien. Dit kan door de Handled-parameter op true te zetten. In deergelijk geval zal de functie CFLAddLineToDocument niet worden uitgevoerd.

CFLOnAfterAddLineToDocument

Enkel beschikbaar in Service Order en Quote.

CFLOnAfterSetServiceLineFilters

Via dit event heb je toegang tot de service lines van het document. Het is mogelijk om de filters op de regels te gaan aanpassen.
Enkel beschikbaar in service quote en order.

CFLOnBeforeAddServiceLineToDocument

Enkel beschikbaar in Service Order en Quote.

CFLOnAfterAddServiceLineToDocument

Via dit event is het mogelijk om na de standaard invoeging nog aanpassingen of extra velden te voorzien.
Je hebt hierbij toegang tot de parameter PDFProgram alsook de intCounter.
De intCounter is de lijnteller. Als je dus een extra lijn gaat invoegen, dan dien je deze intCounter te gaan verhogen zodat de volgende lijnen op de correcte plaats worden ingevoegd.

CFLOnAfterAddIntrastatToTemp

Op bepaalde documenten (zoals factuur, creditnota) wordt intrastat-informatie weergegeven.
Hiervoor wordt gebruik gemaakt van de functie CFLAddIntrastatToTemp.
Deze functie zal voor de gegeven documentregel, de nodige zaken invoegen in de tmpTariffNumber parameter.
Via dit event krijg je toegang tot deze parameter en kan je de nodige aanpassingen voorzien.

CFLOnAfterAddTaxToTemp

Op bepaalde documenten (zoals factuur, creditnota) wordt tax-informatie weergegeven. Hiervoor wordt gebruik gemaakt van de functie CFLAddTaxToTemp.
Deze functie zal voor de gegeven documentregel, de nodige zaken invoegen in de tmpTax parameter.
Via dit event krijg je toegang tot deze parameter en kan je de nodige aanpassingen voorzien.

CFLOnBeforeAddLineForDescription2ToDocument

Via de functie CFLAddLineForDescription2ToDocument wordt op de PDF-Tools rapporten een lijn ingevoegd voor de Omschrijving 2 van een documentregel.
Via dit event is het mogelijk om een eigen invoeging te voorzien. Dit kan door de Handled-parameter op true te zetten. In deergelijk geval zal de functie CFLAddLineForDescription2ToDocument niet worden uitgevoerd.

CFLOnAfterAddLineForDescription2ToDocument

Via dit event is het mogelijk om na de standaard invoeging nog aanpassingen of extra velden te voorzien.
Je hebt hierbij toegang tot de parameter PDFProgram alsook de intCounter.
De intCounter is de lijnteller. Als je dus een extra lijn gaat invoegen, dan dien je deze intCounter te gaan verhogen zodat de volgende lijnen op de correcte plaats worden ingevoegd.

CFLOnBeforeAddImageToDocument

Via de functie CFLAddImageToDocument wordt op de PDF-Tools rapporten een afbeelding ingevoegd voor de documentregel.
Via dit event is het mogelijk om een eigen invoeging te voorzien. Dit kan door de Handled-parameter op true te zetten. In dergelijk geval zal de functie CFLAddImageToDocument niet worden uitgevoerd.

CFLOnAfterAddImageToDocument

Via dit event is het mogelijk om na de standaard invoeging nog aanpassingen of extra velden te voorzien.
Je hebt hierbij toegang tot de parameter PDFProgram alsook de intCounter.
De intCounter is de lijnteller. Als je dus een extra lijn gaat invoegen, dan dien je deze intCounter te gaan verhogen zodat de volgende lijnen op de correcte plaats worden ingevoegd.

CFLOnBeforeAddIntrastatToDocument

Via de functie CFLAddIntrastatToDocument wordt op bepaalde PDF-Tools rapporten (bvb. factuur, creditnota) de intrastat-informatie ingevoegd.
Via dit event is het mogelijk om een eigen invoeging te voorzien. Dit kan door de Handled-parameter op true te zetten. In deergelijk geval zal de functie CFLAddIntrastatToDocument niet worden uitgevoerd.

CFLOnAfterAddIntrastatToDocument

Via dit event is het mogelijk om na de standaard invoeging nog aanpassingen of extra velden te voorzien.
Je hebt hierbij toegang tot de parameter PDFProgram alsook de intCounter.
De intCounter is de lijnteller. Als je dus een extra lijn gaat invoegen, dan dien je deze intCounter te gaan verhogen zodat de volgende lijnen op de correcte plaats worden ingevoegd.

CFLOnBeforeAddTaxToDocument

Via de functie CFLAddTaxToDocument wordt op bepaalde PDF-Tools rapporten (bvb. factuur, creditnota) de tax-informatie ingevoegd.
Via dit event is het mogelijk om een eigen invoeging te voorzien. Dit kan door de Handled-parameter op true te zetten. In deergelijk geval zal de functie CFLAddTaxToDocument niet worden uitgevoerd.

CFLOnAfterAddTaxToDocument

Via dit event is het mogelijk om na de standaard invoeging nog aanpassingen of extra velden te voorzien.
Je hebt hierbij toegang tot de parameter PDFProgram alsook de intCounter.
De intCounter is de lijnteller. Als je dus een extra lijn gaat invoegen, dan dien je deze intCounter te gaan verhogen zodat de volgende lijnen op de correcte plaats worden ingevoegd.

CFLOnBeforeAddExpressionToDocument

Via de functie CFLAddExpressionToDocument wordt op bepaalde PDF-Tools rapporten (bvb. factuur, creditnota) extra informatie via uitdrukkingen ingevoegd.
Via dit event is het mogelijk om een eigen invoeging te voorzien. Dit kan door de Handled-parameter op true te zetten. In deergelijk geval zal de functie CFLAddExpressionToDocument niet worden uitgevoerd.

CFLOnAfterAddExpressionToDocument

Via dit event is het mogelijk om na de standaard invoeging nog aanpassingen of extra velden te voorzien.
Je hebt hierbij toegang tot de parameter PDFProgram alsook de intCounter.
De intCounter is de lijnteller. Als je dus een extra lijn gaat invoegen, dan dien je deze intCounter te gaan verhogen zodat de volgende lijnen op de correcte plaats worden ingevoegd.

CFLOnBeforeInsertDocumentFixedText

Via de functie CFLInsertDocumentFixedText wordt op de PDF-Tools rapporten extra informatie via document vaste teksten ingevoegd.
Via dit event is het mogelijk om een eigen invoeging te voorzien. Dit kan door de Handled-parameter op true te zetten. In deergelijk geval zal de functie CFLInsertDocumentFixedText niet worden uitgevoerd.

CFLOnAfterInsertDocumentFixedText

Via dit event is het mogelijk om na de standaard invoeging nog aanpassingen of extra velden te voorzien.
Je hebt hierbij toegang tot de parameter PDFProgram alsook de intCounter.
De intCounter is de lijnteller. Als je dus een extra lijn gaat invoegen, dan dien je deze intCounter te gaan verhogen zodat de volgende lijnen op de correcte plaats worden ingevoegd.

CFLOnBeforeAddTotalsToDocument

Via de functie CFLAddTotalsToDocument wordt op bepaalde PDF-Tools rapporten (bvb. factuur, creditnota) totaalbedragen ingevoegd.
Via dit event is het mogelijk om een eigen invoeging te voorzien. Dit kan door de Handled-parameter op true te zetten. In deergelijk geval zal de functie CFLAddTotalsToDocument niet worden uitgevoerd.

CFLOnAfterAddTotalsToDocument

Via dit event is het mogelijk om na de standaard invoeging nog aanpassingen of extra velden te voorzien.
Je hebt hierbij toegang tot de parameter PDFProgram alsook de intCounter.
De intCounter is de lijnteller. Als je dus een extra lijn gaat invoegen, dan dien je deze intCounter te gaan verhogen zodat de volgende lijnen op de correcte plaats worden ingevoegd.

CFLBeforeNewPage

Via de functie CFLNewPage wordt in de PDF-Tools rapporten een nieuwe pagina gestart. Het is in deze functie dat bvb. hoofding velden worden ingevuld.
Via dit event is het mogelijk om aanpassingen of extra velden op te vullen. Je hebt hierbij toegang tot de parameter PDFProgram.
Via de Handled-parameters is het mogelijk een eigen verwerking te voorzien en de standaard BoCount code niet te laten uitvoeren.

CFLOnAfterNewPage

Via de functie CFLNewPage wordt in de PDF-Tools rapporten een nieuwe pagina gestart. Het is in deze functie dat bvb. hoofding velden worden ingevuld.
Via dit event is het mogelijk om aanpassingen of extra velden op te vullen. Je hebt hierbij toegang tot de parameter PDFProgram.

CFLOnBeforeAddPDF

Via de functie CFLAddPDF wordt een pagina toegevoegd en/of een nieuwe pagina gestart. Het is in deze functie dat de template en briefpapier worden geladen.
Via dit event kan je ingrijpen in dit proces en kan je de functie CFLAddPDF vervangen. Dit kan door de Handled-parameter op true te zetten. In dergelijk geval wordt de functie CFLAddPDF niet uitgevoerd.

CFLOnAfterGetBackgroundDocument

Gebruik dit event om in te grijpen in het gebruikte briefpapier. Via de parameter bgDocument kan je dit instellen op een ander document dan het standaard briefpapier.

CFLOnBeforeEndFillePage

Voordat een pagina wordt afgesloten en toegevoegd aan de pdf, kan je via dit event ingrijpen in het

  • toepassen van briefpapier. Dit kan via de parameter ApplyBackground
  • formflattening. Dit is het verwijderen van de velden en enkel de ingevulde teksten te laten staan. Lege velden worden verwijderd. Dit kan via de parameter FormFlattening.

CFLOnAfterAddPDF

Dit event geeft je toegang tot de PDFProgram, nadat een pagina is toegevoegd aan de pdf.

CFLOnBeforeCloseOutPutFile

Dit event geeft je toegang tot de PDFProgram, net voordat de file wordt gemaakt en afgesloten.

CFLOnClosePDFOnAfterInvoke

Dit event geeft je toegang tot de gecreëerde file, in base64-string.

CFLOnBeforePageNumberOutputFile - OBSOLETED IN BC20 - Replaced by CFLOnBeforeAddPageNumbersToOutputFile

Via dit event krijg je toegang tot de parameter PageNoFormat.
De standaardwaarde voor deze parameter is %1/%2. Dit zorgt voor het plaatsen van pagina-nummering op de pdf.
Je kan ingrijpen in deze paginanummering door aanpassen van PageNoFormat.
%1 is hierbij de huidige pagina. %2 is het totaal aantal pagina's.
Via de Handled parameter kan je het toevoegen van paginanummers vermijden.
Via de PDFProgram parameter krijg je toegang tot de codeunit CFL PDFProgram.

CFLOnBeforeAddPageNumbersToOutputFile

Via dit event krijg je toegang tot de parameter PageNoFormat.
De standaardwaarde voor deze parameter is %1/%2. Dit zorgt voor het plaatsen van pagina-nummering op de pdf.
Je kan ingrijpen in deze paginanummering door aanpassen van PageNoFormat.
%1 is hierbij de huidige pagina. %2 is het totaal aantal pagina's.
Via de Handled parameter kan je het toevoegen van paginanummers vermijden.
Via de PDFProgram parameter krijg je toegang tot de codeunit CFL PDFProgram.

CFLOnBeforeAddPageNumbersToOutputFile

Via dit event krijg je toegang tot de parameter PageNoFormat.
De standaardwaarde voor deze parameter is %1/%2. Dit zorgt voor het plaatsen van pagina-nummering op de pdf.
Je kan ingrijpen in deze paginanummering door aanpassen van PageNoFormat.
%1 is hierbij de huidige pagina. %2 is het totaal aantal pagina's.
Via de Handled parameter kan je het toevoegen van paginanummers vermijden.
Via de PDFProgram parameter krijg je toegang tot de codeunit CFL PDFProgram.

CFLOnBeforeAddSalesConditionsAttachment

Via dit event krijg je toegang tot de bijlagen voordat de verkoopsvoorwaarden worden toegevoegd.
Er is toegang tot de

  • Attachments : codeunit Temp Blob List die de bijlagen bevat.
  • AttachmentNames : list of [text] die de bestandsnamen van de bijlagen bevat.
  • Handled Het is dus mogelijk om extra bijlagen toe te voegen.
    Via de Handled parameter is het mogelijk het toevoegen van de verkoopsvoorwaarden te verhinderen.

CFLOnBeforeShowShippingAddr

Via dit event is het mogelijk het weergeven van het Ship-To adres aan te passen.

CFLOnAfterGetCFLDocument

Via dit event is het mogelijk de gebruikte document aan te passen.

CFLOnBeforeInitializeRequest

Via dit event is het mogelijk in te grijpen in de parameters die worden gezet bij het aanroepen van de functie InitializeRequest.
Deze procedure wordt aangeroepen als het rapport wordt uitgevoerd zonder request-page en de gebruiker dus niet zelf de waarden kan opgeven.

CFLOnAfterGetSalesConditionsDocument

Via dit event is het mogelijk de gebruikte document aan te passen.

Codeunits

CFL Report Management

procedure CFLGetLanguageForCustomer

procedure CFLGetLanguageForCustomer(Customer: record customer) languagecode: code[10]

Haalt de taal van de klant op. Deze functie wordt gebruikt in alle PDF-Tools rapporten om de taal te bepalen.

event CFLOnAfterGetLanguageForCustomer

[EventSubscriber(ObjectType::Codeunit, Codeunit::"CFL Report Management",'CFLOnAfterGetLanguageForCustomer', '', false, false)]
local procedure CFLOnAfterGetLanguageForContact(Customer: record Customer; var languagecode: code[10])
begin
end

procedure CFLGetLanguageForVendor

procedure CFLGetLanguageForVendor(Vendor: record vendor) languagecode: code[10]

Haalt de taal van de leverancier op. Deze functie wordt gebruikt in alle PDF-Tools rapporten om de taal te bepalen.

event CFLOnAfterGetLanguageForVendor

[EventSubscriber(ObjectType::Codeunit, Codeunit::"CFL Report Management",'CFLOnAfterGetLanguageForVendor', '', false, false)]
local procedure CFLOnAfterGetLanguageForContact(Vendor: record Vendor; var languagecode: code[10])
begin
end

procedure CFLGetLanguageForContact

procedure CFLGetLanguageForContact(Contact: record contact) languagecode: code[10]

Haalt de taal van de contact op. Deze functie wordt gebruikt in alle PDF-Tools rapporten om de taal te bepalen.

event CFLOnAfterGetLanguageForContact

[EventSubscriber(ObjectType::Codeunit, Codeunit::"CFL Report Management",'CFLOnAfterGetLanguageForContact', '', false, false)]
local procedure CFLOnAfterGetLanguageForContact(Contact: record Contact; var languagecode: code[10])
begin
end

procedure CFLGetPrinterForReport

procedure CFLGetPrinterForReport(Reportid: integer; var PrinterName: text) PrinterFound: boolean;

Wordt gebruikt in alle PDF-Tools rapporten.
Haalt de printer op voor het rapport. Daarbij wordt gekeken naar de printerselecties. Indien geen printerselectie gekend, dan wordt een lijst van de printers weergegeven zodat een printer kan geselecteerd worden.
Dit gebeurd enkel indien direct printing met printnode is ingesteld in de BoCount Systeeminstellingen (PrintNode API Token).
Indien PrinterFound false is zullen de PDF-Tools rapporten gestopt worden.

event CFLOnBeforeCFLGetPrinterForReport

[EventSubscriber(ObjectType::Codeunit, Codeunit::"CFL Report Management",'CFLOnBeforeCFLGetPrinterForReport', '', false, false)]
local procedure CFLOnBeforeCFLGetPrinterForReport(Reportid: integer; var PrinterName: text; var isHandled: boolean; var PrinterFound: boolean)
begin
end;

Event om in te grijpen op het opzoeken van de printer voor een rapport.
Indien isHandled op true wordt geplaatst zal de standaard BoCount code niet meer doorlopen worden.
PrinterFound is de return-value van de procedure CFLGetPrinterForReport.

procedure CFLIsPrintNodeActivated

procedure CFLIsPrintNodeActivated(): boolean;

Functie voor het nagaan indien direct printing met PrintNode is ingesteld in de BoCount Systeeminstellingen.

procedure CFLLoadTranslationsInDictionary

procedure CFLLoadTranslationsInDictionary(LanguageCode: code[10]; TableFilter: enum "CFL Translation Table"; KeyFilter: text) Dict: Dictionary of [text, text]

Functie voor het opladen van alle vertalingen in een dictionary.

event CFLOnAfterLoadTranslationsInDictionary

[EventSubscriber(ObjectType::Codeunit, Codeunit::"CFL Report Management",'CFLOnAfterLoadTranslationsInDictionary', '', false, false)]
local procedure CFLOnAfterLoadTranslationsInDictionary(LanguageCode: code[10]; TableFilter: enum "CFL Translation Table"; KeyFilter: text; var Dict: Dictionary of [text, text])
begin
end;

event CFLOnAfterGetEmailBodyTemplate

Gebruik dit event om het mailsjabloon voor de body van de mail aan te passen.

event CFLOnAfterGetEmailSubjectTemplate

Gebruik dit event om het mailsjabloon voor het onderwerp van de mail aan te passen.

Codeunit CFL PDFProgram

Deze codeunit bevat alle functies die gebruikt worden binnen PDF-Tools rapporten en doet ook de communicatie naar de Azure Function.
Indien je een nieuw PDF-Tools rapport dient te maken, dan zal je deze codeunit en de functies hierin moeten gebruiken.

SetCompanyPaper

Deze functie heeft 1parameter:

  • String CompanyPaperBase64: base64-string van het briefpapier pdf-bestand.

SetTemplate

Deze functie heeft 1 parameter:

  • String TemplateBase64: base64-string van de template pdf die wordt gebruikt voor aanmaak van een pagina.

UpdateTemplate

Deze functie heeft 1 parameter:

  • Integer NoOfLines: aantal lijnen
    Deze functie gaat de template overlopen naar velden en voor alle velden met in de veldnaam een “.” Gevolgd door een getal (bvb artref.0) zal dit de velden kopiëren in evenveel lijnen als de parameter opgeeft.
    De lijnen starten bij eerste veld met “.0” en worden naar beneden gekopieerd en naar boven indien het veld een getalwaarde heeft groter dan 0. (bvb langeomschrijving.1 wordt 1 x naar boven gekopieerd als langeomschrijving.0 en verder een aantal keer naar beneden).

CFLSetOutputFile

Deze functie heeft een string als parameter. Deze parameter wordt echter niet meer gebruikt en je geeft dus best een lege string door.

CFLStartOutputFile

Deze functie heeft 4 parameters:

  • String Creator: zet de creator op de outputfile
  • String Author: zet de author op de output file
  • Sting Title: zet de title op de output file
  • String Subject: zet de subject op de output file

PDF-Toolsproperties

CFLStartFillPage

Deze functie start het opvullen van een nieuwe pagina.

CFLEndFillPage

Deze functie eindigt het opvullen van een pagina.
Deze functie heeft 2 parameters:

  • Boolean AddBackground: bij true zal dit de pdf die is ingesteld via de functie SetCompanyPaper toepassen als achtergrond op de pdf.
  • Boolean FormFlattening: bij true worden alle invulvelden op de pdf vervangen door hun waarde (standaard). Bij false blijven alle velden als invulbare velden bestaan op de pdf.

CFLAddPageToOutputFile

Deze functie gaat de ingevulde pagina gaan toevoegen aan de outputfile.

CFLCloseOutputFile

Deze functie finaliseert de outputfile tot leesbare pdf.

CFLPageNoOutPutFile

Deze functie voegt paginanummers toe aan het pdf bestand.
Deze functie heeft 1 parameter:

  • PageNoText: text De PageNoText kan 2 placeholders bevatten:
  • %1: huidige pagina
  • %2: totaal aantal pagina's Zo zal een PageNoText 'Pagina %1 van %2' leiden tot bvb 'Pagina 1 van 2'.

Veldfuncties

CFLSetField

Deze functie heeft 2 parameters:

  • String FieldName: veldnaam van het veld dat je wenst in te vullen
  • String FieldValue: de waarde die je wenst in te vullen in het veld
PDFProgram.CFLSetField('TypeDocument', (txtPurchReceipt));

CFLSetFieldColor

Deze functie heeft 4 parameters:

  • String FieldName: veldnaam van het veld dat je wenst aan te passen
  • Integer R : red value van RGB-kleur
  • Integer G: green value van RGB-kleur
  • Integer B: blue value van RGB-kleur
PDFProgram.CFLSetFieldColor('TypeDocument',255,0,0);

CFLSetFieldBackgroundColor

Deze functie heeft 4 parameters:

  • String FieldName: veldnaam van het veld dat je wenst aan te passen
  • Integer R : red value van RGB-kleur
  • Integer G: green value van RGB-kleur
  • Integer B: blue value van RGB-kleur
PDFProgram.CFLSetFieldBackgroundColor('TypeDocument',0,0,255);

CFLSetFieldBorderColor

Deze functie heeft 4 parameters:

  • String FieldName: veldnaam van het veld dat je wenst aan te passen
  • Integer R : red value van RGB-kleur
  • Integer G: green value van RGB-kleur
  • Integer B: blue value van RGB-kleur
PDFProgram.CFLSetFieldBorderColor('TypeDocument',0,0,255);

CFLSetFieldBold

Deze functie zal de tekst van het veld in vet plaatsen.
Deze functie heeft 1 parameter:

  • String FieldName: veldnaam van het veld dat je wenst aan te passen
PDFProgram.CFLSetFieldBold('TypeDocument');

CFLSetFieldItalic

Deze functie zal de tekst van het veld in italic plaatsen.
Deze functie heeft 1 parameter:

  • String FieldName: veldnaam van het veld dat je wenst aan te passen
PDFProgram.CFLSetFieldItalic('TypeDocument');

CFLSetFieldBoldItalic

Deze functie zal de tekst van het veld in bold en italic plaatsen.
Deze functie heeft 1 parameter:

  • String FieldName: veldnaam van het veld dat je wenst aan te passen
PDFProgram.CFLSetFieldBoldItalic('TypeDocument');

CFLSetFieldFont

Met deze functie kan je zowel font als kleur als stijl van het veld gaan bepalen.
De functie heeft 4 parameters:

  • String FieldName: veldnaam van het veld dat je wenst aan te passen
  • String FontBase64: base64-string van het font dat je wil gebruiken
  • Integer fontsize: tekstgrootte
  • Integer fontstyle:
    o 0 = normaal
    o 1 = bold
    o 2 = italic
    o 3 = bold italic
PDFProgram.CFLSetFieldFont('TypeDocument',FontBase64,12,1);  

CFLSetFieldImage

Met deze functie is het mogelijk om op de plaats van een veld een afbeelding in te voegen
Deze functie heeft 3 parameters:

  • String FieldName: veldnaam van het veld dat je wenst aan te passen
  • String ImageBase64 : base64-string van de afbeelding die je wenst in te voegen
  • Integer Height: de hoogte van de afbeelding die je wenst in het bestand. Scaling gebeurt proportioneel volgens de hoogte.
PDFProgram.CFLSetFieldImage('Afbeelding.' + FORMAT(intCounter), ImageBase64, 100);

CFLSetFieldBarcode

Met deze functie is het mogelijk om op de plaats van een veld een barcode in te voegen
Deze functie heeft 6 parameters:

  • String FieldName: veldnaam van het veld dat je wenst aan te passen
  • BarcodeData : de gegevens die je in de vorm van een barcode wil weergeven.
  • BarcodeType : het type van de barcode. De mogelijke opties zijn Code39, EAN13, EAN128, QR Code.
  • Integer Height: de hoogte van de barcode die je wenst in het bestand. Scaling gebeurt proportioneel volgens de hoogte.
  • HumanReadable : de tekst die onder de barcode wordt weergegeven. Dit is alleen van toepassing voor Code39, EAN128. Voor andere barcodetypes laat je de parameter leeg.
  • FNC1 : hiermee geef je het FNC1 karakter mee, die in je gebruikt in de BarcodeData ,dit zal normaalgezien de waarde uit het veld FNC1 karakter zijn uit de barcode-tabel. Dit zal vervangen worden door het effectieve FNC1-karakter uit de barcode symbologie. Dit is enkel van toepassing voor EAN128, voor andere barcodetypes laat je de parameter leeg.
PDFProgram.CFLSetFieldBarcode('Afbeelding.' + FORMAT(intCounter), '5434765498010',BarcodeType::"CFL EAN13" ,40,'','');

Met deze functie is het mogelijk een klikbare link te plaatsen op een veld.
Deze functie heeft 2 paramaters:

  • String FieldName: veldnaam van het veld dat je wenst te voorzien van link
  • String Hyperlink: de link die je wenst toe te passen op het veld

CFLSetFont

Met deze functie is het mogelijk om in1 beweging het lettertype van alle invulvelden aan te passen.
Deze functie dient aangeroepen te worden alvorens de functie “UpdateTemplate” wordt uitgevoerd.
Deze functie heeft 3 parameters:

  • String FontBase64: base64-string van het font dat je wil gebruiken
  • Integer fontsize: tekstgrootte
  • Integer fontstyle:
    o 0 = normaal
    o 1 = bold
    o 2 = italic
    o 3 = bold italic
PDFProgram.CFLSetFont(FontBase64, 12, 0);

Voorbeeld

Voor een correcte afhandeling dienen de verschillende functies in de juiste volgorde te worden aangeroepen.

Bij starten van een pagina:

PDFProgram.CFLSetTemplate(txtPdfFolder + CFLDocument."CFL File"); //instellen van de template
PDFProgram.CFLSetCompanyPaper(txtPdfFolder + bgDocument."CFL File"); //instellen van het briefpapier  
PDFProgram.CFLUpdateTemplate(txtPdfFolder + CFLDocument."CFL File", CFLDocument."CFL Lines per Page"); //template aanpassen voor meerdere regels
PDFProgram.CFLSetOutputFile(OutputFile); //instellen van output file
PDFProgram.CFLStartOutputFile(CFLBoCountDynamicsMgt.GetExtensionName(), CompanyName); //aanmaak van de outputfile
PDFProgram.CFLStartFillPage(); //start opvullen van de velden

Op einde van een pagina:

PDFProgram.CFLEndFillPage(true, true); //afsluiten van de pagina, met eventueel toepassen van het briefpapier
PDFProgram.CFLAddPageToOutputFile(); //de gemaakte pagina toevoegen aan het output bestand

Op einde van het document:

PDFProgram.CFLCloseOutputFile(); //output bestand sluiten.

Deze sequentie van functies zit in elk PDF-Tools rapport vervat in deze functies:

  • CFLAddPDF: deze functie beëindigt de reeds opgevulde pdf en voegt die toe aan het output pdf bestand en die start een nieuwe pagina.
  • CFLClosePDF: deze functie beëindigt de pdf en roept de Azure function aan. de functie retourneert het pdf-bestand in een tempBlob-codeunit.
local procedure CFLAddPDF()
var
    bgDocument: record "CFL Document";
    ApplyBackground: boolean;
    CFLBoCountDynamicsMgt: Codeunit "CFL BoCount Dynamics Mgmt";
    CFLBase64Convert: codeunit "CFL Base64 Convert";
    IStream: instream;
    CFLFile: record "CFL Files";
    CLFRootFolderMgt: codeunit "CFL Root Folder Mgt";
    cflRootFolderType: enum "CFL Root Sub Folder Type";
    OStream: OutStream;
    tempBlob: Codeunit "Temp Blob";
    Handled: boolean;
    FormFlattening: boolean;
begin
    CFLOnBeforeAddPDF(PDFProgram, Handled);
    If Handled then exit;
    CFLBoCountDynamicsSetup.get;
    IF (intPage = 0) and ((RecordCounter = 0) or ((not BatchOutput) or (optPrint = optPrint::Automatic))) THEN BEGIN
        if CFLDocument."CFL Company paper" and (CFLBoCountDynamicsSetup."CFL Company Paper" <> '') then begin
            bgDocument.get(CFLBoCountDynamicsSetup."CFL Company Paper");
            PDFProgram.CFLSetCompanyPaper(bgDocument.CFLGetFileBase64());
         end;
        PDFProgram.CFLSetTemplate(CFLDocument.CFLGetFileBase64());
        //PDFProgram.CFLSetFont('C:\Windows\Fonts\segoeui.ttf', 12, 0);
        PDFProgram.CFLUpdateTemplate(CFLDocument."CFL Lines per Page");
        if ((not BatchOutput) or (optPrint = optPrint::Automatic)) or (RecordCounter = 0) then begin
            PDFProgram.CFLSetOutputFile(OutputFile);
            PDFProgram.CFLStartOutputFile(CFLBoCountDynamicsMgt.GetExtensionName(), CompanyName, txtDocumentName, '');
        end;
        PDFProgram.CFLStartFillPage();
    end else begin
        ApplyBackground := true;
        IF (CFLBoCountDynamicsSetup."CFL Company Paper" = '') or (not CFLDocument."CFL Company paper") then ApplyBackground := false;
        IF ((optPrint = optPrint::Print) OR
            ((optPrint = optPrint::Automatic) AND ((NOT Customer."CFL Electronic Invoicing") OR
            (Customer."CFL E-Mail Invoices" = '') OR (NOT CFLBoCountDynamicsSetup."CFL Electronic Invoicing"))))
            AND (CFLDocument."CFL Company paper" AND (CFLDocument."CFL Print on Company paper")) THEN BEGIN
                ApplyBackground := false;
        end;
        FormFlattening := true;
        CFLOnBeforeEndFillePage(PDFProgram, ApplyBackground, FormFlattening);
        PDFProgram.CFLEndFillPage(ApplyBackground, FormFlattening);
        PDFProgram.CFLAddPageToOutputFile();
        PDFProgram.CFLStartFillPage();
    end;
    CFLOnAfterAddPDF(PDFProgram);
end;
local procedure CFLClosePDF() OutputFile: codeunit "Temp Blob"
var
    Base64Output: Text;
    base64: Codeunit "Base64 Convert";
    file: File;
    OStream: OutStream;
    PageNoFormat: text;
    Handled: boolean;
begin
    CFLAddPDF();
    PDFProgram.CFLCloseOutputFile();
    PageNoFormat := '%1/%2';
     CFLOnBeforeAddPageNumbersToOutputFile2(PageNoFormat, Position, MarginHorizontal, MaringVertical, Size, Rotation, FontName, Color, Opacity, Handled, PDFProgram);
    if not handled then
        PDFProgram.CFLPageNumberOutputFile(PageNoFormat);
    Base64Output := PDFProgram.CFLInvoke();
    OutputFile.CreateOutStream(OStream);
    base64.FromBase64(Base64Output, OStream);
end;
[IntegrationEvent(true, false)]
local procedure CFLOnBeforeAddPageNumbersToOutputFile2(var PageNoFormat: text; var Position: enum "CFL Watermark Position"; var MarginHorizontal: text; var MarginVertical: text; var Size: text; var Rotation: text; var FontName: text; var Color: text; var Opacity: text; var Handled: boolean; var PDFProgram: codeunit "CFL PDFProgram")
begin
end;

CFLInvoke

Alle vorige functies gaan op zich een json vullen. Bij deze functie wordt de Azure Function aangeroepen en wordt de opgebouwde json, die de sequentie van functions bevat, mee doorgestuurd. Op basis van deze json zal de Azure Function de pdf aanmaken en die retourneren in base64.

CFLGetNoOfRowsForImageHeight

Deze functie heeft 3 parameters:

  • String FieldName: veldnaam van het veld dat je wenst aan te passen
  • Integer Height: de hoogte van de afbeelding
  • TemplateBas64 : base64-string van de template
    Deze functie heeft een integer retourwaarde met daarin het aantal lijnen dat je moet overslaan voor invoegen van de afbeelding/Barcode.

CFLMergePDF

Deze functie heeft 5 parameters:

  • PDFFilesINBase64 : list of [text], bevat de base64-strings van de bestanden, in de volgorde zoals ze in de outputfile moeten zitten.
  • String Creator: zet de creator op de outputfile
  • String Author: zet de author op de output file
  • Sting Title: zet de title op de output file
  • String Subject: zet de subject op de output file

CFLAddWatermark2

Deze functie heeft parameters:

  • PDFBase64: text bevat de base64-string van de PDF waarop je een watermark will toepassen
  • WatermarkText: text
    bevat de text die als watermark op document moet geplaatst worden
    De WatermarkText kan 2 placeholders bevatten:
    - %1: huidige pagina
    - %2: totaal aantal pagina's
  • Position: enum "CFL Watermark Position" bevat de positie van het watermark. De mogelijke opties zijn: topleft,top,topright,bottomleft,bottom,bottomright,middle
  • Margin: text Marge van de watermark tekst
  • Size: text fontsize van de watermark tekst
  • Rotation: text Rotatie in graden van watermark
  • FontName: text Naam van het font van de watermark tekst. Enkel de standaard pdf fonts zijn beschikbaar. de standaard pdf fonts zijn: Courier, Courier-Bold, Courier-Oblique, Courier-BoldOblique, Helvetica, Helvetica-Bold, Helvetica-Oblique, Helvetica-BoldOblique, Times-Roman, Times-Bold, Times-Italic, Times-BoldItalic, Symbol, ZapfDingbats
  • Color: text Kleur van de watermark tekst.
  • Opacity: text Opacity van de watermark tekst

CFLAddDocumentNo

Deze functie heeft 2 overloads:

  • CFLAddDocumentNo(PDFBase64: text; DocNo: text; var tempblob: codeunit "Temp Blob")
  • CFLAddDocumentNo(PDFBase64: text; DocNo: text): text Deze functie voegt het documentnummer toe in de rechterbovenhoek van de pdf.
    Deze functie gebruikt hiervoor de CFLAddWatermark2-functie.

CFLAddCopyWatermark

Deze functie heeft 2 parameters:

  • PDFBase64: text, base64-string van de pdf
  • LanguageCode: code[10], taalcode voor de copy-tekst Deze functie gaat de KOPIE-uitdrukking gebruiken in de gewenste taal en die toepassen als watermark, in het midden van de pagina in grote rode letters onder hoek van 45 graden.
    Deze functie gebruikt hiervoor de CFLAddWatermark2-functie.

CFLExtractPDFText

Deze functie heeft 1 parameter:

  • PDFBase64: text, base64-string van de pdf De functie retourneert alle tekst die aanwezig is in de pdf.

PDF-Tools mailen

Alle PDF-Tools rapporten zijn voorzien van een mail-optie en daarvoor is waar nodig een e-mailscenario voorzien.
Dit zijn alle enum-extensions op het standaard mailscenario:

  • 2098100 "CFL Sales Shipment"
  • 2098101 "CFL Purchase Receipt"
  • 2098102 "CFL Purchase Return Order"
  • 2098103 "CFL Purchase Return Shipment"
  • 2098104 "CFL Sales Return Order"
  • 2098105 "CFL Sales Return Receipt"
  • 2098106 "CFL Sales Blanket Order"
  • 2098107 "CFL Purchase Blanket Order"
  • 2098108 "CFL Purchase Invoice"
  • 2098109 "CFL Purchase Credit Memo"
  • 2098110 "CFL Service Shipment"
  • 2098111 "CFL Service Contract"

PDF-Tools rapport vervangen

BoCount Dynamics Base gaat op een aantal plaatsen uit van zijn standaard-rapporten. Hoewel deze extendable zijn, kan het in sommige gevallen toch nodig zijn om die te vervangen door andere rapporten.
In dergelijke gevallen is het belangrijk te weten dat op een aantal plaatsen zal moeten ingegrepen worden om te vermijden dat BoCount de standaard rapporten zal runnen.

WARNING

Het is niet voldoende om het rapport in de rapportselecties aan te passen. op een aantal plaatsen zit het PDF-Tools rapport hardcoded.

WARNING

Vanaf BC22 is dit niet meer nodig. De PDF-Tools rapporten zijn dan volledig geintegreerd in de standaard afhandeling van rapporten. Dit betekent dat alle onderstaande aanpassingen niet nodig zijn. Enkel de rapportselecties aanpassen is voldoende (indien je rapport aan de nieuwe werkwijze van PDF-Tools rapporten voldoet).

Bijvoegen als pdf op de lijst en kaartschermen.

De standaard knoppen hiervoor zijn door BoCount vervangen door eigen knoppen. Deze gaan uit van het standaard BoCount PDF-Tools rapport. Bij gebruik van een ander rapport zullen de BoCount acties dan ook moeten vervangen worden.

WARNING

Obsolete vanaf BC22. PDF-Tools rapporten integreren in standaard rapport afhandeling.

Ook grijpt BoCount Dynamics Base in op een aantal events.

codeunit CFL Attach PDF

event CFLSalesInvHeaderCFLOnBeforeCFLOnBeforePrintToDocumentAttachment

local procedure CFLSalesInvHeaderCFLOnBeforeCFLOnBeforePrintToDocumentAttachment(var SalesInvHeader: record "Sales Invoice Header"; var Handled: boolean)
begin
end;
WARNING

Obsolete vanaf BC22. PDF-Tools rapporten integreren in standaard rapport afhandeling.

event CFLSalesCrMemoHeaderCFLOnBeforeCFLOnBeforePrintToDocumentAttachment

local procedure CFLSalesCrMemoHeaderCFLOnBeforeCFLOnBeforePrintToDocumentAttachment(var SalesCrMemoHeader: record "Sales Cr.Memo Header"; var Handled: boolean)
begin
end;
WARNING

Obsolete vanaf BC22. PDF-Tools rapporten integreren in standaard rapport afhandeling.

event CFLServiceInvHeaderCFLOnBeforeCFLOnBeforePrintToDocumentAttachment

local procedure CFLServiceInvHeaderCFLOnBeforeCFLOnBeforePrintToDocumentAttachment(var ServiceInvHeader: record "Service Invoice Header"; var Handled: boolean)
begin
end;
WARNING

Obsolete vanaf BC22. PDF-Tools rapporten integreren in standaard rapport afhandeling.

event CFLServiceCrMemoHeaderCFLOnBeforeCFLOnBeforePrintToDocumentAttachment

local procedure CFLServiceCrMemoHeaderCFLOnBeforeCFLOnBeforePrintToDocumentAttachment(var ServiceCrMemoHeader: record "Service Cr.Memo Header"; var Handled: boolean)
begin
end;
WARNING

Obsolete vanaf BC22. PDF-Tools rapporten integreren in standaard rapport afhandeling.

codeunit CFL DocSendingProfile Subs

In deze codeunit wordt ingehaakt op een aantal events in het proces van verzendprofielen en worden de standaard BoCount PDF-Tools rapporten uitgevoerd. Indien je de rapportselectie hebt aangepast naar een eigen PDF-Tools rapport, dan zal je gelijkaardige subscribers met gelijkaardige code moeten voorzien zodat je eigen rapport zal worden uitgevoerd.
Voor een rdlc of word rapport zal dit niet nodig zijn en zal de standaard dit kunnen afhandelen.

WARNING

Obsolete vanaf BC22. PDF-Tools rapporten integreren in standaard rapport afhandeling.

codeunit CFL Base Report Management

In deze codeunit wordt ingehaakt op een aantal events in het proces van mailen van een rapport.
Hierbij wordt de standaard BC werking overruled, en de BoCount PDF-Tools rapporten gemaild.
Indien je een eigen rapport hebt, dan kan het nodig zijn om in te haken op een van de events, waarbij het dan mogelijks is de standaard BoCount werking te overrulen. Je zal dan gelijkaardige code moeten voorzien, die je eigen rapport gaat mailen.

event OnBeforeCFLSalesShipmentHeaderOnBeforeEmailRecords

local procedure OnBeforeCFLSalesShipmentHeaderOnBeforeEmailRecords(VAR SalesShipmentHeader: Record "Sales Shipment Header"; SendDialog: Boolean; VAR IsHandled: Boolean)
begin
end;

Gebruik dit event om het PDF-Tools rapport voor de verkoopverzending aan te passen.

WARNING

Obsolete vanaf BC22. PDF-Tools rapporten integreren in standaard rapport afhandeling.

event OnBeforeCFLSalesCrMemoHeaderOnBeforeEmailRecords

local procedure OnBeforeCFLSalesCrMemoHeaderOnBeforeEmailRecords(VAR ReportSelections: Record "Report Selections"; VAR SalesCrMemoHeader: Record "Sales Cr.Memo Header"; DocTxt: Text; ShowDialog: Boolean; VAR IsHandled: Boolean)
begin
end;

Gebruik dit event om het PDF-Tools rapport voor de verkoopcreditnota aan te passen.

WARNING

Obsolete vanaf BC22. PDF-Tools rapporten integreren in standaard rapport afhandeling.

event OnBeforeCFLSalesInvoiceHeaderOnBeforeEmailRecords

local procedure OnBeforeCFLSalesInvoiceHeaderOnBeforeEmailRecords(VAR ReportSelections: Record "Report Selections"; VAR SalesInvoiceHeader: Record "Sales Invoice Header"; DocTxt: Text; ShowDialog: Boolean; VAR IsHandled: Boolean)
begin
end;

Gebruik dit event om het PDF-Tools rapport voor de verkoopfactuur aan te passen.

WARNING

Obsolete vanaf BC22. PDF-Tools rapporten integreren in standaard rapport afhandeling.

event CFLOnBeforeDoPrintSalesHeader

local procedure CFLOnBeforeDoPrintSalesHeader(VAR SalesHeader: Record "Sales Header"; ReportUsage: Integer; SendAsEmail: Boolean; VAR IsPrinted: Boolean)
begin
end;

Gebruik dit event om het PDF-Tools rapport voor de verkoopofferte, orderbevestiging, verkoopraamcontract, pro-forma factuur aan te passen.

WARNING

Obsolete vanaf BC22. PDF-Tools rapporten integreren in standaard rapport afhandeling.

codeunit CFL Issued Reminder Hdr. Subs

event CFLIssuedReminderHeaderOnBeforePrintRecords

local procedure CFLIssuedReminderHeaderOnBeforePrintRecords(var IssuedReminderHeader: Record "Issued Reminder Header"; ShowRequestForm: Boolean; SendAsEmail: Boolean; HideDialog: Boolean; var IsHandled: Boolean; var CFLIsHandled: boolean)
begin
end;

Gebruik dit event om het PDF-Tools rapport voor de aanmaning aan te passen.

WARNING

Obsolete vanaf BC22. PDF-Tools rapporten integreren in standaard rapport afhandeling.

QR-code om mobiel te betalen op een PDF-Tools-verkoopfactuur

Op een verkoopfatuur kan een QR-code afgedrukt worden, zodat klanten die factuur gemakkelijk kunnen betalen door die QR-code te scannen. Momenteel wordt het type EPC QR (meer informatie) ondersteund, later kunnen andere types toegevoegd worden.

Enums

CFL Document Barcode Type

Deze enum bevat alle ondersteunde QR-types (momenteel enkel EPC QR), maar die enum is uitbreidbaar. Om een ander type QR-code af te drukken dient de functie "CFLGetContent" van de interface "CFLDocumentBarcodeTypeInterface" de juiste inhoud terug te geven.

Events

CFLOnBeforeAddBarcodeToDocument

Gebruik dit event om in te grijpen vóór het plaatsen van de barcode (om bijvoorbeeld de plaats of de grootte van de standaardbarcode aan te passen).

[IntegrationEvent(true, false)]
local procedure CFLOnBeforeAddBarcodeToDocument(SalesInvHeader: record "Sales Invoice Header"; var intCounter: integer; var PDFProgram: codeunit "CFL PDFProgram"; var handled: Boolean; TranslationDict: Dictionary of [text, text])
begin
end;