家好,很高興又見面了,我是"高級前端?進階?",由我帶著大家一起關注前端前沿、深入前端底層技術,大家一起進步,也歡迎大家關注、點贊、收藏、轉發!
高級前端?進階
PDF 目前已成為網絡文檔共享的基本元素,本文將帶著大家細數前端圈最火的PDF開源庫,話不多說,直接開始。
PDFKit 是用于 Node 和瀏覽器環境的 JavaScript PDF 生成庫。 借助于 PDFKit,開發者可以輕松創建復雜的、多頁的、可打印的文檔。 API 可鏈式調用,包括眾多底層功能和高級功能的抽象。 PDFKit API 被設計為盡量簡單的,但是通過函數組合可以快速生成復雜文檔。
PDFKit的典型特征包括:
除了上面列舉的功能外,包括:圖案填充、用于創建表格和布局內容的高級 API、更多性能優化已經在陸續開發中,在不久后就會發布。下面的示例展示了使用PDFKit的簡單示例:
const PDFDocument=require('pdfkit');
const fs=require('fs');
// 創建文檔
const doc=new PDFDocument();
// 將其輸出通過管道傳輸到某個地方,例如文件或 HTTP 響應
// 請參閱下面的瀏覽器用法
doc.pipe(fs.createWriteStream('output.pdf'));
// 嵌入字體,設置字體大小,并渲染一些文本
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');
// 應用一些變換并使用“奇偶”填充規則渲染 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+,是一個優秀的前端開源項目。
純 JavaScript 中的客戶端、服務器端 PDF 操作庫。pdfmake具有以下明顯特性:
在功能層面,pdfmake已經實現了以下諸多特征:
目前 pdfmake 已經支持眾多主流瀏覽器環境,包括:
在Node.js的版本支持上也是非常廣泛,具體如下:
而 pdfmake的 0.1.x 版本支持 Node.js 8 LTS、10 LTS、12 LTS、14 LTS。下面是異步使用 pdfmake 的示例:
$scope.generatePdf=function() {
// 在回調之前創建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+,是一個優秀的前端開源項目。
jsPDF 是一個基于 HTML5 的客戶端解決方案,用于生成各種用途的 PDF 文檔,jsPDF 是一個使用 JavaScript 語言生成 PDF 的開源庫。
開發者可以在 Firefox 插件,服務端腳本或是瀏覽器腳本中使用它,客戶端 Safari 和 iPhone Safari 支持得最好,其次是 Opera 和 Windows 下的 Firefox3 等。IE 暫不支持。
使用 jsPDF 非常簡單,首先安裝相關的包即可:
npm install jspdf --save
// or
yarn add jspdf
或者引入相應的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 文件夾包含不同類型的文件:
通常沒有必要在導入語句中指定確切的文件。 構建工具或 Node 會自動找出正確的文件,因此導入 jspdf 就可以了。
import { jsPDF } from "jspdf";
// 默認導出為a4紙,縱向,使用毫米為單位
const doc=new jsPDF();
doc.text("Hello world!", 10, 10);
doc.save("a4.pdf");
如果要更改紙張大小、方向或單位,可以執行以下操作:
//橫向輸出,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環境中,可以通過如下方法進行調用:
const { jsPDF }=require("jspdf");
// 會自動加載Node版本
const doc=new jsPDF();
doc.text("Hello world!", 10, 10);
doc.save("a4.pdf");
// 將文件保存在當前工作目錄中
jsPDF 也支持在TypeScript、Angular、Webpack、React等進行使用,更多使用配置可以參考官方文檔,本文不再過多展開。
目前 jsPDF 在Github 有超過26.5k的star、4.5k的fork、超過75.1k的項目依賴量,代碼貢獻者192+,是一個非常優秀的前端開源項目。
react-pdf 包用于使用 React 創建 PDF,如果開發者想顯示現有的 PDF,可以嘗試使用 react-pdf。對于react-pdf來說,在高層次上,文檔創建過程由 6 個具體步驟組成。
將 React 元素樹轉換為每個組件類型的適當內部實例,比如涉及保存這些(父子)節點之間的關系。除了 Document 之外,所有節點都將代表文檔中的一個塊,具有高度、寬度、填充和邊距。
react-pdf 會處理這個數據結構,開始推斷每個塊在最終文檔中的位置。
此步驟涉及預處理節點樣式,以及為用戶未提供的所需屬性定義默認值。 這樣,所有后續步驟都可以在樹中定義所有必需樣式的基礎上進行。
部分預處理涉及單位轉換、樣式繼承和樣式擴展。
遍歷內部節點樹以獲取任何所需的字體、圖像或表情符號。
react-pdf 會異步運行所有這些請求,但在所有請求完成(成功或失敗)之前不會繼續。
到這一步,react-pdf 已經加載了所有字體,可以將文本布局到段落中。
這是一個關鍵而復雜的步驟:首先使用適當的字體系列和大小將字符轉換為字形,嵌入圖像或表情符號圖像(如果存在),并最終將它們分成幾行,根據空格或根據語言(或自定義)規則分解單詞
這是最耗時的步驟,因為它不僅涉及計算每個元素在文檔中的位置以及需要多少空間,而且還要將這些元素拆分到不同的頁面中。
react-pdf 在內部使用 Yoga 布局來計算文檔內節點的大小和坐標,并根據一組可自定義的啟發式方法執行分頁。
PDF 文檔本身的創建。 對于這個任務,react-pdf 使用了很棒的 pdfkit。
一旦進入這個階段,react-pdf 就有了內部樹結構,其中包含生成文檔所需的所有數據。 剩下的就是決定要如何處理這些數據。 這將根據開發者使用的綁定而有所不同,但基本上它意味著顯示或保存它。
react-pdf 的使用也是非常簡單,比如下面的示例:
import React from 'react';
import { Document, Page, Text, View, StyleSheet } from '@react-pdf/renderer';
// 創建樣式
const styles=StyleSheet.create({
page: {
flexDirection: 'row',
backgroundColor: '#E4E4E4'
},
section: {
margin: 10,
padding: 10,
flexGrow: 1
}
});
// 創建文檔組件
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環境中可以將文檔保存到一個文件中,比如下面的例子:
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 標準的平臺,用于解析和渲染 PDF。本質上,PDF.js 是一種使用 HTML5 構建的便攜式文檔格式 (PDF) 查看器, 由社區驅動并由 Mozilla 提供支持。
開發者如果需要在 Web 應用程序中使用 PDF.js,可以選擇使用庫的預構建版本或從源代碼構建它。 PDF.js 在 pdfjs-dist 名稱下提供用于 NPM 和 Bower 的預構建版本。
要使用PDF.js,需要先導入相應的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 來處理加載期間的錯誤,還演示了如何等待頁面加載和渲染。
// 如果提供了來自遠程服務器的絕對 URL,則配置 CORS
// 該服務器上的標頭。
var url='https://raw.githubusercontent.com/mozilla/pdf.js/ba2edeae/examples/learning/helloworld.pdf';
// 通過 <script> 標簽加載,創建訪問 PDF.js 導出的快捷方式。
var pdfjsLib=window['pdfjs-dist/build/pdf'];
// 應指定 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 頁面尺寸準備畫布
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);
});
關于 PDF.js 的更多用法可以參考文末資料,這里不再過多展開。目前 PDF.js 在Github上有超過42.5k的star、9.4k的fork、215的項目依賴量,代碼貢獻者360+,是一個優秀的前端開源項目。
本文主要和大家介紹下全網最火的 5+ 前端 PDF 處理開源庫。相信通過本文的閱讀,大家對 各個 PDF 處理庫會有一個初步的了解。
因為篇幅有限,文章并沒有過多展開,如果有興趣,可以在我的主頁繼續閱讀,同時文末的參考資料提供了大量優秀文檔以供學習。最后,歡迎大家點贊、評論、轉發、收藏!
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的界面設計簡潔而直觀,同時提供了豐富的皮膚和主題選項,讓用戶能夠根據個人喜好進行個性化設置。
Vbook是一款功能強大的電子書閱讀器軟件,專為閱讀愛好者打造。它支持多種電子書格式,包括EPUB、PDF、MOBI等,讓用戶能夠輕松打開和閱讀各種電子書資源。Vbook提供了舒適的閱讀界面和個性化的閱讀設置,用戶可以調整字體大小、背景顏色、亮度等參數,以獲得最佳的閱讀體驗。
如果你想要知道全球200多個國家和地區的手機號碼中哪些有微信,燃精靈是你的好助手。燃精靈是一款優秀的微信空號檢測軟件,讓你只需將號碼段導入云端,就能過濾出有微信的號碼,從而準確抓住潛在客戶。搜索燃精靈,填寫推薦碼6666即可使用,飛機@RJL8888。
CustomizerGod是一款功能豐富的個性化定制工具軟件。它允許用戶根據個人喜好和需求,對電腦界面進行全方位的自定義。無論是更換主題、調整圖標、修改字體,還是定制窗口樣式和顏色,CustomizerGod都能輕松滿足。它的操作界面簡潔直觀,同時提供了大量的自定義選項和高級設置,讓用戶能夠打造出獨一無二的個性化電腦界面。
CareUEyes是一款專注于保護用戶視力的護眼軟件。它通過智能調節屏幕亮度、色溫等參數,有效減少長時間使用電腦對眼睛的傷害。CareUEyes還具備定時提醒功能,能夠定期提醒用戶休息眼睛,避免長時間連續使用電腦。它還提供了多種護眼模式和過濾效果,讓用戶在不同場景下都能獲得舒適的視覺體驗。
希望這5款小工具能給你帶來新的啟發,讓你的WIN10系統更加高效和個性化,如果有特別的需要可以在評論區給我留言。