如何在 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.
在我的 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.