netsuitesuitescript2.0

Netsuite problem rendering an Advanced PDF with current record data via Suitelet 2.0


The Problem: I need to create a dummy packing slip from an open sales order for drop-ship customers.

Step 1: I've made a user-event button that calls this client-script click handler:

define(['N/url', 'N/currentRecord'], function (url, currentRecord) {
    function pageInit(context) {
    }

 function onButtonClick() {
    var suiteletUrl = url.resolveScript({
        scriptId: 'customscript_zg_drop_packingslip_pdf', // my suitelet script id
        deploymentId: 'customdeploy_zg_drop_packingslip_pdf', // my suitelet deployment id
        returnExternalUrl: false,
      params: {
            custom_id: currentRecord.get().id,
        },
    });

    window.open(suiteletUrl);
}

    exports.onButtonClick = onButtonClick;
    exports.pageInit = pageInit;
    return exports;
});

Step 2: I'm stuck on the suitelet. I want it to pull data from the current record and pass it through an Advanced PDF template to create my drop-ship packing slip in a new window.

define(['N/render', 'N/record', 'N/xml'],
function(render, record, xml) {
  function onRequest(context) {
    var id = context.request.parameters.custom_id;
    if (!id) {
        context.response.write('The parameter "custom_id" is required');
        return;
    }
        var renderer = render.create(id);
        renderer.setTemplateByScriptId("CUSTTMPL_128_3768700_732"); // The ID of my Packing Slip Advanced PDF Template
        var myPdf = context.response.write(renderer.templateContent);
    }
    return {
      onRequest:onRequest
    }
})

The current output is not showing up as a pdf, it stretches and scales with the browser window. And instead of passing my current record data through it, I only get the schema-browser token ids. It currently looks like this:

Fig 1

But I want it to look like this (as my Advanced PDF Template actually looks), with real data from the current sales order, and as an in-browser pdf which I can save, print, and email. I do not need to create or store these files in the file cabinet:

Fig2 How do I get my suitelet to pull the open order data and render it as a pdf from my template?


Solution

  • When you want to generate a PDF file, you must use:

    context.response.writeFile(renderer.renderAsPdf());
    

    Also the renderer.create function doesn't accept an "id" : you will find good examples on how to generate the PDF file here: https://system.netsuite.com/app/help/helpcenter.nl?fid=section_4412042824.html

    An example is :

    var renderer = render.create();
    renderer.addRecord('saleorder', record.load({
        type: record.Type.SALES_ORDER,
        id: context.request.parameters.custom_id
    }));
    renderer.setTemplateByScriptId("CUSTTMPL_128_3768700_732");
    context.response.writeFile(renderer.renderAsPdf());