业务中心代码单元"Base64 Convert"返回与在线转换器不同的 base64 代码



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

为了测试,我使用了一个在线的pdf到base64转换器,我复制了生成的代码,应用程序成功地收到了我发送的文档。现在,我不想硬编码base64代码,而是希望能够将Business Central中的报表转换为base64并发送它。然而,我的API调用失败,返回错误消息";PDF验证失败";。当我比较在线转换器和AL程序的输出时,我发现它们是不同的。下面是我用来将报告转换为基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+Pg0KZW5kb2JqDQozIDAgb2jqDQo8 PC9DcmVhdGlvbkRhdGUoRDoyMDIyMDcwNDexMTYxOCkvQ3JlYXRvchQREZpdW0pL1Byb2R1Y2VyKF BERml1bSk+Pg0KZW5kb2JqDQo0IDAgb2JqDQo 8PC9Db250ZW50cyA1IDAgUiAvTWVkaWFCb3…";

这是我从Business Central使用CodeUnit";Base64转换":

"JVBERi0xLjcl77+977+977/977+977+777+99MSAWIG9ialsvUERGL1RleHQvSW1hZ2VCL0ltYWdlQy9JbWFnZULdZW5kb2JqMiAwIG9iajw8L1R5cGUvUGFnZS9QYXJlbnQgNiAwIFIvTWVkaWFCb3hbMCAwIDc5MiA2MTJdLnRlbnRzIDUgMCBSL1Jlc291cmNlczw8L1Byb2NTZXQgMSAWIFIvWE9iamVjdDw8pj4v房间9udDw8L0YzIDMgMCBSL0Y0IDQgMCBSPj4+Pj4+ZW5kb2JqMyAwIG9iajw8L1R5cGUv房间9udC9TdWJ0eXBlL1R">

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

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

此外,您可以直接将流与base64编码一起使用。为您省去一些麻烦。

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

最新更新