如何在Suitlet中使用nlip iXMLToPDF

How to use nlapiXMLToPDF within a suitelet(如何在Suitlet中使用nlip iXMLToPDF)
本文介绍了如何在Suitlet中使用nlip iXMLToPDF的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当前使用Suitescript 1.0创建邮件合并pdf生成器。这就是我构建它的方式--有4个脚本(1个用户事件、1个客户端脚本和2个Suitlet)。 用户事件脚本生成一个下拉菜单,显示它部署到的任何记录上的所有可用模板。
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))
    }
  }

}

客户端脚本的用途是充当两个Suitlet和部署它的记录之间的调解器。


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));
        
      }

    }  

}

第一个Suitlet的目的是加载从下拉列表中选择的模板并将其返回到客户端,在客户端使用ejs.render()

进行转换

套件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);
  }  

  
}

第二个Suitlet(应该)有助于基于传递给客户端脚本的第一个Suitlet的转换内容创建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))
    }  
  
    
  }
  
从下拉列表中选择一个选项时,系统会显示以下消息: 在此页面上运行的脚本中出现意外错误(&Q)...意外错误&

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

<pdf>
    <head>

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

这就是让我困惑的地方,字符串对我来说似乎完全没有问题,但我总是收到这个奇怪的错误。如果你们中的任何人能提供任何关于问题可能是什么的见解,将不胜感激。请原谅我冗长的帖子,我认为张贴用于解决问题的大部分代码会很有用。

推荐答案

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

尝试在模板字符串的乞求处添加以下内容:

<?xml version="1.0"?>
<!DOCTYPE pdf PUBLIC "-//big.faceless.org//report" "report-1.1.dtd">

这篇关于如何在Suitlet中使用nlip iXMLToPDF的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Update another component when Formik form changes(当Formik表单更改时更新另一个组件)
Formik validation isSubmitting / isValidating not getting set to true(Formik验证正在提交/isValiating未设置为True)
React Validation Max Range Using Formik(使用Formik的Reaction验证最大范围)
Validation using Yup to check string or number length(使用YUP检查字符串或数字长度的验证)
Updating initialValues prop on Formik Form does not update input value(更新Formik表单上的初始值属性不会更新输入值)
password validation with yup and formik(使用YUP和Formick进行密码验证)