最近接到一個新需求,需要將原先下載到用戶電腦的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內容。