MVC中生成PDF並在web中顯示


最近接到一個新需求,需要將原先下載到用戶電腦的PDF報表文件顯示在新開的網頁頁面中,用戶自己選擇在頁面內嵌的PDF上進行另存和打印。

代碼如下:

FastReport.Report rpt = MakeProposalReport(xxx,xxx,xxx,xxx,xxx);
byte[] buffer = ExportPDFToByteArray(rpt);
//刪除舊的PDF文件
DeleteTempPdfFile();
//取檔名
string fName = MakeReportFileName();
string newFile = Path.Combine(Server.MapPath("~"), "Newfile", fName);
//創建PDF文件在服務器中,下次產報表前會刪除之前的
CreatePDFFile(newFile, buffer);
FileStream fs = new FileStream(newFile, FileMode.Open, FileAccess.Read);
return File(fs, "application/pdf");
/// <summary> 將報表轉換成PDF格式後序列化到Buffer </summary>
/// <param name="rpt"></param>
/// <returns></returns>
internal static byte[] ExportPDFToByteArray(FastReport.Report rpt, CompressPDFInfo inCompressInfo = null, string Password = null)
{
   MemoryStream memStream = ExportPDFToStream(rpt, inCompressInfo, Password);
   if (!string.IsNullOrEmpty(Password))
   {
      //encrypt pdf with aes-128
      PdfReader reader = new PdfReader(memStream, Encoding.Default.GetBytes(Password));
      using (MemoryStream encryptStream = new MemoryStream())
      {
         PdfStamper stamper = new PdfStamper(reader, encryptStream);
         stamper.SetEncryption(PdfWriter.ENCRYPTION_AES_128, Password, Password, PdfWriter.ALLOW_ASSEMBLY | PdfWriter.ALLOW_COPY | PdfWriter.ALLOW_DEGRADED_PRINTING | PdfWriter.ALLOW_FILL_IN | PdfWriter.ALLOW_MODIFY_ANNOTATIONS | PdfWriter.ALLOW_MODIFY_CONTENTS | PdfWriter.ALLOW_PRINTING | PdfWriter.ALLOW_SCREENREADERS);
         stamper.Close();
         return encryptStream.ToArray();
      }
  }
  else
  {
      long size = memStream.Length;
      byte[] buffer = new byte[size];
      memStream.Read(buffer, 0, (int)size);
      memStream.Dispose();
      return buffer;
  }
}
public void CreatePDFFile(string newFile, byte[] buffer)
{
    FileStream writeStream = new FileStream(newFile, FileMode.Create, FileAccess.Write);
    MemoryStream readStream = new MemoryStream(buffer);
    int Length = buffer.Length;
    int bytesRead = readStream.Read(buffer, 0, Length);
    while (bytesRead > 0)
    {
        writeStream.Write(buffer, 0, bytesRead);
        bytesRead = readStream.Read(buffer, 0, Length);
    }
    readStream.Close();
    writeStream.Close();
}
/// <summary> 刪除臨時PDF文件 </summary>
/// <returns></returns>
public void DeleteTempPdfFile()
{
   var fileTempPath = Server.MapPath("~/") + "//Newfile//";
   string[] files = Directory.GetFiles(fileTempPath, "*.pdf");
   FileInfo fi;
   foreach (var file in files)
   {
      fi = new FileInfo(file);
      fi.Delete();
    }
}

重點在於

FileStream fs = new FileStream(newFile, FileMode.Open, FileAccess.Read);

沒有這行代碼,瀏覽器上無法顯示PDF內容。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM