我想在网上显示我的pdf文件。通常它小于5mb。
<div>
<iframe src="data:application/pdf;base64, @base64String" style="width:100%; height:500px" />
</div>
你可以看到这对于小的pdf文件非常有效,通常小于2mb。
// this is what I did on my c# mvc controller.
var fData = Convert.ToBase64String(System.IO.File.ReadAllBytes(fname));
ViewData["base64String"] = fData ;
我的方法是创建一个blob类型的数据并将其发送到视图。然后我可以使用URL创建url。createObjectURL(blob)并尝试通过iFrame显示它。下面的代码是我的方法,但它不起作用。
一个二个一个一个
我尝试了几种方法来编码来自控制器的数据
var temp = Convert.ToBase64String(fileByte);
var res = Convert.ToBase64String(Encoding.UTF8.GetBytes(temp));
var pdf = string.Format("data:application/pdf;base64,{0}", fileContents[0]);
ViewData["File"] = File(fileByte, "application/pdf");
ViewData["Byte"] = fileByte;
ViewData["Encoded"] = res;
ViewData["Content"] = fileContents;
ViewData["pdf"] = pdf;
我不能让它显示小于2MB的PDF文件,我不知道我哪里做错了。
我也在javascript中尝试过这个,它会在html上返回一个错误,说“encStr”没有正确编码。
const byteCharacters = atob('@encStr');
const byteNumbers = new Array(byteCharacters.length);
for (let i = 0; i < byteCharacters.length; i++) {
byteNumbers[i] = byteCharacters.charCodeAt(i);
}
const byteArray = new Uint8Array(byteNumbers);
我想解决它,使它工作。我不想使用外部包。如果这是唯一的方法,那么我会使用它。
1条答案
按热度按时间vq8itlhq1#
我建议您稍微简化一下代码,并遵循以下步骤:
1.修改C#控制器以将字节数组直接传递给视图。
1.在.cshtml文件中,将字节数组转换为base64字符串。
1.创建一个blob对象,并将iframe源设置为从blob创建的对象URL
修改C#控制器:
在.cshtml文件中:
创建blob并设置iframe源代码:
这应该适用于在iframe中显示大于2MB的PDF文件。请确保从控制器和.cshtml文件中删除任何不必要的代码。这种方法避免了双重编码,这可能会在原始实现中导致问题。