前言:初學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一下就可以解決了。
天地不仁,以萬物為芻狗 ---老子