Qt 展示pdf內容(新窗口或嵌入,pdfjs,linux)


前言:初學Qt,在網上查找了諸多資料,有什么poppler、mupdf啊巴拉巴拉的,結果一個比一個費勁,最后還是采用pdfjs較為方便高效,為方便相關問題搜索,寫了一下內容。

需求描述:Qt應用中不支持pdf的展示(據說最新版本支持了),而我使用的Qt為5.9版本,無法支持pdf文件的展示(涉及本地文件)。

解決思路:網上的大部分方法是poppler、mupdf第三方庫(轉換圖片展示),也有啟動第三方應用的方式,但是操作較為復雜且不符合我的需求,后來偶然之下看到了pdf的相關內容,其辦法為:將pdf嵌入到網頁中(Qt5.9是不支持展示pdf的,但是卻支持瀏覽器內容的展示),使用瀏覽器模式(QtWebEngineView)打開pdfjs頁面,pdfjs會調用pdf文件將其內容展示出來,也是采用了第三方,但是相對來說較好。

 

解決(本操作是在Linux(centOS7)下操作):

1.下載pdfjs:網上有諸多教程,這里就不累述了。

  pdfjs官網下載:http://mozilla.github.io/pdf.js/getting_started/#download

  (這里有ES5版本,看情況需要哪個用哪個)

  下載好后解壓即可使用(有三個文件內容,為了方便可以放在一個文件夾下,隨后放在你工程的相應地方,這個地方你看着放,只是為了引用,沒有啥影響,之后使用需要引用/打開三個文件中web文件下的viewer.html)

2.使用QtWebEngineView:這里需要使用瀏覽器展示功能,可以使用Qt自帶的QtWebEngineView(QtWebEngineView不是核心庫,需要引一下)

QtWebEngineView使用:https://www.jianshu.com/p/352da0c95f3c

  2.1引入QtWebEngineView:在需要展示pdf內容的.h頭文件加入

    #include <QtWebEngineWidgets/QtWebEngineWidgets>

  2.2創建對象(java過來的可能說法不對):

    QWebEngineView *pdfInfo = new QWebEngineView();

  2.3打開pdf(在Linux系統下本地文件絕對路徑需加file:///):pdfjs引用時后面帶上"?file="加上需要打開的pdf即可(這里打開本地文件,打開網絡文件也是一樣應用):

    static const QString runPath = dirPath + "Run/";

    static const QString pdfjs = "file://"+runPath+"pdfjsES5/web/viewer.html";
    static const QString link = "?file=";
    QString file = "file://"+runPath+"doc/"+pdfName;
    pdfInfo->page()->load(QUrl::fromUserInput(pdfjs + link + file));

  這里runPath(dirPath為我的工程根路徑,你就用你的(QCoreApplication::applicationDirPath()))為我的工程啟動路徑,我將pdfjs文件也放在啟動路徑下了(我這里打包pdfjs的文件夾名稱為pdfjsES5),file為我本地的pdf絕對路徑。之后使用先前創建的QWebEngineView對象加載這個本地pdfjs的html文件。

3.頁面展示:頁面嵌入式采用QGridLayout布局嵌入瀏覽器展示:

    ui->prPDF->addWidget(prInfo);

  這里prPDF為我界面設計采用的QGridLayout布局組件,這段代碼是將之前創建的QWebEngineView對象嵌入到這個布局中。

注意:我采用的時嵌入式的方法,如果采用新窗口,直接將QWebEngineView對象exec()執行下就出來了。

運行截圖:額  上傳不了  一臉懵逼。

反正就是pdfjs那個viewer.html打開后嵌入pdf頁面的樣式。

備注:pdfjs上半部分是有各種操作的,可以選擇性隱藏掉一定的操作,這里要注意這些操作刪除后是會出錯的,只能隱藏掉,有點前端基礎就知道display:hide一下就可以解決了。

 

 

天地不仁,以萬物為芻狗  ---老子


免責聲明!

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



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