如何在 C# 中显示来自 SAP RFC 的 pdf

How to display a pdf from an SAP RFC in C#

在我的 C# 应用程序中,我正在调用 SAP RFC,它 returns pdf 的二进制格式(SAP 中的关联类型是 HRB2A_TAB_RAW255)。

但是,当我在C#中读取返回数据时,它是一个字符串数据类型——“255044462D312E330D0A25E2E3CF...等”。

Response.Binarywrite 需要字节数组,而不是二进制数据的字符串表示。

当二进制数据块以字符串数据类型出现时,我如何使用它?

======================================

更新 2:终于,我让它工作了。

由于每一行都是一个 255 字节的数组,我使用 Array.Copy 创建一行,其中元素数 = 255 * 从 SAP 返回的行数

IRfcFunction uploadFile = rfcrep.CreateFunction("ZTEST_BOL");
IRfcTable fileBin = uploadFile.GetTable("BIN");
uploadFile.SetValue("SHIPMENT_NO", "701324577");
uploadFile.Invoke(dest);

int len;
byte binary = new byte[255 * fileBin.RowCount + 1];

for (int i = 0; i <= fileBin.RowCount - 1; i++)
{
    fileBin.CurrentIndex = i;

    if(i==0)
    {
      Array.Copy(fileBin.CurrentRow.GetByteArray("CONTENT"), 0, binary, 0, 
        fileBin.CurrentRow.GetByteArray("CONTENT").Length);
      len = fileBin.CurrentRow.GetByteArray("CONTENT").Length;
    }
    else
    {
    Array.Copy(fileBin.CurrentRow.GetByteArray("CONTENT"), 0, binary, len, 
          fileBin.CurrentRow.GetByteArray("CONTENT").Length);
    len += fileBin.CurrentRow.GetByteArray("CONTENT").Length;
    }
}

System.IO.File.WriteAllBytes(@"C:\Projects\hello.pdf", 二进制);

我想,如果我理解正确的话,你需要的是:

System.Text.ASCIIEncoding.Default.GetBytes("255044462D312E330D0A25E2E3CF...etc")

它可能不是你那里的 Ascii,但 System.Text 有一些字符串编码器。您可以使用它们将字符串转换为字节,然后再转换回来。

因为 HRB2A_TAB_RAW255 是一个原始的 table,其中每一行都是一个 HRB2A_RAW255 类型的字段,它是原始数据,所以 table 的每一行可能是一个字节数组。

考虑来自 SAP 的映射 table:RFC To .NET Data Type Mapping

您可以尝试这样的操作:

foreach (IRfcStructure row in sapTable)
        {
            DataTable loTable = new DataTable();
            for (int liElement = 0; liElement < sapTable.ElementCount; liElement++)
            {
                RfcElementMetadata metadata = sapTable.GetElementMetadata(liElement);

                byte[] binary = new byte[255];
                binary  = row.GetByte(metadata.Name);
                ldr[metadata.Name] = binary;
            }
            loTable.Rows.Add(ldr);
        }
        return adoTable;
    }

别按字面意思说,就是速拍而已,不知道有没有用。您也可以 check this.