NetSuite渲染交易表单PDF布局:缺失Logo及另外两个字段
Suitelet生成PDF缺Logo和字段?看这
场景
开发了用户事件脚本,在发票页面加载自定义按钮,点击按钮通过客户端脚本跳转至Suitelet,使用指定高级PDF模板生成发票PDF。但目前生成的PDF缺失Logo和另外两个字段,和NetSuite原生打印按钮生成的PDF存在明显差异。
我的Suitelet代码
define(['N/render', 'N/record', 'N/xml'], function(render, record, xml) { function onRequest(context) { var response = context.response; if (context.request.method == 'GET'){ var ifid = context.request.parameters.custparam_ifid; var pdfFileName = "Invoice"; var renderer = render.create(ifid); renderer.setTemplateByScriptId("CUSTTMPL_129_423403_SB5_175"); renderer.addRecord( 'record' , record.load({ type: record.Type.INVOICE, id: ifid }) ); //context.response.setHeader({ // name: 'content-disposition', // value: 'inline; filename="' + pdfFileName + '_' + ifid + '.pdf"' //}); //context.response.writeFile(renderer.renderAsPdf()); } //Obj.save() // renderer.renderPdfToResponse(); var newfile=renderer.renderAsPdf(); context.response.writeFile(newfile, true); } return { onRequest: onRequest }; });
PDF对比
- Suitelet生成的PDF:缺失Logo及目标字段,页面顶部无品牌标识,部分信息不完整

- NetSuite原生打印生成的PDF:包含Logo及完整字段,页面顶部显示品牌Logo,信息完整

模板中Logo对应的Freemarker代码
<?xml version="1.0"?><!DOCTYPE pdf PUBLIC "-//big.faceless.org//report" "report-1.1.dtd"> <pdf> <head> <#if .locale == "ru_RU"> <link name="verdana" type="font" subtype="opentype" src="${nsfont.verdana}" src-bold="${nsfont.verdana_bold}" bytes="2" /> </#if> <macrolist> <macro id="nlheader"> <table class="header" style="width: 100%;"> <tr> <td colspan="3"> <#if subsidiary.logo?length != 0> <img src="${subsidiary.logo@url}" style="float: left; margin: 7px" /> <#else> <#if companyInformation.logoUrl?length != 0> <img src="${companyInformation.logoUrl}"style="float: left; margin: 7px"/> </#if> </#if> <br/> <br/> <br/> <br/> <br/> <span class="nameandaddress" colspan="9"><b>${record.shipaddress@label}</b></span> <br/> <br/> <span class="nameandaddress" colspan="9">${record.shipaddress?replace("United States","")}</span> </td>
解决办法
问题根源
模板里通过subsidiary和companyInformation获取Logo,但当前Suitelet只向渲染器传入了发票的record对象,这两个关键数据未进入渲染上下文,导致Logo无法加载;另外两个缺失字段同理,都是模板依赖的关联数据未传入。
具体修复步骤
添加依赖模块
在define开头补充N/config(用于读取公司信息):define(['N/render', 'N/record', 'N/xml', 'N/config'], function(render, record, xml, config) {补全渲染器所需的关联记录
在renderer.addRecord('record', ...)之后添加以下代码:// 缓存发票记录,方便读取关联字段 var invoiceRec = record.load({type: record.Type.INVOICE, id: ifid}); // 加载并传入子公司记录 var subsidiaryId = invoiceRec.getValue({fieldId: 'subsidiary'}); var subsidiaryRec = record.load({type: record.Type.SUBSIDIARY, id: subsidiaryId}); renderer.addRecord('subsidiary', subsidiaryRec); // 加载并传入公司信息 var companyInfo = config.load({type: config.Type.COMPANY_INFORMATION}); renderer.addRecord('companyInformation', companyInfo);修正渲染器初始化方式
原代码中render.create(ifid)用法错误,改为标准初始化:var renderer = render.create();处理另外两个缺失字段
找到模板中这两个字段使用的变量名,比如如果是客户相关字段,就传入客户记录:var customerId = invoiceRec.getValue({fieldId: 'entity'}); var customerRec = record.load({type: record.Type.CUSTOMER, id: customerId}); renderer.addRecord('customer', customerRec);校验脚本权限
确保Suitelet脚本具备读取子公司、公司信息、客户等关联记录的权限,避免因权限不足导致数据读取失败。
内容的提问来源于stack exchange,提问作者Krunal Patel
相关产品推荐
相关产品推荐

