【翻譯】如何使用Electron和PDF.js構(gòu)建一個(gè)PDF查看軟件

原文鏈接:https://www.pdftron.com/blog/electron/how-to-build-an-electron-pdf-viewer/

Electron 是一個(gè)使用web技術(shù)創(chuàng)建跨平臺(tái)桌面應(yīng)用的開源框架战惊。這篇文章將教你怎樣使用PDF.js在Electron app中構(gòu)建一個(gè)自己的桌面PDF查看軟件伟件。

1. 下載和安裝 Electron

原文這里寫的下載和安裝Electron名眉,但是內(nèi)容只有一個(gè)獲取快速開始的模板出刷,并沒有下載和安裝Electron,具體怎么安裝戳稽,各位看官筹陵,請(qǐng)移步Electron 官網(wǎng)益老,首頁就有安裝方法闯参,非常直觀和方便瞻鹏。

Electron提供一個(gè)方便快速開始的模板倉庫悲立,里面包含了啟動(dòng)一個(gè)最小桌面程序所需的全部文件。下載并開始:

git clone https://github.com/electron/electron-quick-start

cd electron-quick-start

npm install

執(zhí)行完上面三個(gè)步驟新博,直接運(yùn)行npm start 就可以啟動(dòng)桌面程序了薪夕。

npm start

你將會(huì)看到從你桌面上彈出一個(gè) hello world 應(yīng)用程序。

2. 配置項(xiàng)目結(jié)構(gòu)

為了保持整潔叭披,我們稍微整理下目錄結(jié)構(gòu)寥殖,創(chuàng)建源碼目錄 src 并把 index.htmlrenderer.js 移動(dòng)進(jìn)去玩讳。

main.js中, 把這行代碼:

mainWindow.loadFile('index.html')

改成:

mainWindow.loadFile('src/index.html')

然后, 在 /src/中, 創(chuàng)建 index.css 文件用于APP的界面樣式定義涩蜘。

3.下載 PDF.js

在項(xiàng)目根目錄創(chuàng)建public文件夾。然后將下載的PDF.js文件夾放到這里面熏纯。

點(diǎn)擊這里here 下載并解壓PDF.js文件并放到 public 目錄中同诫。 為了方便使用, 把解壓的PDF.js文件夾改名為 pdfjs

完成后的目錄結(jié)構(gòu)樟澜,看起來下面這張圖:

generic

你還配置Electron靜態(tài)資源目錄误窖。打開 package.json添加如下代碼:

"build": {
  "extraResources": ["./public/**"]
}

4. 創(chuàng)建查看器

用下面的代碼替換 src/index.html內(nèi)容:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Hello World!</title>
    <link rel='stylesheet' href='./index.css'>
  </head>
  <body>

    <div class='picker'>
      <button id='myButton'>Select PDF to view</button>
    </div>

    <div class='viewer' id='viewer'>

    </div>

    <script>
      require('./renderer.js');
    </script>
  </body>
</html>

這個(gè)頁面就是應(yīng)用的UI界面。我們創(chuàng)建一個(gè)按鈕用于選擇本地的pdf文件秩贰,創(chuàng)建一個(gè)id為viewer 的 div 用于顯示pdf內(nèi)容霹俺。自定義樣式寫在index.css中,并通過link引入進(jìn)來毒费。

src/index.css中添加如下代碼:

html, body {
  margin: 0;
  padding: 0;
  width: 100%;
  height: 100%;
}

div.picker {
  width: 100%;
  height: 40px;

  background-color: #222222;
  display: flex;
  justify-content: center;
  align-items: center;
}

div.viewer {
  width: 100%;
  height: calc(100% - 40px);
}

div.viewer iframe {
  width: 100%;
  height: 100%;
}

上面的代碼添加了基本的布局丙唧,是整個(gè)頁面的填滿整個(gè)窗口,查看器的寬高都調(diào)成了100%觅玻。

現(xiàn)在可以添加JS邏輯了想际, 修改 src/renderer.js 代碼如下:

const { dialog } = require('electron').remote;
const path = require('path');

// 給按鈕添加時(shí)間監(jiān)聽
document.getElementById('myButton').addEventListener('click', () => {

  // 當(dāng)點(diǎn)擊按鈕時(shí),就彈出一個(gè)選擇pdf文件的窗口溪厘。
  dialog.showOpenDialog({
    properties: ['openFile'], // 設(shè)置為打開文件的彈窗
    filters: [ { name: "PDFs", extensions: ['pdf'] } ] // 過濾文件胡本,只能選擇pdf
  }, (filepaths) => {

    // Since we only allow one file, just use the first one
    const filePath = filepaths[0];

    const viewerEle = document.getElementById('viewer');
    viewerEle.innerHTML = ''; // 清空上次的內(nèi)容

    //創(chuàng)建一個(gè)iframe指向咋們的PDF.js查看器。并把選擇的pdf文件路勁當(dāng)做file參數(shù)傳遞過去畸悬。
    const iframe = document.createElement('iframe');
    iframe.src = path.resolve(__dirname, `../public/pdfjs/web/viewer.html?file=${filePath}`);

    // 把iframe添加到頁面中侧甫。
    viewerEle.appendChild(iframe);
  })
})

這個(gè)代碼使用Electron的 dialog 模塊打開一個(gè)文件選擇對(duì)話框。當(dāng)用戶選擇了一個(gè)文件蹋宦,我們就創(chuàng)建一個(gè)iframe載入PDF.js的Viewer披粟。我們通過查詢參數(shù)告知PDF.js需要打開的文件路徑。

好了! 現(xiàn)在執(zhí)行 npm start 以開發(fā)模式啟動(dòng) Electron 應(yīng)用妆档。馬上就會(huì)看到我們上面所寫的界面僻爽。

當(dāng)你點(diǎn)擊按鈕,就會(huì)彈出一個(gè)選擇文件的對(duì)話框贾惦,選擇一個(gè)pdf文件胸梆,選中之后PDF.js viewer就會(huì)渲染這個(gè)pdf文件敦捧。

到現(xiàn)在為止,我們已經(jīng)我們的Electron應(yīng)用程序中實(shí)現(xiàn)了PDF的查看功能碰镜。但是我們還想添加更多的功能兢卵,比如注釋,PDF操作绪颖,以及支持更多的文件類型秽荤。 then open source software just won't cut it.(這句不知道怎么翻譯比較好)

這就是PDFTron的 WebViewer的用武之地!它提供開箱即用的所有這些功能柠横,無需配置窃款。我們可以像PDF.js一樣輕松地將它實(shí)現(xiàn)到我們的Electron應(yīng)用程序中(免費(fèi))。

使用WebViewer實(shí)現(xiàn)

要實(shí)現(xiàn)這個(gè)查看器, 首先需要 注冊(cè)免費(fèi)試用. 注冊(cè)完成后, 下載WebViewer 程序包 將內(nèi)容解壓到 public 文件夾中牍氛。

現(xiàn)在我們需要引入 WebViewer 文件晨继。在 src/index.html<head>下面添加一行代碼:

<script src='../public/WebViewer/lib/webviewer.min.js'></script>

這將 WebViewer 加載在全局上下文以供使用。

現(xiàn)在我們需要改變按鈕的點(diǎn)擊事件搬俊,使用WebViewer替代PDF.js紊扬。 為了演示,我們創(chuàng)建一個(gè)新的renderer-webviewer.js 文件并添加如下代碼:

const { dialog } = require('electron').remote;
const path = require('path');

// 給按鈕添加監(jiān)聽事件
document.getElementById('myButton').addEventListener('click', () => {

  // 當(dāng)按鈕被點(diǎn)擊則彈出一個(gè)文件選擇對(duì)話框唉擂。
  dialog.showOpenDialog({
    properties: ['openFile'], // 設(shè)置文件打開對(duì)話框
    filters: [ { name: "PDFs", extensions: ['pdf'] } ] // 過濾pdf文件類型
  }, (filepaths) => {

    // 只能選擇一個(gè)文件餐屎,直接使用第一個(gè)。
    const filePath = filepaths[0];

    const viewerEle = document.getElementById('viewer');
    viewerEle.innerHTML = ''; // 清空之前的內(nèi)容

    // 創(chuàng)建一個(gè)WebViewer實(shí)例.
    new window.PDFTron.WebViewer({
      path: '../public/WebViewer/lib',
      l: '你的密鑰寫在這里',
      initialDoc: filePath
    }, viewerEle)

  })
})

這個(gè)和 PDF.js 的步驟大致相同, 只是使用WebViewer的實(shí)例代替了iframe玩祟。

現(xiàn)在需要修改為新的js文件腹缩。將src/index.html 中的:

require('./renderer.js');

改為:

require('./renderer-webviewer.js');

就是這樣!

執(zhí)行 npm start 啟動(dòng)應(yīng)用程序卵凑。 界面幾乎沒有變化, 只是WebViewer 替代了PDF.js庆聘。 你現(xiàn)在可以給pdf文檔添加注釋了,還有更多的操作勺卢。

構(gòu)建產(chǎn)品程序包

構(gòu)建步驟根據(jù)不同的系統(tǒng)會(huì)有所差別伙判,感興趣的同學(xué)可以參考 這個(gè)指南

結(jié)論

這篇文章展示了使用開源的軟件構(gòu)建一個(gè)PDF查看程序是多么的容易黑忱。我們還了解了如何通過 WebViewer創(chuàng)建功能更豐富的PDF應(yīng)用程序宴抚。

源碼 下載.

你可以在這里查看WebViewer的完整演示。對(duì)比下 PDF.js viewer!和它的區(qū)別甫煞。

如果您對(duì)在項(xiàng)目中實(shí)施WebViewer有任何疑問菇曲,請(qǐng) 聯(lián)系我們,我們將竭誠(chéng)為您服務(wù)抚吠!

翻譯后記:

  1. 我是在項(xiàng)目中使用Electron封裝項(xiàng)目的web程序過程中遇到了pdf插件失效的問題常潮,才發(fā)現(xiàn)的這篇文章,雖然和我們的程序有差別(我們是純web楷力,這個(gè)Electron用web布局)喊式,但是pdf.js的使用啟發(fā)了我孵户,則在項(xiàng)目中修改成了pdf.js的查看方式后,問題解決岔留。
    在純web項(xiàng)目引用PDF.js有稍微差別夏哭。不過也是iframe方式,還是很簡(jiǎn)單的献联,代碼都差不多竖配。

  2. 如果是想單純?cè)贓lectron使用PDF.js可以直接使用已經(jīng)封裝好的npm包:https://www.npmjs.com/package/electron-pdf-window

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市里逆,隨后出現(xiàn)的幾起案子进胯,更是在濱河造成了極大的恐慌,老刑警劉巖运悲,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件龄减,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡班眯,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門烁巫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來署隘,“玉大人,你說我怎么就攤上這事亚隙〈挪停” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵阿弃,是天一觀的道長(zhǎng)诊霹。 經(jīng)常有香客問我,道長(zhǎng)渣淳,這世上最難降的妖魔是什么脾还? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮入愧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己她奥,他們只是感情好敷硅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著旁赊,像睡著了一般桦踊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上终畅,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天籍胯,我揣著相機(jī)與錄音鳄橘,去河邊找鬼。 笑死芒炼,一個(gè)胖子當(dāng)著我的面吹牛瘫怜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播本刽,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鲸湃,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了子寓?” 一聲冷哼從身側(cè)響起暗挑,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎斜友,沒想到半個(gè)月后炸裆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鲜屏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年烹看,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片洛史。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡惯殊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出也殖,到底是詐尸還是另有隱情土思,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布忆嗜,位于F島的核電站己儒,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏捆毫。R本人自食惡果不足惜闪湾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望冻璃。 院中可真熱鬧响谓,春花似錦、人聲如沸省艳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽跋炕。三九已至赖晶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背遏插。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工捂贿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人胳嘲。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓厂僧,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親了牛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子颜屠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • [轉(zhuǎn)載自http://get.ftqq.com/7870.get] <link rel="icon" type="...
    起航者de風(fēng)景閱讀 4,214評(píng)論 0 2
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML標(biāo)準(zhǔn)鹰祸。 注意:講述HT...
    kismetajun閱讀 27,477評(píng)論 1 45
  • 柔巴依《南陽四首》 “南都行” 青山歷歷 近可染眉如黛 青山隱隱 遠(yuǎn)欲欺眼如花 漸遠(yuǎn) 疊幾層青青如琴瑟 漸淡 那一...
    梅溪仙子閱讀 267評(píng)論 0 0
  • 就像詩人遺忘了愛情甫窟, 我也在余燼里尋找燃燒的熱情。 不似當(dāng)年蛙婴,不再是滿紙荒唐言粗井, 熄滅了如愛情般水月鏡花的靈感。 ...
    孤筆題歲月閱讀 286評(píng)論 5 8
  • 一 從小喜歡玩捉迷藏 喜歡那種趴在草叢一動(dòng)不動(dòng)的感覺 喜歡屏住呼吸 等待尋你的人 長(zhǎng)大以后未曾料到 會(huì)一直和你玩藏...
    肖云cc閱讀 656評(píng)論 0 0