想像一下您收到一項任務:在一週內建立一個新的文件網站。它應該具有視覺吸引力、快速且易於導航。您將收到一堆 *.docs 檔案、圖像和螢幕截圖,以及「完成它」.
的說明有許多優秀的工具可供選擇,例如Docusaurus、Nextra、VitePress、Docus等等。之前,我在使用 Starlight 建立文件網站方面獲得了豐富的經驗,因此我選擇了它來完成這項任務。然而,我發現了一個缺少的功能:從文件產生 PDF 的能力。這是要求之一。 「聽起來像是個不錯的副業項目,」我自己想的。
解決任務
起初,這似乎很簡單:取得頁面,解析 HTML,將內容分組,瞧!
星光驅動的網站有一個「下一步」按鈕來瀏覽文件。由於 PDF 本質上是頁面數組,因此使用「下一步」按鈕逐一解析它們似乎是合乎邏輯的。由於網站產生靜態頁面,我很快就編寫了一個腳本來取得 HTML、查詢必要的部分,並將所有內容組合在一起。然而,事實證明,產生保留網站樣式的 PDF 更為複雜。經過一番頭腦風暴,我意識到 Puppeteer 是最好的解決方案。
現在流程變得清晰了:
- 確定起始頁。 這是有「下一步」按鈕的第一頁。
- 瀏覽頁面。 從每個頁面提取標題和主要內容,同時建立目錄。
- 合併內容。 新增分頁符號和其他樣式。
- 準備最終的 HTML。 重寫 包含產生的 HTML 的初始頁面。
- 載入資源。 捲動頁面至底部載入所有圖片。
- 產生 PDF。 Puppeteer 的 Page.pdf() 方法可以解決這個問題。
- 完成!
這就是starlight-to-pdf 的工作原理。遵循這種模式,您可以為缺乏 PDF 匯出功能的其他文件框架建立類似的工具。
後續步驟
基本功能準備好後,就該增加一些額外功能了。以下是最有趣和最具挑戰性的功能。
新增頁首和頁尾
頁首或頁尾中包含頁碼和一些附加資訊是很好的。 Puppeteer 的 Page.pdf() 方法接受 headerTemplate 和 footerTemplate 選項。這些選項接受 HTML 字串。 Puppeteer 會自動將值注入到具有特定實用程式類別的元素中:
- .date:格式化日期;
- .title:網頁的標籤值;
- .url: 呼叫列印函數的頁面 URL;
- .pageNumber:目前頁碼;
- .totalPages: 文件的總頁數。
當我們在列印之前將所有內容合併在一頁上時,標題和網址對我們來說沒有太大價值:插入的值將始終保持不變。然而,其他課程有很大幫助。這是頁尾範本範例:
<style> .footer-container { --color: #000; display: flex; align-items: center; justify-content: space-between; border-block-start: 1px solid var(--color); color: var(--color); font-size: 10px; font-family: Arial, Helvetica, sans-serif; margin-inline: 1.5cm 1cm; padding-block: 0.25cm 0.5cm; width: 100%; } </style> <div> <p>To use this, do not forget to set the displayHeaderFooter property to true:<br> </p> <pre class="brush:php;toolbar:false">import puppeteer from 'puppeteer'; const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto('https://someUrl'); const footerTemplateStr = '<style>...<style><div>...</style>
以下是您應該牢記的一些發現:
- 模板必須是有效的 HTML 結構。
- 定義 font-size CSS 屬性,Puppeteer 的預設值為 0。
- 使用內嵌
- 影像應編碼為 base64 字串。
- 使用 Puppeteer 的邊距選項來實現所需的佈局。
CLI 樣式怎麼樣?
一切正常,產生的 PDF 看起來很棒,但終端訊息感覺平淡無奇。對細節的關注將好與偉大區分開來,不是嗎?讓我們的消息更加豐富多彩、更易於閱讀。
這就是 ANSI 轉義序列的魔力。我認為 4 位顏色足以完成這項工作。假設您想要紅色背景上的白色文字(這就是我用於[錯誤]:錯誤訊息之前的前綴)。以下是實現這種外觀的方法:
console.log('\x1b[37;41m', 'White on red message');
讓我們來分解一下:
- x1b[ 是十六進位轉義碼(您也可以使用 u001b 作為 Unicode 取代);
- 37 是前景色白色,其中 3 代表前景色,7 代表白色;
- 41 是背景紅色,其中 4 代表背景,1 代表紅色。
一切正常,但現在我們所有的 console.log() 輸出都將以這種方式設定樣式。若要將樣式重設為預設值,只需在末端新增重設序列 x1b[0m:
console.log('\x1b[37;41m', 'White on red message', '\x1b[0m');
好多了。如果我們想要在灰色背景上顯示粗體青色文字(4 位元顏色名稱中的亮黑色),該怎麼辦?很簡單:
console.log('\x1b[1;36;100m', 'Cyan on gray message in bold', '\x1b[0m');
以下是每個部位的作用:
- 1 轉義碼後塗抹粗體效果;
- 36 設定文字顏色為青色;
- 100 將背景改為亮黑色,其中 10 表示明亮,0 是黑色的程式碼。
利用這些知識,您可以讓您的 CLI 工具在視覺上更具吸引力。例如,我在專案中將所有 URL 和檔案路徑設定為帶下劃線的藍色文字:
console.log('\x1b[4;34m', './underlined/blue', '\x1b[0m')
查看此備忘單以了解有關該主題的更多資訊。
總結
你永遠不知道什麼時候日常任務可能會激發出有益的副業項目。 starlight-to-pdf 的開發為 Puppeteer 和 CLI 樣式提供了寶貴的經驗,並且在開源社群中出現了一種新工具。這是一個快速示範:
以上是將 Starlight 轉換為 PDF:經驗和見解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Python和JavaScript的主要區別在於類型系統和應用場景。 1.Python使用動態類型,適合科學計算和數據分析。 2.JavaScript採用弱類型,廣泛用於前端和全棧開發。兩者在異步編程和性能優化上各有優勢,選擇時應根據項目需求決定。

選擇Python還是JavaScript取決於項目類型:1)數據科學和自動化任務選擇Python;2)前端和全棧開發選擇JavaScript。 Python因其在數據處理和自動化方面的強大庫而備受青睞,而JavaScript則因其在網頁交互和全棧開發中的優勢而不可或缺。

Python和JavaScript各有優勢,選擇取決於項目需求和個人偏好。 1.Python易學,語法簡潔,適用於數據科學和後端開發,但執行速度較慢。 2.JavaScript在前端開發中無處不在,異步編程能力強,Node.js使其適用於全棧開發,但語法可能複雜且易出錯。

javascriptisnotbuiltoncorc; sanInterpretedlanguagethatrunsonenginesoftenwritteninc.1)JavascriptwasdesignedAsignedAsalightWeight,drackendedlanguageforwebbrowsers.2)Enginesevolvedfromsimpleterterpretpretpretpretpreterterpretpretpretpretpretpretpretpretpretcompilerers,典型地,替代品。

