如何在套件中使用nlapiXMLToPDF

问题描述 投票:1回答:1

当前使用Suitescript 1.0创建邮件合并pdf生成器。这就是我的结构方式-有4个脚本(1个用户事件,1个客户端脚本和2个suitelets)。用户事件脚本会生成一个下拉菜单,其中显示了部署到任何记录上的所有可用模板。

function beforeLoad(type, form){

  var folderId = "folderId";
  var filters = new Array();
  filters[0] = new nlobjSearchFilter('internalid', null, 'is', folderId);

  var columns = new Array();
  var filename = new nlobjSearchColumn('name', 'file');
  var file_id = new nlobjSearchColumn('internalid', 'file');


  var fieldId = "custpage_mail_merge_dropdown";
  var fieldLabel = "Mail Merge Dropdown";


  var select = form.addField(fieldId, 'select', fieldLabel);

  columns[0] = filename;
  columns[1] = file_id;

  var searchResults = nlapiSearchRecord('folder', null, filters, columns);
  if(searchResults){
    for(var i = 0; i < searchResults.length; i++){
      var f = searchResults[i];
      //add values to the dropdown field created earlier in the UI

      select.addSelectOption(f.getValue(file_id), f.getValue(filename))
    }
  }

}

Dropdown generated by code

客户端脚本的目的是充当两个套件和已部署该套件的记录之间的中介。


function verifyList(types, name, linenum){  


    if(name == 'custpage_mail_merge_dropdown'){

      var field = nlapiGetField(name);

      var fileName = nlapiGetFieldText(name);
      var suiteletUrl = nlapiResolveURL("SUITELET", script_id_1, 1);
      var response = nlapiRequestURL(suiteletUrl+"&fileName="+fileName);
      var fileContent = "";
      if(response.getBody()){
        fileContent = response.getBody();      
        nlapiLogExecution('DEBUG', 'STATUS', 'Client script activated '+ JSON.stringify(fileContent));
        var renderedFile = ejs.render(fileContent, {});
        var suiteletPdfUrl = nlapiResolveURL("SUITELET", script_id_2, 1);
        var response2 = nlapiRequestURL(suiteletPdfUrl+"&ejsCompiled="+renderedFile);

        nlapiLogExecution('DEBUG', 'STATUS', 'Client script activated '+ JSON.stringify(renderedFile));

      }

    }  

}

第一个套件的目的是加载从下拉列表中选择的模板并将其返回给客户端,然后使用ejs.render()对其进行转换

SUITELET 1

function mail_merge(req, res){

  var fileName = req.getParameter('fileName');

  if(fileName){
    var fileId = "Templates__/"+fileName;
    var load_file = nlapiLoadFile(fileId);
    var fileContent = load_file.getValue();
    res.write(fileContent);
    nlapiLogExecution("DEBUG", "STATUS", "Suitelet script activated : "+fileName);
  }  


}

(据认为)第二套件基于传递给客户端脚本的第一套件的转换内容来简化PDF文档的创建。SUITELET 2

function pdf_mail_merge(req, res){


    var ejsCompiled = req.getParameter('ejsCompiled');
    //Split by </pdf> due to unexpected string tagging along with file content
    ejsCompiled = ejsCompiled.split("</pdf>")[0];
    ejsCompiled +="</pdf>";
    if(ejsCompiled){
      nlapiLogExecution('DEBUG', 'STATUS', "EJS Compiled "+ejsCompiled);
      try{
      var pdf_file = nlapiXMLToPDF(ejsCompiled);
      }catch(err){
        nlapiLogExecution('DEBUG', 'STATUS', err);
      }
      res.setContentType("PDF", "somename.pdf");
      res.write(pdf_file.getValue());
      nlapiLogExecution('DEBUG', 'STATUS', "Second script activated "+JSON.stringify(pdf_file))
    }  


  }

从下拉菜单中选择一个选项时,我收到以下消息:“此页面上运行的脚本中发生意外错误... UNEXPECTED_ERROR”

这是用于测试的模板。这正是nlapiXMLToPDF将作为参数的字符串。

<pdf>
    <head>

    </head>
    <body>
        <h1>Template One</h1>
    </body>
</pdf>

这就是让我感到困惑的地方,该字符串对我来说似乎非常合适,但我一直遇到这个奇怪的错误。如果你们中的任何人可以提供对问题可能是什么的任何见解,将不胜感激。请原谅我冗长的帖子,我认为发布大多数用于解决问题的代码会很有用。

javascript netsuite suitescript
1个回答
0
投票

似乎您的模板缺少BFO模板引擎所需的XML和DOCTYPE声明(请参见BFO User Guide的第8页。

尝试在模板字符串的开头添加以下内容:

<?xml version="1.0"?>
<!DOCTYPE pdf PUBLIC "-//big.faceless.org//report" "report-1.1.dtd">
© www.soinside.com 2019 - 2024. All rights reserved.