實現線上預覽PDF的幾種解決方案

来源:https://www.cnblogs.com/wuhuacong/archive/2018/08/31/9566764.html
-Advertisement-
Play Games

因客戶需要實現PDF的預覽處理,在網上找了一些PDF線上預覽的解決方案,有的用PDFJS的線上預覽方式,有的使用PDFObject的嵌入式顯示,有的通過轉換JPG/PNG方式實現間接顯示的方式,開始是想通過簡單的方式,能夠使用JS插件實現預覽最好,可是線上預覽總是有一些不足,如不同瀏覽器的相容問題,... ...


因客戶需要實現PDF的預覽處理,在網上找了一些PDF線上預覽的解決方案,有的用PDFJS的線上預覽方式,有的使用PDFObject的嵌入式顯示,有的通過轉換JPG/PNG方式實現間接顯示的方式,開始是想通過簡單的方式,能夠使用JS插件實現預覽最好,可是線上預覽總是有一些不足,如不同瀏覽器的相容問題,甚至不同的手機平臺中展示的效果也不一樣,不過最好還是採用了間接的方式,把PDF轉換為圖片展示效果,達到客戶的要求。

1、線上實現預覽的方式

一開始我還是很傾向使用這種方式,希望能採用一個較為好的JS插件的方式,實現PDF的線上預覽(通過Web預覽),因此在Github上找到排名比較高的PDF插件

一看排名還是很高的,那麼採用它應該不錯,查看自帶的PDF文件,效果還是杠杠的。

不過客戶的要求是顯示正常的發票PDF文件,換一下文件地址,有部分信息顯示不了,找了一下沒有看到解決方法,所以效果不達標。

連基本的發票也顯示不了,那我這個就不能用它來顯示發票PDF文件了。

