1.サーバー側の処理
byte[]に変換したPDFデータをFileContentResultにして返却している。
[HttpPost]
public IActionResult GetPdf(SomeType parameter)
{
using MemoryStream memotyStream = new();
// ここの間でPDFライブラリを使ってPDFデータを「memotyStream」に乗せる。
byte[] bytes = new byte[memotyStream.Length];
memotyStream.Read(bytes, 0, bytes.Length);
return this.File(bytes, MediaTypeNames.Application.Pdf)
}
#2.クライアント側の処理(C#)
1.のサーバ側APIを呼び出して、そのレスポンスデータを「ReadAsByteArrayAsync」で取得する。
そして、取得したレスポンスデータをJavaScriptのメソッド(この例では"OpenPdf"という名前)に渡して実行する。
protected override async Task OnClick()
{
SomeType parameter = new(); // API側に渡すパラメータ(主旨とは無関係)
HttpResponseMessage responseMessage = await Http.PostAsJsonAsync<SomeType>("https://localhost:12345/api/GetPdf", parameter);
await JsRuntime.InvokeVoidAsync("OpenPdf", await responseMessage.Content.ReadAsByteArrayAsync());
}
#3.クライアント側の処理(JavaScript)
2.クライアント側の処理(C#)でAPIから返却されたレスポンスデータだが、
Base64エンコードされている状態なのでデコードしてやる必要がある。
C#側でデコードできるはずなのだが何故かJavaScriptでやらないと上手くいかない。
C#でデコードするとエラーになるかPDFが白紙になってしまう。
折角のWebAssemblyなのにわざわざJavaScriptで処理するのが勿体ないが
まぁ、そのうち誰かが解決してくれるだろう…
.NET Core 5.0→6.0にバージョンアップしたら
Base64エンコードされてない状態になっていたので、
.Net Core 6.0の場合、デコード処理は不要です。
function OpenPdf(base64) {
const byteCharacters = atob(base64);
const byteNumbers = new Array(byteCharacters.length);
for (let i = 0; i < byteCharacters.length; i++) {
byteNumbers[i] = byteCharacters.charCodeAt(i);
}
const byteArray = Uint8Array(byteNumbers);
const url = window.URL.createObjectURL(new Blob([byteArray], { type: 'application/pdf' }));
window.open(url);
}