家好,很高興又見面了,我是"高級前端?進階?",由我?guī)е蠹乙黄痍P(guān)注前端前沿、深入前端底層技術(shù),大家一起進步,也歡迎大家關(guān)注、點贊、收藏、轉(zhuǎn)發(fā)!
高級前端?進階
PDF 目前已成為網(wǎng)絡(luò)文檔共享的基本元素,本文將帶著大家細數(shù)前端圈最火的PDF開源庫,話不多說,直接開始。
PDFKit 是用于 Node 和瀏覽器環(huán)境的 JavaScript PDF 生成庫。 借助于 PDFKit,開發(fā)者可以輕松創(chuàng)建復(fù)雜的、多頁的、可打印的文檔。 API 可鏈?zhǔn)秸{(diào)用,包括眾多底層功能和高級功能的抽象。 PDFKit API 被設(shè)計為盡量簡單的,但是通過函數(shù)組合可以快速生成復(fù)雜文檔。
PDFKit的典型特征包括:
除了上面列舉的功能外,包括:圖案填充、用于創(chuàng)建表格和布局內(nèi)容的高級 API、更多性能優(yōu)化已經(jīng)在陸續(xù)開發(fā)中,在不久后就會發(fā)布。下面的示例展示了使用PDFKit的簡單示例:
const PDFDocument=require('pdfkit');
const fs=require('fs');
// 創(chuàng)建文檔
const doc=new PDFDocument();
// 將其輸出通過管道傳輸?shù)侥硞€地方,例如文件或 HTTP 響應(yīng)
// 請參閱下面的瀏覽器用法
doc.pipe(fs.createWriteStream('output.pdf'));
// 嵌入字體,設(shè)置字體大小,并渲染一些文本
doc
.font('fonts/PalatinoBold.ttf')
.fontSize(25)
.text('Some text with an embedded font!', 100, 100);
// 添加圖像,將其限制為給定大小,并將其垂直和水平居中
doc.image('path/to/image.png', {
fit: [250, 300],
align: 'center',
valign: 'center'
});
// 添加另外一頁
doc
.addPage()
.fontSize(25)
.text('Here is some vector graphics...', 100, 100);
// 繪制三角形
doc
.save()
.moveTo(100, 150)
.lineTo(100, 250)
.lineTo(200, 250)
.fill('#FF3300');
// 應(yīng)用一些變換并使用“奇偶”填充規(guī)則渲染 SVG 路徑
doc
.scale(0.6)
.translate(470, -380)
.path('M 250,75 L 323,301 131,161 369,161 177,301 z')
.fill('red', 'even-odd')
.restore();
// 添加一些帶有注釋的文本
doc
.addPage()
.fillColor('blue')
.text('Here is a link!', 100, 100)
.underline(100, 100, 160, 27, { color: '#0000FF' })
.link(100, 100, 160, 27, 'http://google.com/');
// 完成 PDF 文件
doc.end();
目前 PDFKit 在Github上有超過8.7k的star、1.1k的fork、超過64.1k的項目依賴量,代碼貢獻者80+,是一個優(yōu)秀的前端開源項目。
純 JavaScript 中的客戶端、服務(wù)器端 PDF 操作庫。pdfmake具有以下明顯特性:
在功能層面,pdfmake已經(jīng)實現(xiàn)了以下諸多特征:
目前 pdfmake 已經(jīng)支持眾多主流瀏覽器環(huán)境,包括:
在Node.js的版本支持上也是非常廣泛,具體如下:
而 pdfmake的 0.1.x 版本支持 Node.js 8 LTS、10 LTS、12 LTS、14 LTS。下面是異步使用 pdfmake 的示例:
$scope.generatePdf=function() {
// 在回調(diào)之前創(chuàng)建window
var win=window.open('', '_blank');
$http.post('/someUrl', data).then(function(response) {
// pass the "win" argument
pdfMake.createPdf(docDefinition).open({}, win);
});
};
目前 pdfmake 在Github上有超過10.8k的star、2k的fork、超過67.9k的項目依賴量,代碼貢獻者84+,是一個優(yōu)秀的前端開源項目。
jsPDF 是一個基于 HTML5 的客戶端解決方案,用于生成各種用途的 PDF 文檔,jsPDF 是一個使用 JavaScript 語言生成 PDF 的開源庫。
開發(fā)者可以在 Firefox 插件,服務(wù)端腳本或是瀏覽器腳本中使用它,客戶端 Safari 和 iPhone Safari 支持得最好,其次是 Opera 和 Windows 下的 Firefox3 等。IE 暫不支持。
使用 jsPDF 非常簡單,首先安裝相關(guān)的包即可:
npm install jspdf --save
// or
yarn add jspdf
或者引入相應(yīng)的CDN資源:
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script>
<script src="https://unpkg.com/jspdf@latest/dist/jspdf.umd.min.js"></script>
// unpkg版本
這個包的 dist 文件夾包含不同類型的文件:
通常沒有必要在導(dǎo)入語句中指定確切的文件。 構(gòu)建工具或 Node 會自動找出正確的文件,因此導(dǎo)入 jspdf 就可以了。
import { jsPDF } from "jspdf";
// 默認導(dǎo)出為a4紙,縱向,使用毫米為單位
const doc=new jsPDF();
doc.text("Hello world!", 10, 10);
doc.save("a4.pdf");
如果要更改紙張大小、方向或單位,可以執(zhí)行以下操作:
//橫向輸出,2×4 英寸
const doc=new jsPDF({
orientation: "landscape",
unit: "in",
format: [4, 2]
});
doc.text("Hello world!", 1, 1);
doc.save("two-by-four.pdf");
如果是在Node.js環(huán)境中,可以通過如下方法進行調(diào)用:
const { jsPDF }=require("jspdf");
// 會自動加載Node版本
const doc=new jsPDF();
doc.text("Hello world!", 10, 10);
doc.save("a4.pdf");
// 將文件保存在當(dāng)前工作目錄中
jsPDF 也支持在TypeScript、Angular、Webpack、React等進行使用,更多使用配置可以參考官方文檔,本文不再過多展開。
目前 jsPDF 在Github 有超過26.5k的star、4.5k的fork、超過75.1k的項目依賴量,代碼貢獻者192+,是一個非常優(yōu)秀的前端開源項目。
react-pdf 包用于使用 React 創(chuàng)建 PDF,如果開發(fā)者想顯示現(xiàn)有的 PDF,可以嘗試使用 react-pdf。對于react-pdf來說,在高層次上,文檔創(chuàng)建過程由 6 個具體步驟組成。
將 React 元素樹轉(zhuǎn)換為每個組件類型的適當(dāng)內(nèi)部實例,比如涉及保存這些(父子)節(jié)點之間的關(guān)系。除了 Document 之外,所有節(jié)點都將代表文檔中的一個塊,具有高度、寬度、填充和邊距。
react-pdf 會處理這個數(shù)據(jù)結(jié)構(gòu),開始推斷每個塊在最終文檔中的位置。
此步驟涉及預(yù)處理節(jié)點樣式,以及為用戶未提供的所需屬性定義默認值。 這樣,所有后續(xù)步驟都可以在樹中定義所有必需樣式的基礎(chǔ)上進行。
部分預(yù)處理涉及單位轉(zhuǎn)換、樣式繼承和樣式擴展。
遍歷內(nèi)部節(jié)點樹以獲取任何所需的字體、圖像或表情符號。
react-pdf 會異步運行所有這些請求,但在所有請求完成(成功或失敗)之前不會繼續(xù)。
到這一步,react-pdf 已經(jīng)加載了所有字體,可以將文本布局到段落中。
這是一個關(guān)鍵而復(fù)雜的步驟:首先使用適當(dāng)?shù)淖煮w系列和大小將字符轉(zhuǎn)換為字形,嵌入圖像或表情符號圖像(如果存在),并最終將它們分成幾行,根據(jù)空格或根據(jù)語言(或自定義)規(guī)則分解單詞
這是最耗時的步驟,因為它不僅涉及計算每個元素在文檔中的位置以及需要多少空間,而且還要將這些元素拆分到不同的頁面中。
react-pdf 在內(nèi)部使用 Yoga 布局來計算文檔內(nèi)節(jié)點的大小和坐標(biāo),并根據(jù)一組可自定義的啟發(fā)式方法執(zhí)行分頁。
PDF 文檔本身的創(chuàng)建。 對于這個任務(wù),react-pdf 使用了很棒的 pdfkit。
一旦進入這個階段,react-pdf 就有了內(nèi)部樹結(jié)構(gòu),其中包含生成文檔所需的所有數(shù)據(jù)。 剩下的就是決定要如何處理這些數(shù)據(jù)。 這將根據(jù)開發(fā)者使用的綁定而有所不同,但基本上它意味著顯示或保存它。
react-pdf 的使用也是非常簡單,比如下面的示例:
import React from 'react';
import { Document, Page, Text, View, StyleSheet } from '@react-pdf/renderer';
// 創(chuàng)建樣式
const styles=StyleSheet.create({
page: {
flexDirection: 'row',
backgroundColor: '#E4E4E4'
},
section: {
margin: 10,
padding: 10,
flexGrow: 1
}
});
// 創(chuàng)建文檔組件
const MyDocument=()=> (
<Document>
<Page size="A4" style={styles.page}>
<View style={styles.section}>
<Text>Section #1</Text>
</View>
<View style={styles.section}>
<Text>Section #2</Text>
</View>
</Page>
</Document>
);
也可以使用 ReactDOM.render 方法進行渲染:
import React from 'react';
import ReactDOM from 'react-dom';
import { PDFViewer } from '@react-pdf/renderer';
const App=()=> (
<PDFViewer>
<MyDocument />
</PDFViewer>
);
ReactDOM.render(<App />, document.getElementById('root'));
在Node.js環(huán)境中可以將文檔保存到一個文件中,比如下面的例子:
import React from 'react';
import ReactPDF from '@react-pdf/renderer';
ReactPDF.render(<MyDocument />, `${__dirname}/example.pdf`);
目前 react-pdf 在Github上有超過12.3k的star、1k的fork、超過7.2k的項目依賴量,代碼貢獻者107+,是一個不錯的前端開源項目。
PDF.js 是一個通用的、基于 Web 標(biāo)準(zhǔn)的平臺,用于解析和渲染 PDF。本質(zhì)上,PDF.js 是一種使用 HTML5 構(gòu)建的便攜式文檔格式 (PDF) 查看器, 由社區(qū)驅(qū)動并由 Mozilla 提供支持。
開發(fā)者如果需要在 Web 應(yīng)用程序中使用 PDF.js,可以選擇使用庫的預(yù)構(gòu)建版本或從源代碼構(gòu)建它。 PDF.js 在 pdfjs-dist 名稱下提供用于 NPM 和 Bower 的預(yù)構(gòu)建版本。
要使用PDF.js,需要先導(dǎo)入相應(yīng)的CDN資源。
<script src="https://www.jsdelivr.com/package/npm/pdfjs-dist"></script>
<script src="https://cdnjs.com/libraries/pdf.js"></script>
<script src="https://unpkg.com/pdfjs-dist/"></script>
下面示例演示了如何使用 promises 來處理加載期間的錯誤,還演示了如何等待頁面加載和渲染。
// 如果提供了來自遠程服務(wù)器的絕對 URL,則配置 CORS
// 該服務(wù)器上的標(biāo)頭。
var url='https://raw.githubusercontent.com/mozilla/pdf.js/ba2edeae/examples/learning/helloworld.pdf';
// 通過 <script> 標(biāo)簽加載,創(chuàng)建訪問 PDF.js 導(dǎo)出的快捷方式。
var pdfjsLib=window['pdfjs-dist/build/pdf'];
// 應(yīng)指定 workerSrc 屬性。
pdfjsLib.GlobalWorkerOptions.workerSrc='//mozilla.github.io/pdf.js/build/pdf.worker.js';
// 異步下載PDF
var loadingTask=pdfjsLib.getDocument(url);
loadingTask.promise.then(function(pdf) {
console.log('PDF loaded');
// 獲取第一頁page
var pageNumber=1;
pdf.getPage(pageNumber).then(function(page) {
console.log('Page loaded');
var scale=1.5;
var viewport=page.getViewport({scale: scale});
// 使用 PDF 頁面尺寸準(zhǔn)備畫布
var canvas=document.getElementById('the-canvas');
var context=canvas.getContext('2d');
canvas.height=viewport.height;
canvas.width=viewport.width;
// Render PDF page into canvas context
var renderContext={
canvasContext: context,
viewport: viewport
};
var renderTask=page.render(renderContext);
renderTask.promise.then(function () {
console.log('Page rendered');
});
});
}, function (reason) {
// PDF loading error
console.error(reason);
});
關(guān)于 PDF.js 的更多用法可以參考文末資料,這里不再過多展開。目前 PDF.js 在Github上有超過42.5k的star、9.4k的fork、215的項目依賴量,代碼貢獻者360+,是一個優(yōu)秀的前端開源項目。
本文主要和大家介紹下全網(wǎng)最火的 5+ 前端 PDF 處理開源庫。相信通過本文的閱讀,大家對 各個 PDF 處理庫會有一個初步的了解。
因為篇幅有限,文章并沒有過多展開,如果有興趣,可以在我的主頁繼續(xù)閱讀,同時文末的參考資料提供了大量優(yōu)秀文檔以供學(xué)習(xí)。最后,歡迎大家點贊、評論、轉(zhuǎn)發(fā)、收藏!
https://github.com/foliojs/pdfkit
http://pdfkit.org/
https://pdfmake.github.io/docs/0.1/getting-started/client-side/methods/
https://github.com/bpampuch/pdfmake
https://parall.ax/products/jspdf
https://github.com/parallax/jsPDF
https://react-pdf.org/rendering-process
https://mozilla.github.io/pdf.js/examples/index.html#interactive-examples(眾多示例)
https://www.nicesnippets.com/blog/how-to-create-pdf-file-in-nodejs
https://github.com/mozilla/pdf.js
封面圖來自:https://www.nicesnippets.com/blog/how-to-create-pdf-file-in-nodejs
今天我要為大家推薦五款小眾而且小體積的WIN10小工具,它們可以讓你的電腦使用更加方便和高效,而且不占用太多的空間和資源,非常適合輕量級的辦公和娛樂。
MusicBee是一款功能全面且高度可定制的音樂播放器軟件。它支持多種音頻格式,提供強大的音樂庫管理功能,用戶可以輕松整理、搜索和播放自己的音樂收藏。MusicBee的界面設(shè)計簡潔而直觀,同時提供了豐富的皮膚和主題選項,讓用戶能夠根據(jù)個人喜好進行個性化設(shè)置。
Vbook是一款功能強大的電子書閱讀器軟件,專為閱讀愛好者打造。它支持多種電子書格式,包括EPUB、PDF、MOBI等,讓用戶能夠輕松打開和閱讀各種電子書資源。Vbook提供了舒適的閱讀界面和個性化的閱讀設(shè)置,用戶可以調(diào)整字體大小、背景顏色、亮度等參數(shù),以獲得最佳的閱讀體驗。
如果你想要知道全球200多個國家和地區(qū)的手機號碼中哪些有微信,燃精靈是你的好助手。燃精靈是一款優(yōu)秀的微信空號檢測軟件,讓你只需將號碼段導(dǎo)入云端,就能過濾出有微信的號碼,從而準(zhǔn)確抓住潛在客戶。搜索燃精靈,填寫推薦碼6666即可使用,飛機@RJL8888。
CustomizerGod是一款功能豐富的個性化定制工具軟件。它允許用戶根據(jù)個人喜好和需求,對電腦界面進行全方位的自定義。無論是更換主題、調(diào)整圖標(biāo)、修改字體,還是定制窗口樣式和顏色,CustomizerGod都能輕松滿足。它的操作界面簡潔直觀,同時提供了大量的自定義選項和高級設(shè)置,讓用戶能夠打造出獨一無二的個性化電腦界面。
CareUEyes是一款專注于保護用戶視力的護眼軟件。它通過智能調(diào)節(jié)屏幕亮度、色溫等參數(shù),有效減少長時間使用電腦對眼睛的傷害。CareUEyes還具備定時提醒功能,能夠定期提醒用戶休息眼睛,避免長時間連續(xù)使用電腦。它還提供了多種護眼模式和過濾效果,讓用戶在不同場景下都能獲得舒適的視覺體驗。
希望這5款小工具能給你帶來新的啟發(fā),讓你的WIN10系統(tǒng)更加高效和個性化,如果有特別的需要可以在評論區(qū)給我留言。