C# 導出pdf(瀏覽器不預覽直接下載)

来源:https://www.cnblogs.com/hahahayang/archive/2019/12/17/12053913.html
-Advertisement-
Play Games

一.介面部分的代碼 [HttpGet] public HttpResponseMessage ExportPdf(string id) { string pdfName = ""; //id 查詢條件,根據實際情況修改即可 //pdfName 例如download.pdf byte[] pdfDat ...


一.介面部分的代碼

        [HttpGet]
        public HttpResponseMessage ExportPdf(string id)
        {
            string pdfName = "";
       //id 查詢條件,根據實際情況修改即可
       //pdfName 例如download.pdf
byte[] pdfData= _policyGapManagerService.ExportPdf(id, out pdfName);//獲得pdf位元組 var result = new HttpResponseMessage(HttpStatusCode.OK) { Content = new ByteArrayContent(pdfData) }; result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = pdfName }; result.Content.Headers.ContentType =new MediaTypeHeaderValue("application/pdf"); return result; }

二.返回pdfbyte數組

1.下載http模式的pdf文件(以ASP.NET為例,將PDF存在項目的目錄下,可以通過http直接打開項目下的pdf文件)

#region 調用本地文件使用返回pdfbyte數組

        /// <summary>
        /// 調用本地文件使用返回pdfbyte數組
        /// </summary>
        /// <param name="srcPdfFile">‘D:\in2434341555551.pdf’</param>
        /// <returns></returns>

        public static byte[] GetSignaturePDFByte(string srcPdfFile)
        {
            using (FileStream fsRead = new FileStream(srcPdfFile, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                int fsLen = (int)fsRead.Length;
                byte[] hebyte = new byte[fsLen];
                fsRead.Read(hebyte, 0, hebyte.Length);
                return hebyte;
            }
        }

        #endregion 調用本地文件使用返回pdfbyte數組

        #region 從網站上下載pdf,轉化為位元組流


        /// <summary>
        /// 從網站上下載pdf,轉化為位元組流
        /// </summary>
        /// <param name="srcPdfFile">文件地址:'https://******/group2/M00/00/04/wKj-mlpcoZ2IUbK5AACrpaV6k98AAAB6gAAAAAAAKu9562.pdf'</param>

        /// <returns></returns>
        public static Byte[] GetByteByRemoteURL(string srcPdfFile)
        {
            byte[] arraryByte;
            HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(srcPdfFile);
            req.Method = "GET";
            using (WebResponse wr = req.GetResponse())
            {
                StreamReader responseStream = new StreamReader(wr.GetResponseStream(), Encoding.UTF8);
                int length = (int)wr.ContentLength;
                byte[] bs = new byte[length];

                HttpWebResponse response = wr as HttpWebResponse;
                Stream stream = response.GetResponseStream();

                //讀取到記憶體
                MemoryStream stmMemory = new MemoryStream();
                byte[] buffer1 = new byte[length];
                int i;
                //將位元組逐個放入到Byte 中
                while ((i = stream.Read(buffer1, 0, buffer1.Length)) > 0)
                {
                    stmMemory.Write(buffer1, 0, i);
                }
                arraryByte = stmMemory.ToArray();
                stmMemory.Close();
            }
            return arraryByte;
        }

        #endregion 從網站上下載pdf,轉化為位元組流

        #region 從網站上下載文件,保存到其他路徑

        /// <summary>
        /// 從網站上下載文件,保存到其他路徑
        /// </summary>
        /// <param name="pdfFile">文件地址</param>
        /// <param name="saveLoadFile">保存文件路徑:D:\12221.pdf</param>
        /// <returns></returns>
        public string SaveRemoteFile( string saveLoadFile , string pdfFile)
        {
            //bool flag = false;
            var f = saveLoadFile + Guid.NewGuid().ToString("D") + ".pdf";
            Uri downUri = new Uri(pdfFile);
            //建立一個WEB請求,返回HttpWebRequest對象
            HttpWebRequest hwr = (HttpWebRequest)WebRequest.Create(downUri);
            //流對象使用完後自動關閉
            using (Stream stream = hwr.GetResponse().GetResponseStream())
            {
                //文件流,流信息讀到文件流中,讀完關閉
                using (FileStream fs = File.Create(f))
                {
                    //建立位元組組,並設置它的大小是多少位元組
                    byte[] bytes = new byte[102400];
                    int n = 1;
                    while (n > 0)
                    {
                        //一次從流中讀多少位元組,並把值賦給N,當讀完後,N為0,並退出迴圈
                        n = stream.Read(bytes, 0, 10240);
                        fs.Write(bytes, 0, n); //將指定位元組的流信息寫入文件流中
                    }
                }
            }

            //return flag;
            //return _outPath + saveLoadFile;
            return f;
        }

        #endregion 從網站上下載文件,保存到其他路徑

2.ftp模式的pdf文件

/// <summary>
        /// 下載FTP文件。
        /// </summary>
        /// <param name="offsetPath">相對路徑</param>
        /// <param name="fileName">文件名稱</param>
        /// <returns>下載結果,本地文件路徑</returns>
        public string DownLoad(string offsetPath,string fileName)
        {
            try
            {
                FtpWebRequest ftpWeb = (FtpWebRequest)WebRequest.Create(_ftpRootPath + offsetPath + fileName);
                ftpWeb.Method = WebRequestMethods.Ftp.DownloadFile;
                ftpWeb.UseBinary = true;
                var resp = ftpWeb.GetResponse();
                using (FileStream fs = new FileStream(_outPath + fileName, FileMode.Create))
                {
                    using (var s = resp.GetResponseStream())
                    {
                        if (s == null) { return "文件不存在!"; }

                        int readCout = 0;
                        byte[] bytes = new byte[1024];
                        readCout = s.Read(bytes, 0, 1024);
                        while (readCout > 0)
                        {
                            fs.Write(bytes, 0, readCout);
                            readCout = s.Read(bytes, 0, 1024);
                        }
                    }
                }
                resp.Close();
                return _outPath + fileName;
            }
            catch (Exception e)
            {
                return e.Message;
            }
            
        }

        /// <summary>
        /// 判斷文件是否存在
        /// </summary>
        /// <param name="offsetPath"></param>
        /// <param name="fileName"></param>
        /// <returns></returns>
        public bool FileExists(string offsetPath, string fileName)
        {
            try
            {
                FtpWebRequest ftpWeb = (FtpWebRequest)WebRequest.Create(_ftpRootPath + offsetPath + fileName);
                ftpWeb.Method = WebRequestMethods.Ftp.DownloadFile;
                ftpWeb.UseBinary = true;
                var resp = (FtpWebResponse)ftpWeb.GetResponse();
                resp.Close();
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

        /// <summary>
        /// 獲取目錄下所有文件
        /// </summary>
        /// <returns></returns>
        public string[] Files(string offsetPath)
        {
            try
            {
                FtpWebRequest ftpWeb = (FtpWebRequest)WebRequest.Create(_ftpRootPath + offsetPath);
                ftpWeb.Method = WebRequestMethods.Ftp.ListDirectory;
                Stream stream = ftpWeb.GetResponse().GetResponseStream();
                if (stream == null)
                {
                    return null;
                }
                List<string> fileList = new List<string>();
                using (StreamReader sr = new StreamReader(stream))
                {
                    StringBuilder sb = new StringBuilder();
                    do
                    {
                        sb.Append(sr.ReadLine());
                        if (sb.Length > 0)
                        {
                            fileList.Add(sb.ToString());
                            sb.Clear();
                        }
                        else
                        {
                            break;
                        }
                    } while (true);
                }
                return fileList.ToArray();
            }
            catch (Exception)
            {
                 return null;
            }
        }

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、前言: WebAPI主要開放數據給手機APP,Pad,其他需要得知數據的系統,或者軟體應用。Web 用戶的身份驗證,及頁面操作許可權驗證是B/S系統的基礎功能。我上次寫的《Asp.Net MVC WebAPI的創建與前臺Jquery ajax後臺HttpClient調用詳解》這種跟明顯安全性不是那 ...
  • 現在好多使用gitlab ci的持續集成的教程,大部分都是發佈到linux系統上的,但是目前還是有很大一部分企業使用的都是windows系統使用IIS在部署.NET應用程式。這裡寫一下如何使用gitlab ci配合gitlab runner持續集成到IIS吧。 安裝gitlab 網上有很多安裝git ...
  • 學習編程語言之前,首先要搞清楚“編程語言”這個概念。 很小的時候,父母就教我們開口說話,也教我們如何理解別人講話的意思。經過長時間的熏陶和自我學習,我們竟然在不知不覺中學會了說話,同時也能聽懂其他小朋友說話的意思了,我們開始向父母要零花錢買零食和玩具、被欺負了向父母傾訴…… 我們說的是漢語,是“中國 ...
  • 在上一篇 "[Cake] 2. dotnet 全局工具 cake" 中介紹了通過.Net Core 2.1 的全局工具 命令來簡化cake的安裝和使用。 因為是全局安裝,則無法適應每個項目對特定版本的要求 。隨著.Net Core 3.0中增加的對本地工具(項目級別)的支持,使得這一問題得以解決。 ...
  • 今年苟了差不多一整年,期間斷斷續續把c++ prime plus 看完了 ,發現並沒有什麼鳥用 ,但是對代碼怎麼形成二進位的過程 動態記憶體管理 這些模模糊糊的確實理解更深刻些了 特別是c++過度到c# 恍然大悟 噢 原來是這樣。期間找過一些c++的工作 ,要說面試題 其實基本都能做出來 然並卵 工資 ...
  • ClassRoom ClassRoom 是一個練手demo,目的是為了能熟悉掌握Orleans的基本知識和使用方法,我會儘量在這個項目中加入更多的知識點,一邊學一邊練避免我看完文檔就忘掉 創建項目 依舊是四個項目起步 |項目名稱|項目類型|項目說明| |: |: |: | |IGrains|.net ...
  • 到目前為止,設計人員可以使用的存儲技術是易變的,這意味著在斷電後,存儲器中的數據內容會丟失。但是,隨著Everspin Technologies推出256Mb STT-MRAM,系統現在可以擁有像DRAM這樣具有高性能的記憶體,但可以提供持久的非易失性數據存儲。 圖1:STT-MRAM STT-MRA ...
  • asp.net core 3.0 MVC JSON 全局配置 System.Text.Json(default) 1. startup配置代碼如下: 2. "官方API" Newtonsoft.Json 1. Install Package Microsoft.AspNetCore.Mvc.Newt ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...