javascript
使用poi写入doc文档中文档打不开_基于NodeJS和浏览器的PDF文档引擎——PDFKit
介紹
PDFKit是一個用于Node和瀏覽器的PDF文檔生成庫,可以輕松創(chuàng)建復(fù)雜的多頁面可打印文檔。API包含可鏈接性,包括低級功能以及更高級功能的抽象。PDFKit API設(shè)計(jì)簡單,因此生成復(fù)雜文檔通常與一些函數(shù)調(diào)用一樣簡單。最直接的好處就是節(jié)省了服務(wù)器端的資源,讓生成工作在本地完成!
如何獲取?
由于最近限制頗多,不便于直接放鏈接,截圖都不行,大家可以直接到Github搜索
安裝使用
- 使用npm包管理
npm install pdfkit
- 創(chuàng)建文檔
創(chuàng)建PDFKit文檔非常簡單。只需要引用pdfkit的JavaScript源文件中的模塊并創(chuàng)建PDFDocument該類的實(shí)例
const PDFDocument = require('pdfkit');const doc = new PDFDocument;
PDFDocument實(shí)例是可讀的節(jié)點(diǎn)流。它們不會自動保存在任何地方,但您可以調(diào)用管道方法將PDF文檔的輸出發(fā)送到正在寫入的另一個可寫節(jié)點(diǎn)流。完成文檔后,請調(diào)用end方法以完成它。下面是一個示例,說明如何管道傳輸文件或HTTP響應(yīng)。
doc.pipe(fs.createWriteStream('/path/to/file.pdf')); // 寫pdfdoc.pipe(res); // HTTP響應(yīng)// 添加內(nèi)容doc.end();
- 瀏覽器使用
在瀏覽器中使用PDFKit與在Node中使用它完全相同,除非你想要將輸出通過管道傳輸?shù)綖g覽器中支持的目標(biāo),例如Blob。Blob可用于生成URL以允許通過iframe直接在瀏覽器中顯示生成的PDF,或者它們可用于將PDF上傳到服務(wù)器,或在用戶的瀏覽器中觸發(fā)下載。
// 引入依賴const PDFDocument = require('pdfkit');const blobStream = require('blob-stream');// 同樣的創(chuàng)建方式const doc = new PDFDocument;//傳輸文檔到Blobconst stream = doc.pipe(blobStream());//像以往一樣將內(nèi)容添加到文檔// 最終得到Blobdoc.end();stream.on('finish', function() { // 得到一個可以隨心所欲的Blob const blob = stream.toBlob('application/pdf'); //或獲取blob URL以在瀏覽器中顯示 const url = stream.toBlobURL('application/pdf'); iframe.src = url;});
- 添加頁
這個地方除非你設(shè)置autoFirstPage: false,不然PDFkit會自動給你添加第一頁,后續(xù)頁面你需要自己添加
doc.addPage()//事件監(jiān)聽doc.on('pageAdded', () => doc.text("Page Title"));
還可以為頁面設(shè)置一些選項(xiàng),例如其大小和方向以及邊距等
// 所有頁面添加50邊距doc.addPage({ margin: 50});// 在每一側(cè)添加不同的邊距doc.addPage({ margins: { top: 50, bottom: 50, left: 72, right: 72 }});
- 切換到之前的頁面
bufferPages: true// 配置//調(diào)用doc.switchToPage(pageNumber)
// 創(chuàng)建一個文檔,bufferPages設(shè)置為truelet i;let end;const doc = new PDFDocument({ bufferPages: true});// 添加一些內(nèi)容doc.addPage();// ...doc.addPage();//查看緩沖頁面的范圍const range = doc.bufferedPageRange(); // => { start: 0, count: 2 }for (i = range.start, end = range.start + range.count, range.start <= end; i < end; i++;) { doc.switchToPage(i); doc.text(`Page ${i + 1} of ${range.count}`);}// 手動刷新已緩沖的頁面doc.flushPages();doc.end();
- 設(shè)置文檔元數(shù)據(jù)
PDF文檔可以具有與其相關(guān)聯(lián)的各種元數(shù)據(jù),例如標(biāo)題或文檔的作者。可以通過將該信息添加到doc.info對象中,或者通過在創(chuàng)建時將info對象傳遞到文檔中來添加該信息。
以下是可以添加到文檔元數(shù)據(jù)的所有屬性的列表。根據(jù)PDF規(guī)范,每個屬性必須首字母大寫。
- Title - 文件的標(biāo)題
- Author - 作者的姓名
- Subject - 文件的主題
- Keywords - 與文檔關(guān)聯(lián)的關(guān)鍵字
- CreationDate - 文檔創(chuàng)建的日期(由PDFKit自動添加)
- ModDate - 上次修改文檔的日期
- 加密和訪問權(quán)限
PDF規(guī)范允許你在打開文件時加密PDF文件且需要密碼,以及設(shè)置用戶可以對PDF文件執(zhí)行的操作的權(quán)限。要啟用加密,在創(chuàng)建時提供用戶密碼PDFDocument的options對象。提供用戶密碼時將對PDF文件進(jìn)行加密,并在打開文件時提示用戶輸入密碼以解密文件。
- userPassword - 用戶密碼(字符串值)
要設(shè)置PDF文件的訪問權(quán)限,您需要option在創(chuàng)建時在對象中提供所有者密碼和權(quán)限設(shè)置PDFDocument。默認(rèn)情況下,不允許所有操作。您需要明確允許某些操作。
- ownerPassword - 所有者密碼(字符串值)
- permissions - 指定PDF文件權(quán)限的對象
permissions對象中允許以下設(shè)置:
- printing - 是否允許打印。指定"lowResolution"允許降級打印,或"highResolution"允許以高分辨率打印
- modifying - 是否允許修改文件。指定true允許修改文檔內(nèi)容
- copying - 是否允許復(fù)制文本或圖形。指定true允許復(fù)制
- annotating - 是否允許注釋,填寫表格。指定true允許注釋和表單填寫
- fillingForms - 是否允許填寫表格和簽字。指定true允許填寫表單字段和簽名
- contentAccessibility - 是否允許復(fù)制文本以便訪問。指定true允許復(fù)制可訪問性
- documentAssembly - 是否允許裝配文件。指定true允許文檔組裝
可以指定用戶密碼,所有者密碼或兩個密碼。行為因提供的密碼而異:
- 僅提供用戶密碼時,具有用戶密碼的用戶可以解密文件并具有對文檔的完全訪問權(quán)限。
- 當(dāng)僅提供所有者密碼時,用戶能夠在不提供任何密碼的情況下解密和打開文檔,但訪問僅限于明確允許的操作。擁有所有者密碼的用戶可以完全訪問該文檔。
- 提供兩個密碼時,具有用戶密碼的用戶可以解密文件,但只能根據(jù)權(quán)限設(shè)置對文件進(jìn)行有限的訪問。擁有所有者密碼的用戶可以完全訪問該文檔。
以上介紹的都是基本使用方法,核心用法包括矢量圖創(chuàng)建和繪制、文本內(nèi)容、圖片以及注釋等文檔實(shí)在太過詳細(xì),因此就不在詳細(xì)介紹,看文檔更有用,由于是英文文檔,可以借助瀏覽器自帶的翻譯插件查看
在線預(yù)覽查看
總結(jié)一下
目前pdf文檔的預(yù)覽非常容易實(shí)現(xiàn),但是生成,這里說的是客戶端生成相對來說要復(fù)雜一些,但是借助PDFKit就可以使用簡單的API來實(shí)現(xiàn)非常復(fù)雜的功能,可以說很貼心了,有需求的小伙伴趕緊去看看吧!
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖
總結(jié)
以上是生活随笔為你收集整理的使用poi写入doc文档中文档打不开_基于NodeJS和浏览器的PDF文档引擎——PDFKit的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python逗号代码_基于Python3
- 下一篇: 项目使用encode_Spring Cl