【问题标题】:Unable to view PDF attached with ServiceNow table records无法查看附带 ServiceNow 表记录的 PDF
【发布时间】:2020-12-11 03:12:14
【问题描述】:

我能够使用 GlideSysAttachment API 和脚本中的 attachment.write() 函数成功地附加带有 ServiceNow 表记录的 PDF 文件,但是每当我下载并尝试打开它时,我都会收到下面屏幕截图中显示的错误。

代码sn-p

(function execute() {
    try{
          var rec = new GlideRecord('incident');
          var attachment = new GlideSysAttachment();
          var incidentSysID = incident.number;
          rec.get(incidentSysID);
          var fileName = 'Test_Incident.pdf';
          var contentType = 'application/pdf'; // Also tried with contentType as 'text/pdf'
          var content = pdf_content;
          var agr = attachment.write(rec, fileName, contentType, content);<br>
          gs.info('The PDF attachment sys_id is: ' + agr);
    }catch(err){
         gs.log('Got Error: ' + err);
         gs.info(err);
    }
})()

我还在脚本中尝试了带有 ecc_queue 的“AttachmentCreator”,但出现了同样的错误。下面是它的代码。

(function execute()
    {var attCreator = new GlideRecord('ecc_queue');
    attCreator.agent = "AttachmentCreator";
    attCreator.topic = "AttachmentCreator";
    attCreator.name = "Test.pdf" + ":" + "text/pdf"; 
    //Also tried, "Test.pdf:application/pdf"
    attCreator.source = "incident"+":"+ incident.number; 
    // Record Table name and sys_id of the particular record
    var content = pdf_content; // pdf_content is any string variable
    var stringUtil = new GlideStringUtil();
    var base64String = stringUtil.base64Encode(content);
    var isValid=GlideStringUtil.isBase64(base64String);  
    var base64String= gs.base64Encode(content);
    gs.info("Is valid base64 format in ecc_queue ? "+ isValid);
    attCreator.payload = base64String; //base64 content of the file
    attCreator.insert();
})()

我能够附加和查看具有类似脚本的 excel 和 word 文件,没有任何问题。我已经检查了附件的系统属性,但一切看起来都很好。我可以查看从 UI 上传到特定表记录的 PDF 文件,但不能查看我通过 REST API 或脚本附加的文件。

我也尝试过以字节、base64 或简单字符串的形式发送编码数据,但似乎没有任何效果。我没有收到任何错误,并且每次创建附件时都会返回附件 ID。

在针对上述函数(w.r.t 范围应用程序而不是全局函数)稍微修改了我的代码之后;我在调试时从日志中得到了一些信息:

  • 05:38:38.411 安全受限:文件类型不允许或与文件 Test.pdf 的内容不匹配
  • 05:38:38.410 安全受限:文件的 MIME 类型不匹配:Test.pdf。预期类型:application/pdf,实际类型:text/plain
  • 05:38:38.394 App:XYZ App x_272539_xyz_ap: ecc_queue 中的 base64 格式是否有效?是的

【问题讨论】:

    标签: servicenow servicenow-rest-api


    【解决方案1】:

    首先注释:您的代码中的这一行意外地起作用了——请确保您了解任务 number 不是对象 sys_id

    var incidentSysID = incident.number; // should be incident.sys_id
    

    接下来,不清楚 PDF 内容的来源。如果列出了您的完整代码,我预计会出现错误,因为您已经注意到 pdf_content 是“任何字符串变量”。

    ServiceNow 确实具有从 HTML 参数创建 PDF 的能力。 Generating a PDF from HTML

    这是获取现有记录的 PDF(平台生成)的有用博客文章: Love PDF? PDF loves you too

    【讨论】:

    • 您好 Valor,感谢您的回复,但是我不是在寻找将 HTML 或表格形式转换为 PDF,而是尝试使用 PDF 格式的 Service Now Attachment API 创建附件。此外,incident.number 实际上只存储 sys_id。我在 developer.servicenow.com/dev.do#!/reference/api/newyork/server/… 提到了用于服务器范围应用程序的 GlideSysAttachment API。此外,pdf_content 是包含一些纯文本数据作为字符串的变量。
    • 回复晚了,我知道。您不能传递纯文本并让它神奇地转换为 PDF 文件。此外,incident.number 不存储 sys_id。 sys_id 是一个 32 个字符的十六进制 guid,通常不会显示,但开发人员需要意识到这一点
    • 如果从文本字符串生成 PDF 是您的目标,则必须将其转换为 HTML 并按照我上面的建议进行
    • 正如我在第一条评论中已经向您阐明“incident.number”存储 sys_id,请不要将其与事件编号的 SNOW 术语混淆。我知道事件编号和事件记录 sys_id 之间的差异。就我而言, Incident.number 是我创建的自定义脚本变量。此外,我只想了解 PDF 文件的附件 API。对于 word、excel 或文本等其他格式,相同的脚本就像魅力一样。感谢您分享 PDF 文件的其他替代方案。
    猜你喜欢
    • 2020-12-22
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多