How to combine 3 pdf’s into single pdf in suitelet script 2.0?

This is suitelet script which generates n different pdf’s for n work orders. Now instead of printing different pdf’s for each work order data, I want to print single pdf and show different work order data on different pdf page on the same single pdf.

Please Help!

/**
 * @NApiVersion 2.1
 * @NScriptType Suitelet
 */
define([
  “N/https”,
  “N/record”,
  “N/render”,
  “N/file”,
  “N/search”,
  “N/url”,
], function (https, record, render, file, search, url) {
  function renderPDF(context) {
       var requestparam = context.request.parameters;
    var recId = requestparam.recId;
    var waveNumber = requestparam.waveNumber;
     var waveNumberforRecord = requestparam.waveNumberforRecord;
    var recType = requestparam.recType;
    log.debug(“waveNumber”, waveNumber);
    //created saved search on work order record for generated wave number form existing suitelet page.
    var customrecord_ts_wo_bulkpickSearchObj = search.create({
      type: “customrecord_ts_wo_bulkpick”,
      filters: [[“custrecord_wmsts_wo_wave”, “is”, waveNumber]],
      columns: [
        search.createColumn({
          name: “name”,
          sort: search.Sort.ASC,
          label: “Name”,
        }),
        search.createColumn({
          name: “custrecord_wmsts_workorder”,
          label: “WO#”,
        }),
      ],
    });
    let resultsearch = customrecord_ts_wo_bulkpickSearchObj
      .run()
      .getRange(0, 1000);
    // log.debug(“resultsearch “, resultsearch);
    //search length
    var resultLen = resultsearch.length;
    log.debug(“resultLen “, resultLen);
    //initialized counter to zero
    var count = 0;
    var fileArray = [];
    //loop on search result length for work orders to print PDF.This is the main for loop.
    for (var i = 0; i < resultLen; i++) {   //Main Loop start……………………
      //fetched work order id
      var WOID = resultsearch[i].getValue({
        name: “custrecord_wmsts_workorder”,
        label: “WO#”,
      });
       log.debug(“WOID “,WOID);
       //Load Work Order Record
       var objWO = record.load({
        type:record.Type.WORK_ORDER,
        id: WOID,
        isDynamic: true,
    });
    log.debug(“objWO”,objWO);
    var buildSheet=objWO.getValue({
      fieldId: ‘custbody_ccl_build_sheet_number’
  });
  log.debug(“buildSheet”,buildSheet);
    //Get Routing Name
    var routingName = objWO.getText({
        fieldId: ‘manufacturingrouting’
    });
    log.debug(“routingName”,routingName);
      //created saved search from work order id to fetch sales order id or sales order link as well as manufacturing routing record from that work order.
      var workorderSearchObj = search.create({
        type: “workorder”,
        filters: [
          [“mainline”, “is”, “T”],
          “AND”,
          [“type”, “anyof”, “WorkOrd”],
          “AND”,
          [“internalid”, “anyof”, WOID],
        ],
        columns: [
          search.createColumn({ name: “custbody2”, label: “SO Link” }),
          search.createColumn({
            name: “tranid”,
            sort: search.Sort.ASC,
            label: “Document Number”,
          }),
          search.createColumn({
            name: “manufacturingrouting”,
            label: “Manufacturing Routing”,
          }),
          search.createColumn({name: “department”, label: “Department”})
        ],
      });
      let searchResultCount = workorderSearchObj.run().getRange(0, 1000);
      log.debug(“searchResultCount “, searchResultCount);
      //fetched sales order link from work order record
      var SOID = searchResultCount[0].getValue({
        name: “custbody2”,
        label: “SO Link”,
      });
      log.debug(“SOID”,SOID);
      if (!SOID) {
        // Display error message for this Work Order and skip further processing
        throw ‘Error: Sales Order Link is not present for this work order.’;
    }
      // log.debug(“SOID “, SOID);
      var department = searchResultCount[0].getText({
        name: “department”, label: “Department”
      });
      log.debug(“department”,department);
      //fetched work order number from search
      var WOIDNumber = searchResultCount[0].getValue({
        name: “tranid”,
        sort: search.Sort.ASC,
        label: “Document Number”,
      });
      log.debug(“WOIDNumber “, WOIDNumber);
      //fetched manufacturing routing number from work order search
      var RoutingNo = searchResultCount[0].getValue({
        name: “manufacturingrouting”,
        label: “Manufacturing Routing”,
      });
      log.debug(“RoutingNo “, RoutingNo);
      //readjust the libk to get only SO internal ID from SO Link
      var fields = SOID.split(“=”);
      var SalesOrderId = fields[1];
      log.debug(“SalesOrderId”, SalesOrderId);
      //load sales order record dynamically
      var loadSO = record.load({
        type: “salesorder”,
        id: SalesOrderId,
        isDynamic: true,
      });
      log.debug(“loadSO”,loadSO);
      var sfSoNumber=loadSO.getText({
        fieldId: “custbody_sf_so_number”,
      });
      log.debug(“sfSoNumber”,sfSoNumber);
      //fetched customer name from Sales order
      var custName = loadSO.getText({
        fieldId: “entity”,
      });
      //  log.debug(“custName “, custName);
      //fetched location from sales order
      var location = loadSO.getText({
        fieldId: “location”,
      });
      // log.debug(“location “, location);
      //fetched transaction id fron sales order
      var tranidSO = loadSO.getText({
        fieldId: “tranid”,
      });
      // log.debug(“tranidSO “, tranidSO);
      //fetched ship to address from sales order
      var shipTo = loadSO.getText({
        fieldId: “shipaddress”,
      });
      //  log.debug(“shipTo “, shipTo);
      //get shipping address subrecord from sales order
      var subrec = loadSO.getSubrecord({
        fieldId: “shippingaddress”,
      });
      //fetched all subrecord values to set address shipto
      var addressee = subrec.getValue(“addressee”);
      var phone = subrec.getValue(“addrphone”);
      var addr1 = subrec.getText(“addr1”);
      var city = subrec.getText(“city”);
      var state = subrec.getValue(“state”);
      var zip = subrec.getText(“zip”);
      var country = subrec.getText(“country”);
      //Date Time Logic
      var currentDate = new Date();
  var year = currentDate.getFullYear();
  var month = String(currentDate.getMonth() + 1).padStart(2, “0”);
  var day = String(currentDate.getDate()).padStart(2, “0”);
  var hours = String(currentDate.getHours()).padStart(2, “0”);
  var minutes = String(currentDate.getMinutes()).padStart(2, “0”);
  var seconds = String(currentDate.getSeconds()).padStart(2, “0”);
  var formattedDateTime = `${month}-${day}-${year} ${hours}:${minutes}:${seconds}`;
  log.debug(“formattedDateTime”,formattedDateTime);
      //first table header started
      //to design PDF in xml this is the first header table
      var strVar= ” “;
       //Date Time table
    strVar +=
    ‘<table style=”width: 100%; margin-top: 2px; height: 10%;” ><tr>’;
  strVar +=
    ‘<td align=”right” colspan=”20″ style=”font-size: 10pt;border:0px;font-family: Arial, Helvetica, sans-serif;”>’+formattedDateTime+'</td>’;
  strVar += “</tr>”;
  strVar += “</table>”;
    //strVar +=
        //'<p style=”margin-left:200px;”>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Date time</p>’
      //Customer table
          strVar +=
        ‘<table style=”width: 100%; margin-top: 2px; height: 20%;” border=”0.5px”><tr>’;
      strVar +=
        ‘<td colspan=”20″ style=”font-size: 10pt;border:0.5px;font-family: Arial, Helvetica, sans-serif;”>Customer</td>’;
      strVar +=
        ‘<td colspan=”10″ style=”font-size: 10pt;border:0.5px;font-family: Arial, Helvetica, sans-serif;”>Location</td>’;
      strVar +=
        ‘<td colspan=”15″ style=”font-size: 10pt;border:0.5px;font-family: Arial, Helvetica, sans-serif;”>’ +
        location +
        “</td>”;
      strVar += “</tr>”;
      strVar += “<tr>”;
      strVar +=
        ‘<td colspan=”20″ rowspan=”3″ style=”font-size: 10pt;border:0.5px; padding-top:-25px;font-family: Arial, Helvetica, sans-serif;”><br/><br/><span style=”font-size:10pt;”>’ +
        custName +
        “<br/>” +
        “<br/>” +
               ‘Ship To:’ +
        “<br/>” +
        addressee +
        “<br/>” +
        addr1 +
        “<br/>” +
        city +
        ” ” +
        state +
        ” ” +
        zip +
        ” ” +
        country +
        “</span></td>”;
      strVar +=
        ‘<td colspan=”10″ style=”font-size: 10pt;border:0.5px;font-family: Arial, Helvetica, sans-serif;”>SF SO#</td>’;
      strVar +=
        ‘<td colspan=”15″ style=”font-size: 10pt;border:0.5px;font-family: Arial, Helvetica, sans-serif;”>’ +
        sfSoNumber +
        “</td></tr>”;
      strVar += “<tr>”;
      strVar +=
        ‘<td colspan=”10″ style=”font-size: 10pt;border:0.5px;font-family: Arial, Helvetica, sans-serif;”>Store</td>’;
      strVar +=
        ‘<td colspan=”15″ style=”font-size: 10pt;border:0.5px;font-family: Arial, Helvetica, sans-serif;”>’ +
        department +
        “</td>”;
      //strVar += `<td colspan=”15″ style=”font-size: 10pt;border:0.5px”><barcode codetype=”code128″ showtext=”false” value=”${WOIDNumber}”/></td>`;
      strVar += “</tr>”;
    //   strVar += “<tr>”;
    //   strVar +=
    //     ‘<td colspan=”10″ style=”font-size: 10pt;border:0.5px”>Sales Order</td>’;
    //   strVar +=
    //     ‘<td colspan=”15″ style=”font-size: 10pt;border:0.5px”>’ +
    //     tranidSO +
    //     `</td>`;
    //  // strVar += `<td colspan=”15″ style=”font-size: 10pt;border:0.5px”><barcode codetype=”code128″ showtext=”false” value=”${tranidSO}”/></td>`;
    //   strVar += “</tr>”;
      // strVar += “<tr>”;
      // strVar +=
      //   ‘<td colspan=”20″ style=”font-size: 10pt;border:0.5px”><b>Store:</b>&nbsp;&nbsp;’+ department +'</td>’;
      // strVar += `<td colspan=”25″ style=”font-size: 10pt;”><b>SF SO#:</b>&nbsp;&nbsp;`+ sfSoNumber +`</td>`;
      // strVar += “</tr>”;
      strVar += “</table>”;
      //first table header end
      strVar +=
        ‘<table style=”width: 100%; margin-top: 10px; height: 29%;” border=”0.5px”><tr>’;
      strVar +=
        ‘<td colspan=”20″ style=”font-size: 10pt;border:0.5px;font-family: Arial, Helvetica, sans-serif;”><b>Sales Order</b></td>’;
        strVar +=
        ‘<td colspan=”20″ style=”font-size: 10pt;border:0.5px;font-family: Arial, Helvetica, sans-serif;”><b>Work Order</b></td>’;
        strVar +=
        ‘<td colspan=”20″ style=”font-size: 10pt;border:0.5px;font-family: Arial, Helvetica, sans-serif;”><b>Pick wave</b></td>’;
        strVar +=
        ‘<td colspan=”20″ style=”font-size: 10pt;border:0.5px;font-family: Arial, Helvetica, sans-serif;”><b>Build Sheet</b></td>’;
        strVar += “</tr>”;
        strVar += “<tr>”;
        strVar += `<td colspan=”20″ style=”font-size: 15pt;border:0.5px; height: 30%;font-family: Arial, Helvetica, sans-serif;”><barcode codetype=”code128″ showtext=”true” value=”${tranidSO}”/></td>`;
        strVar += `<td colspan=”20″ style=”font-size: 15pt;border:0.5px;font-family: Arial, Helvetica, sans-serif;”><barcode codetype=”code128″ showtext=”true” value=”${WOIDNumber}”/></td>`;
        strVar += `<td colspan=”20″ style=”font-size: 15pt;border:0.5px;font-family: Arial, Helvetica, sans-serif;”><barcode codetype=”code128″ showtext=”true” value=”${waveNumber}”/></td>`;
        strVar += `<td colspan=”20″ style=”font-size: 15pt;border:0.5px;font-family: Arial, Helvetica, sans-serif;”><barcode codetype=”code128″ showtext=”true” value=”${buildSheet}”/></td>`;
        strVar += “</tr>”;
        strVar += “</table>”;
      //first table header end
      //second table routing started
      //************************************************************************************************************* */
      //resolve domain to get suitelet url
      var output = url.resolveDomain({
        hostType: url.HostType.APPLICATION,
      });
      //increment the count
      count++;
      //main logic to generate the pdf
      var xmlValue =
        ‘<?xml version=”1.0″?>\n<!DOCTYPE pdf PUBLIC “-//big.faceless.org//report” “report-1.1.dtd”>\n’;
      xmlValue += “<pdfset>”;
      xmlValue += “<pdf>\n”;
      xmlValue += “<head>”;
      xmlValue += “<style>”;
      xmlValue += “</style>”;
      xmlValue += “<macrolist>”;
      xmlValue += ‘<macro id=”nlfooter”>’;
      xmlValue += ‘<table width=”100%” height=”20%”>’;
      xmlValue += “<tr>”;
      xmlValue +=
        ‘<td align=”right” style=”font-size: 9pt;”><pagenumber/> of <totalpages/></td>’;
      xmlValue += “</tr>”;
      xmlValue += “</table>”;
      xmlValue += “</macro>”;
      xmlValue += “</macrolist>”;
      xmlValue += “</head>”;
      xmlValue +=
        ‘<body size=”A4-Landscape” font-size=”7″ footer=”nlfooter” footer-height=”2pt”>’ +
        strVar +
        “</body>\n</pdf>”;
      xmlValue += “</pdfset>”;
      try {
        //render module convert xml to pdf format
        var pdfFileObj = render.xmlToPdf({
          xmlString: xmlValue,
        });
        log.debug(“PDF PRINTED SUCESSFULLY!!”, “COOL”);
        //saved created pdf into the folder with name.
        pdfFileObj.folder = 1358;
        pdfFileObj.name = “samplepdf” + count;
        pdfFileObj.isOnline = true;
        // log.debug(“bol”, bol);
        let fileid = pdfFileObj.save();
        log.debug(“fileid”,fileid);
        //loaded the pdf files
        let pdfFinal1 = file.load(fileid);
        log.debug(“pdfFinal1”, pdfFinal1);
        //pushed pdf file ids into the array
        fileArray.push(fileid);
        // context.response.writeFile(pdfFileObj, true);
        //created url for pdf file output
        output = “https://” + output + pdfFinal1.url;
        //log.debug({title: “output”,details: output });
        //return output;
        //open the generated pdfs into the seperate tab as per the result length
        context.response.write(
          `<html><head><script>window.open(“${output}”)</script></head></html>`
        );
      } catch (error) {
        log.error(“Error : In Create Pdf”, error);
      }
    }  //Main Loop end
    //window.close to avoid extra suitelet form on the screen.
    context.response.write(
      `<html><head><script>window.close()</script></head></html>`
    );
     }
  return {
    onRequest: renderPDF,
  };
  function _logValidation(value) {
    if (
      value != null &&
      value != “” &&
      value != “null” &&
      value != undefined &&
      value != “undefined” &&
      value != “@NONE@” &&
      value != “NaN”
    ) {
      return true;
    } else {
      return false;
    }
  } //Log Validation
});

 

Beginner Asked on August 25, 2023 in SuiteScript.
Add Comment
1 Answer(s)

Either write your code to iterating your data and generate the detail on each page using <PBR> to throw a page break between each ,  or create multiple pdfs and use the <PDFSET> tag to encapsulate them in to one.

Essentially with a set you will want each pdf data to be between <PDF>tags and the complete set of <PDF>’s to be inside the <PDFSET>

Probably best creating the outer PDFSET string, appending each PDF and then closing out the PDFSET.

This may help:
https://bfo.com/products/report/docs/tags/tags/pdfset.html

 

Beginner Answered on August 28, 2023.
Add Comment

Your Answer

By posting your answer, you agree to the privacy policy and terms of service.
  • This site made possible by our sponsors:   Tipalti   Celigo   Become a Sponsor   Become a Sponsor