最後,測試了使用PDFObject(https://pdfobject.com/ )的方式實現線上嵌入PDF顯示的方式,這個JS插件也是不錯的,同樣可以在GitHub上可以找到。

它的使用也是很簡單的,如下代碼所示。

<script src="/js/pdfobject.js"></script>
<script>PDFObject.embed("/pdf/sample-3pp.pdf", "#example1");</script>

如果需要設置預覽視窗的大小,通過設置樣式即可。

<style>
.pdfobject-container { height: 500px;}
.pdfobject { border: 1px solid #666; }
</style>

顯示的效果是正常的了,不過我在蘋果手機打開Safari瀏覽器測試發現,不能正常顯示。

因此也不能使用來進行預覽顯示。

在實際的測試中,發現安卓手機的瀏覽器對於預覽PDF也是支持不一,有些直接下載PDF,不支持預覽顯示。

為了避免這些問題,最好找了一個折中的方案,把PDF轉換為圖片進行顯示,圖片在不同的瀏覽器中顯示可是沒有問題的。

2、PDF轉換圖片進行顯示

把PDF轉換為圖片也有很多控制項處理,例如Aspose.Pdf、Spire.Pdf、 pdfiumviewer 等等,不同的第三方類庫使用的方法有所差異,不過思路都很類似。

本來傾向於使用Aspose.Pdf的,不過發現轉換後的發票信息還是缺失了某些中文字元或者亂碼,導致不能正常顯示。

後來尋找Spire.Pdf 版本以及對應的綠色版本,終於能夠轉換為正確的格式了,因此也就使用這個第三方控制項進行轉換圖片使用了。

至於線上預覽,我們在第一次請求PDF預覽文件的時候,生成對應的圖片文件,後面直接返迴路徑即可。

實現的預覽效果如下所示。

由於我們是在asp.net MVC的項目上進行顯示的,因此需要修改控制器的處理邏輯,對圖片的生成進行判斷處理即可。

控制器後臺的實現代碼如下所示。

                //判斷是否存在PDF生成的圖片文件,
                //生成的jpg文件名為附件的ID
                string pdfjpgPath = string.Format("/GenerateFiles/pdf/{0}.jpg", info.ID);
                string pdfjpg = Server.MapPath(pdfjpgPath);

                //PDF文件路徑,相對目錄即可
                string pdfPath = @"/Content/Template/fapiao.pdf";
                string pdfRealPath = Server.MapPath(pdfPath);

                //如果不存在,則生成,否則返回已生成的文件
                if(!FileUtil.IsExistFile(pdfjpg))
                {                    
                    //破解
                    ModifyInMemory_Spire.ActivateMemoryPatching();
                    PdfDocument doc = new PdfDocument(pdfRealPath);
                    var image = doc.SaveAsImage(0, Spire.Pdf.Graphics.PdfImageType.Bitmap, 300, 300);
                    FileUtil.BytesToFile(ImageHelper.ImageToBytes(image), pdfjpg);
                }
                //存儲一個路徑
                info.SavePath = pdfjpgPath;//修改使用這個屬性返回使用

最後返回對應的Json信息即可

                //序列號返回對象信息
                string result = JsonConvert.SerializeObject(info, Formatting.Indented);
                return Content(result);

我們在頁面視圖中,通過ajax請求處理即可實現圖片的動態顯示了。

        //刷新列表
    var ID = '';
    function Refresh() {
        var filename = $("#WHC_FileName").val();
        //獲取或生成對應的PDF文件,根據路徑顯示
        $.getJSON("/PdfView/FindByFileName?r=" + Math.random() + "&name=" + filename, function (info) {
            if (info != '') {
                //獲取圖片路徑,設置顯示
                $("#imgfapiao").attr("src", info.SavePath);
            }
        });
    }

最後實現了圖片的預覽展示。

上面就是我的一個解決思路,如果您有更好的方式解決PDF線上預覽問題,歡迎彼此交流。 


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

-Advertisement-
Play Games
更多相關文章
  • 一般情況下,aspnetcore發佈後的預設埠是5000,這個大家都知道,而且預設骨架代碼中沒有看到任何讓你輸入的ip地址和埠號,但作為程式員的我們,不希望 被框架所管制,那如何實現預設埠的修改呢? 骨架代碼: 發佈如下: 一:解決辦法1(UseUrls) 骨架代碼就那麼幾行,很容易在這個IW ...
  • 在早期Bootstrap框架介紹中,我的隨筆《結合bootstrap fileinput插件和Bootstrap-table表格插件,實現文件上傳、預覽、提交的導入Excel數據操作流程》中介紹了利用Bootstrap FieInput插件上傳Excel文件到伺服器,然後利用Bootstrap-ta... ...
  • 在.NET世界,如果想要對資料庫進行操作,總少不了ADO.NET的身影。在.NET Core里同樣離不開那些熟悉的類庫與API。這裡簡略地介紹下如何通過ADO.NET對SQL Server進行不同的處理。 System.Data.SqlClient 第一步先在項目工程中查看有無System.Data ...
  • 基於上一篇文章 實現對IdnetityServer4 服務的使用 1:添加介面解決方案,並且使介面受認證服務的保護: 首先在解決方案中添加Api項目如下圖所示: 在API項目中添加Nuget 引用 如下圖所示: Install-Package IdentityServer4.AccessTokenV ...
  • 概述:使用Halcon在VS中的控制項顯示一張圖片。要點:使用了圖像縮放和圖像顯示函數,以及滑鼠滾輪響應函數。1、創建WinForm項目參考上一篇:HSmartWindowControl之安裝篇 (Visual Studio 2013 & Halcon 18)https://www.cnblogs.c... ...
  • 之前搞了很多次都是卡在了razor那個異常哪裡,今天心血來潮就在試一試,一試竟然成功了,激動的我趕緊記錄下歷程。廢話不說,走起。。。 ubuntu 16.04 安裝mono(最新版 5.14.0) 官網地址 https://www.mono-project.com/download/stable/# ...
  • 在日常的使用或者工作當中我們的vs會時不時的給我一些小“驚喜”。讓我們有時候無可奈何。這不今天我又遇到了所以我決定記錄下這些,方便以後再次出現好解決。 無法啟動iis express web 伺服器 在項目開發尤其是公司項目中,因為來回的切換項目時不時的會出現: 導致vs項目啟動不起來。這個時候首先 ...
  • 一、DataGridView 取得或者修改當前單元格的內容: 核心:DataGridView1.CurrentCell.Value; 1、當前單元格的Index: 列:DataGridView1.CurrentCell.ColumnIndex; 行:DataGridView1.CurrentCell ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...