JavaScript可用於前端和後端開發。前端通過DOM操作增強用戶體驗,後端通過Node.js處理服務器任務。 1.前端示例:改變網頁文本內容。 2.後端示例:創建Node.js服務器。

選擇Python還是JavaScript應基於職業發展、學習曲線和生態系統:1)職業發展:Python適合數據科學和後端開發,JavaScript適合前端和全棧開發。 2)學習曲線:Python語法簡潔,適合初學者;JavaScript語法靈活。 3)生態系統:Python有豐富的科學計算庫,JavaScript有強大的前端框架。

JavaScript框架的強大之處在於簡化開發、提升用戶體驗和應用性能。選擇框架時應考慮:1.項目規模和復雜度,2.團隊經驗,3.生態系統和社區支持。

引言我知道你可能會覺得奇怪,JavaScript、C 和瀏覽器之間到底有什麼關係?它們之間看似毫無關聯,但實際上,它們在現代網絡開發中扮演著非常重要的角色。今天我們就來深入探討一下這三者之間的緊密聯繫。通過這篇文章,你將了解到JavaScript如何在瀏覽器中運行,C 在瀏覽器引擎中的作用,以及它們如何共同推動網頁的渲染和交互。 JavaScript與瀏覽器的關係我們都知道,JavaScript是前端開發的核心語言,它直接在瀏覽器中運行,讓網頁變得生動有趣。你是否曾經想過,為什麼JavaScr


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

記事本++7.3.1
好用且免費的程式碼編輯器

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

禪工作室 13.0.1
強大的PHP整合開發環境