Python中的MuPDF的使用
因?yàn)镸uPDF不僅支持 PDF,還支持 XPS、OpenXPS、CBZ、CBR、FB2 和 EPUB 格式,因此 PyMuPDF?也支持。盡管如此,為了簡(jiǎn)潔起見,我們將只討論 PDF 文件。在確實(shí)只支持 PDF 文件的地方,將明確提及這一點(diǎn)。
查看mupdf版本
該庫(kù)的頂級(jí) Python 導(dǎo)入名稱是“fitz”。這是有歷史原因的:
MuPDF 的原始渲染庫(kù)稱為L(zhǎng)ibart。
“在 Artifex Software 收購(gòu) MuPDF 項(xiàng)目后,開發(fā)重點(diǎn)轉(zhuǎn)移到編寫一個(gè)名為“Fitz”的新現(xiàn)代圖形庫(kù)上。Fitz 最初是作為一個(gè)研發(fā)項(xiàng)目來取代老化的 Ghostscript 圖形庫(kù),但現(xiàn)在卻成為了支持 MuPDF 的渲染引擎?!?/p>
打開文檔
方法/屬性? ? ? ? ? ? ? ? ? ? ? ? ? ? ??描述
Document.page_count? ?
頁(yè)數(shù) (?int?)
Document.metadata? ??
元數(shù)據(jù)(字典)
Document.get_toc()? ??
獲取目錄(列表)
Document.load_page()? ?
閱讀一頁(yè)
訪問元數(shù)據(jù)
PyMuPDF 完全支持標(biāo)準(zhǔn)元數(shù)據(jù),Document.metadata
是具有以下鍵的 Python 字典。它適用于所有文檔類型,但并非所有條目都可能始終包含數(shù)據(jù)。
Key? ? ? ? ? ? ? ? ?Value
producer? ? ? ? producer (producing software)
format? ? ? ? ? ? format: ‘PDF-1.4’, ‘EPUB’, etc.
encryption? ? ? encryption method used if any
author? ? ? ? ? ? author
modDate? ? ? ? date of last modification
keywords? ? ? ? keywords
title? ? ? ? ? ? ? ? ? title
creationDate? ? date of creation
creator? ? ? ? ? ? ?creating application
subject? ? ? ? ? ? ?subject
使用大綱
獲取文檔所有大綱(也稱為“書簽”)的最簡(jiǎn)單方法是加載其目錄:
這將返回一個(gè)列表[[lvl, title, page, …], …]的 Python 列表,它看起來很像書籍中的常規(guī)目錄。
lvl是條目的層級(jí)(從 1 開始),title是條目的標(biāo)題,page 是頁(yè)碼(從 1 開始?。?。其他參數(shù)描述書簽?zāi)繕?biāo)的詳細(xì)信息。
使用頁(yè)面
頁(yè)面處理是 MuPDF 功能的核心。
您可以將頁(yè)面呈現(xiàn)為光柵或矢量 (SVG) 圖像,可選擇對(duì)其進(jìn)行縮放、旋轉(zhuǎn)、移動(dòng)或剪切。
您可以提取多種格式的頁(yè)面文本和圖像并搜索文本字符串。
對(duì)于 PDF 文檔,可以使用更多方法向頁(yè)面添加文本或圖像。
首先,必須創(chuàng)建一個(gè)頁(yè)面。這是Document的一種方法:
這里可以是任何整數(shù)。負(fù)數(shù)從末尾倒數(shù),所以doc[-1]是最后一頁(yè),就像 Python 序列一樣。-∞?<?pno?<?page_count
一些更高級(jí)的方法是將文檔用作其頁(yè)面上的迭代器:
檢查頁(yè)面的鏈接、注釋或表單字段
使用某些查看器軟件顯示文檔時(shí),鏈接顯示為“熱點(diǎn)區(qū)域”。如果您在光標(biāo)顯示手形符號(hào)時(shí)單擊,您通常會(huì)被帶到該熱點(diǎn)區(qū)域中編碼的目標(biāo)。以下是獲取所有鏈接的方法:
links是一個(gè) Python 字典列表。有關(guān)詳細(xì)信息,請(qǐng)參閱Page.get_links()
。
您還可以使用一次發(fā)出一個(gè)鏈接的迭代器:
如果處理 PDF 文檔頁(yè)面,可能還存在注釋 (?Annot?) 或表單字段 (?Widget?),每個(gè)都有自己的迭代器:
呈現(xiàn)頁(yè)面
此示例創(chuàng)建頁(yè)面內(nèi)容的光柵圖像:
pix是一個(gè)Pixmap對(duì)象,它(在本例中)包含頁(yè)面的RGB圖像,可用于多種用途。方法Page.get_pixmap()
提供了許多用于控制圖像的變體:分辨率/DPI、色彩空間(例如生成灰度圖像或具有減色方案的圖像)、透明度、旋轉(zhuǎn)、鏡像、移動(dòng)、剪切等。例如:創(chuàng)建一個(gè)RGBA圖像(即包含 alpha 通道),指定pix = page.get_pixmap(alpha=True)。
Pixmap包含下面引用的許多方法和屬性。其中包括整數(shù)width、height(每個(gè)以像素為單位)和stride(一個(gè)水平圖像行的字節(jié)數(shù))。屬性樣本代表代表圖像數(shù)據(jù)(Python字節(jié)對(duì)象)的矩形字節(jié)區(qū)域。
將頁(yè)面圖像保存在文件中
可以簡(jiǎn)單地將圖像存儲(chǔ)在 PNG 文件中:
在 GUI 中顯示圖像
QtQImage
幸運(yùn)地支持原生 Python 指針,因此以下是創(chuàng)建 Qt 圖像的推薦方法:
提取文本和圖像
我們還可以以多種不同的形式和詳細(xì)程度提取頁(yè)面的所有文本、圖像和其他信息:
搜索文本
您可以找出特定文本字符串在頁(yè)面上的確切位置:
這提供了一個(gè)矩形列表(請(qǐng)參閱Rect),每個(gè)矩形都圍繞著一次出現(xiàn)的字符串“mupdf”(不區(qū)分大小寫)。您可以使用此信息來突出顯示這些區(qū)域(僅限 PDF)或創(chuàng)建文檔的交叉引用。
從HTML源代碼生成PDF
Stories?提供了一種方法,可以輕松地布局用于設(shè)備的風(fēng)格化內(nèi)容,例如Document Writers(......)所提供的內(nèi)容。最多會(huì)考慮來自三個(gè)不同信息源的輸入。所有這些項(xiàng)目都是可選的。
HTML 源代碼,可以是 Python 字符串,也可以是腳本使用Xml的方法創(chuàng)建的。
CSS(級(jí)聯(lián)樣式表)源代碼,以 Python 字符串形式提供。CSS 可用于提供樣式信息(文本字體大小、顏色等),就像網(wǎng)頁(yè)一樣。顯然,這個(gè)字符串也可能是從文件中讀取的。
每當(dāng) DOM 引用圖像或使用除標(biāo)準(zhǔn)PDF Base 14 字體、CJK 字體和生成到 PyMuPDF 二進(jìn)制文件中的 NOTO 字體之外的文本字體時(shí),都必須使用資源文件。
不需要提供語(yǔ)法完整的 HTML 文檔:完全接受html片段,并且許多/大多數(shù)語(yǔ)法錯(cuò)誤會(huì)自動(dòng)更正。在 HTML 被認(rèn)為完成后,它可以用于創(chuàng)建 PDF 文檔。這是通過新的DocumentWriter類發(fā)生的。程序員調(diào)用它的方法來創(chuàng)建一個(gè)新的空白頁(yè)面,并將矩形傳遞給 Story 以填充它們。
PDF維護(hù)
PDF 是唯一可以使用 PyMuPDF修改的文檔類型。其他文件類型是只讀的。
但是,您可以將任何文檔(包括圖像)轉(zhuǎn)換為 PDF,然后將所有 PyMuPDF 功能應(yīng)用于轉(zhuǎn)換結(jié)果。
Document.save()
始終將 PDF 以其當(dāng)前(可能已修改)狀態(tài)存儲(chǔ)在磁盤上。
您通??梢赃x擇是保存到新文件,還是僅將修改附加到現(xiàn)有文件(“增量保存”),這通常要快得多。
合并和拆分 PDF 文檔
保存
Document.save()
將始終以當(dāng)前狀態(tài)保存文檔??梢酝ㄟ^指定選項(xiàng)incremental=True將更改寫回原始 PDF。這個(gè)過程(通常)非常快,因?yàn)楦氖歉郊拥皆嘉募皇峭耆貙懰?/p>
Document.save()
options 對(duì)應(yīng)于 MuPDF 的命令行工具mutool clean的選項(xiàng),見下表。
Save Option? ? ?mutool? ? ? Effect
garbage=1? ? ? ?g? ? ? ? ? ? ? ?垃圾收集未使用的對(duì)象
garbage=2? ? ? ?gg? ? ? ? ? ? ?在1 的基礎(chǔ)上,緊湊型xref
表
garbage=3? ? ? ?ggg? ? ? ? ? ?在2?的基礎(chǔ)上, 合并重復(fù)對(duì)象
garbage=4? ? ? ?gggg? ? ? ? ?在3?的基礎(chǔ)上, 合并重復(fù)的流內(nèi)容
clean=True? ? ? cs? ? ? ? ? ? ? 清潔和消毒內(nèi)容流
deflate=True? ? z? ? ? ? ? ? ? ? 縮小未壓縮的流
deflate_images=True? i? ? ? 縮小圖像流
deflate_fonts=True? ? ?f? ? ? ?縮小字體文件流
ascii=True? ? ? ?a? ? ? ? ? ? ? ? ?將二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為 ASCII 格式
linear=True? ? ? l? ? ? ? ? ? ? ? ? 創(chuàng)建一個(gè)線性化版本
expand=True? ?d? ? ? ? ? ? ? ? ?解壓縮所有流
例如,mutool clean -ggggz file.pdf會(huì)產(chǎn)生出色的壓縮結(jié)果。它對(duì)應(yīng)于doc.save(filename, garbage=4, deflate=True)。
關(guān)閉
在程序繼續(xù)運(yùn)行的同時(shí),通常需要“關(guān)閉”文檔以將對(duì)底層文件的控制權(quán)交給操作系統(tǒng)。
這可以通過該方法來實(shí)現(xiàn)Document.close()
。除了關(guān)閉底層文件外,與文檔關(guān)聯(lián)的緩沖區(qū)也將被釋放。