【问题标题】:Business Central Codeunit "Base64 Convert" is returning different base64 code than an online converterBusiness Central Codeunit \"Base64 Convert\" 返回的 base64 代码与在线转换器不同
【发布时间】:2022-10-07 20:06:30
【问题描述】:

我正在尝试将报告转换为 base64 代码,以便可以通过 API 调用将其发送到不同的应用程序。

为了测试,我使用了一个在线 pdf 到 base64 转换器,我复制了生成的代码,应用程序成功接收了我发送的文档。现在,我希望能够将 Business Central 中的报告转换为 base64 并发送,而不是硬编码 base64 代码。但是,我的 API 调用失败并显示错误消息“PDF 验证失败”。当我比较在线转换器和 AL 程序的输出时,我发现它们是不同的。下面是我用来将报告转换为 base 64 的代码。

local procedure BssiReport()
var
    ReportOutstream: OutStream;
    ReportInstream: InStream;
    TempBlob: Codeunit "Temp Blob";
    res: Text;
    Txt: Text;
    Base64Convert: Codeunit "Base64 Convert";
begin
    TempBlob.CreateOutStream(ReportOutstream);
    Report.SaveAs(Report::BssiPLMLeaseSummary, '<?xml version="1.0" standalone="yes"?><ReportParameters name="test" id="50505555"><Options><Field name="test" /><Field name="testdate">2022-07-20</Field></Options><DataItems><DataItem name="test2">VERSION(1) SORTING(Field1) WHERE(Field1=1(A100))</DataItem><DataItem name="test3">VERSION(1) SORTING(Field1,Field2)</DataItem><DataItem name="test4">VERSION(1) SORTING(Field1,Field5,Field2)</DataItem><DataItem name="test5">VERSION(1) SORTING(Field1,Field3,Field4,Field5,Field6)</DataItem><DataItem name="test6">VERSION(1) SORTING(Field2,Field48,Field3,Field4,Field5,Field1)</DataItem><DataItem name="test7">VERSION(1) SORTING(Field2,Field48,Field3,Field4,Field5,Field1)</DataItem><DataItem name="test8">VERSION(1) SORTING(Field2)</DataItem></DataItems></ReportParameters>', ReportFormat::Pdf, ReportOutstream);
    TempBlob.CreateInStream(ReportInstream);
    WHILE NOT (ReportInstream.EOS) DO BEGIN
        ReportInstream.READTEXT(Txt);
        res += Txt;
    END;
    jsonObj.Add('documentBase64', Base64Convert.ToBase64(res));
    //...
end;

我不会在这里复制整个代码,但这是我使用在线转换器得到的输出的第一部分:

"JVBERi0xLjcNCiWhs8XXDQoxIDAgb2JqDQo8PC9QYWdlcyAyIDAgUiAvVHlwZS9DYXRhbG9nPj4NCmVuZG9iag0KMiAwIG9iag0KPDwvQ291bnQgMS9LaWRzWyA0IDAgUiBdL1R5cGUvUGFnZXM+Pg0KZW5kb2JqDQozIDAgb2JqDQo8PC9DcmVhdGlvbkRhdGUoRDoyMDIyMDcwNDExMTYxOCkvQ3JlYXRvcihQREZpdW0pL1Byb2R1Y2VyKFBERml1bSk+Pg0KZW5kb2JqDQo0IDAgb2JqDQo8PC9Db250ZW50cyA1IDAgUiAvTWVkaWFCb3..."

这是我使用 CodeUnit "Base64 Convert" 从 Business Central 得到的:

"JVBERi0xLjcl77+977+977+977+977+977+977+9MSAwIG9ialsvUERGL1RleHQvSW1hZ2VCL0ltYWdlQy9JbWFnZUldZW5kb2JqMiAwIG9iajw8L1R5cGUvUGFnZS9QYXJlbnQgNiAwIFIvTWVkaWFCb3hbMCAwIDc5MiA2MTJdL0NvbnRlbnRzIDUgMCBSL1Jlc291cmNlczw8L1Byb2NTZXQgMSAwIFIvWE9iamVjdDw8Pj4vRm9udDw8L0YzIDMgMCBSL0Y0IDQgMCBSPj4+Pj4+ZW5kb2JqMyAwIG9iajw8L1R5cGUvRm9udC9TdWJ0eXBlL1R..."

有人知道为什么 Business Central 没有产生相同的输出吗?

【问题讨论】:

    标签: dynamics-business-central dynamics-al


    【解决方案1】:

    你检查过你的文本编码吗? base64 代码单元有一个重载,您可以在其中指定文本编码。

    此外,您可以直接使用带有 base64 编码的流。为您省去一些麻烦。

    jObject.Add('base64', Base64Convert.ToBase64(InStr), TextEncoding::UTF8);
    

    【讨论】:

      猜你喜欢
      • 2022-11-04
      • 1970-01-01
      • 2012-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-16
      • 1970-01-01
      相关资源
      最近更新 更多