python處理PDF文件入門(mén)
首先安裝mupdf的包
打開(kāi)文件,如果打開(kāi)不受支持的文件,則PyMuPDF將拋出文件數(shù)據(jù)錯(cuò)誤。
讀取一個(gè)PDF文件,循環(huán)頁(yè)面,讀取內(nèi)容,寫(xiě)入到一個(gè)txt中
get_text(opt,?*,?clip=None,?flags=None,?textpage=None,?sort=False)
參數(shù):
opt?(str) –表示要求的格式的字符串,是上述格式之一。支持大寫(xiě)和小寫(xiě)混合。
在v1.16.3版本中進(jìn)行了修改,現(xiàn)在也接受 "words "和 "blocks "的值。
clip?(rect-like) –?(v1.17.7版新增)將提取的文本限制在這個(gè)矩形范圍內(nèi)。如果沒(méi)有,則提取整個(gè)頁(yè)面的內(nèi)容。對(duì)選項(xiàng) "html"、"xhtml "和 "xml "沒(méi)有影響。
flags?(int) –(v1.16.2版新增)指標(biāo)位,用于控制是否包括圖像或如何處理文本的空白和連字符??捎玫闹笜?biāo)見(jiàn)文本提取標(biāo)志,默認(rèn)設(shè)置見(jiàn)文本提取標(biāo)志默認(rèn)值。
textpage?– (v1.19.0版新增)使用先前創(chuàng)建的TextPage。這大大減少了執(zhí)行時(shí)間:根據(jù)提取選項(xiàng)的不同,可減少50%以上,最高可達(dá)95%。如果指定了,"flags "和 "clip "參數(shù)將被忽略,因?yàn)樗鼈兪侵粚儆谖谋卷?yè)的屬性。如果省略,將創(chuàng)建一個(gè)新的、臨時(shí)的文本頁(yè)。
sort?(bool) – (v1.19.1中的新內(nèi)容)按垂直坐標(biāo)、然后是水平坐標(biāo)對(duì)輸出進(jìn)行排序。在許多情況下,這應(yīng)該足以產(chǎn)生一個(gè) "自然 "的閱讀順序。對(duì)(X)HTML和XML沒(méi)有影響。輸出選項(xiàng) "單詞 "按單詞的bboxes的(y1, x0)排序。對(duì)于 "block"、"dict"、"json"、"rawdict"、"rawjson "也是如此:它們都是按照相應(yīng)塊的bbox的(y1, x0)排序。如果指定為 "text",那么在內(nèi)部則使用 "blocks"。
返回類(lèi)型:str, list, dict
返回:頁(yè)面的內(nèi)容是一個(gè)字符串、一個(gè)列表或一個(gè)字典。詳情請(qǐng)參考相應(yīng)的TextPage方法。
從PDF中提取圖像
page.get_images()? 僅限PDF:返回一個(gè)由頁(yè)面引用的圖像的列表。是Document.get_page_images()的封裝器。
合并PDF文件
將PDF文件與其他類(lèi)型的文件合并
為PDF添加水印
添加水印本質(zhì)上就像在每個(gè)PDF頁(yè)面的底部添加圖像一樣簡(jiǎn)單。應(yīng)該確保圖像具有所需的不透明度和縱橫比,以使其看起來(lái)符合您的需要。在上面的示例中,每個(gè)文件引用都創(chuàng)建了一個(gè)新圖像,但為了提高性能(通過(guò)節(jié)省內(nèi)存和文件大?。搱D像數(shù)據(jù)應(yīng)該只被引用一次 - 請(qǐng)參閱代碼示例和實(shí)現(xiàn)說(shuō)明Page.insert_image()
。
insert_image(rect,?filename=None,?pixmap=None,?stream=None,?mask=None,?rotate=0,?alpha=-1,?oc=0,?xref=0,?keep_proportion=True,?overlay=True)
僅限PDF:在給定的矩形內(nèi)放置一個(gè)圖像。該圖像可能已經(jīng)存在于PDF中,或者是從一個(gè)像素圖、一個(gè)文件或一個(gè)內(nèi)存區(qū)域中獲取。
參數(shù):
rect?(rect_like) – 放置圖像的地方。必須是有限的并且不是空的。
filename?(str) – 圖像文件的名稱(chēng)(MuPDF支持的所有格式,見(jiàn)支持的輸入圖像格式)。
stream?(bytes,bytearray,io.BytesIO) –內(nèi)存中的圖像(MuPDF支持的所有格式--見(jiàn)支持的輸入圖像格式)。在v1.14.13版本中改變了:現(xiàn)在也支持io.BytesIO了。
pixmap?(Pixmap) – 一個(gè)包含圖像的像素圖.
mask?(bytes,bytearray,io.BytesIO) –?(v1.18.1版新增)內(nèi)存中的圖像 - 作為基礎(chǔ)圖像的圖像掩碼(alpha值)。當(dāng)指定時(shí),必須以文件名或流的形式提供基礎(chǔ)圖像,而且不能是已經(jīng)有遮罩的圖像。.
xref?(int) –?(v1.18.13版新增)PDF中已經(jīng)存在的圖像的xref。如果給出,參數(shù)文件名、Pixmap、stream、alpha和?mask
?將被忽略。頁(yè)面將簡(jiǎn)單地接收一個(gè)對(duì)現(xiàn)有圖像的引用。
alpha?(int) –?(在v1.19.3版中改變)已廢棄。不再需要--給定時(shí)被忽略。.
rotate?(int) –(在v1.14.11版本中新增)旋轉(zhuǎn)圖像。必須是90度的整數(shù)倍。正值的旋轉(zhuǎn)是逆時(shí)針旋轉(zhuǎn)。如果你需要任意角度的旋轉(zhuǎn),可以考慮先將圖像轉(zhuǎn)換為PDF(Document.convert_to_pdf()),然后用Page.show_pdf_page()代替。?
oc?(int) – (v1.18.3版新增)(xref)使圖像的可見(jiàn)性依賴(lài)于這個(gè)OCG或OCMD。在多次插入的第一次之后被忽略。該屬性與生成的PDF圖像對(duì)象一起存儲(chǔ),因此在整個(gè)PDF中控制圖像的可見(jiàn)性。
keep_proportion?(bool) –?(v1.14.11版新增)保持圖像的長(zhǎng)寬比。
返回類(lèi)型:int
返回:嵌入圖像的xref。如果再次插入圖像,這可以作為xref參數(shù),獲得非常顯著的性能提升。
旋轉(zhuǎn)PDF?
set_rotation(rotate)?僅限PDF:設(shè)置頁(yè)面的旋轉(zhuǎn)。
參數(shù):
rotate (int) - 一個(gè)整數(shù),指定所需的旋轉(zhuǎn)度數(shù)。必須是90的整數(shù)倍。值將被轉(zhuǎn)換為0、90、180、270中的一個(gè)。
裁剪PDF
要將頁(yè)面裁剪為定義的Rect
set_cropbox(r)??僅限PDF:改變頁(yè)面的可見(jiàn)部分。
參數(shù):
r (rect_like) - 頁(yè)面的新可見(jiàn)區(qū)域。注意,這必須以未旋轉(zhuǎn)的坐標(biāo)指定,不是空的,也不是無(wú)限的,并且完全包含在Page.mediabox中。
附加文件
要將另一個(gè)文件附加到頁(yè)面(相當(dāng)于添加了另一個(gè)文件的鏈接),附件的默認(rèn)圖標(biāo)是“圖釘”,但是您可以通過(guò)設(shè)置參數(shù)來(lái)更改它icon
add_file_annot(pos,?buffer,?filename,?ufilename=None,?desc=None,?icon='PushPin')
參數(shù):
pos?(point_like) – 包含MuPDF提供的 "PushPin "圖標(biāo)的18x18矩形的左上角點(diǎn)。
buffer?(bytes,bytearray,BytesIO) –緩沖區(qū)。要存儲(chǔ)的數(shù)據(jù)(實(shí)際的文件內(nèi)容,任何數(shù)據(jù),等等)。
filename?(str) – 與數(shù)據(jù)有關(guān)的文件名。
ufilename?(str) – 文件名的可選PDF單字節(jié)碼版本。默認(rèn)為文件名。
desc?(str) – 文件的可選描述。默認(rèn)為文件名。
icon?(str) –?v1.16.0版新增)選擇 "PushPin"(默認(rèn))、"Graph"、"Paperclip"、"Tag "中的一個(gè)作為附加數(shù)據(jù)的視覺(jué)符號(hào)。
返回類(lèi)型:Annot
返回:創(chuàng)建的注釋。筆觸顏色黃色=(1,1,0),不支持填充顏色。
嵌入文件
要將文件嵌入文檔,與附加文件一樣,添加文件時(shí)請(qǐng)Document.embfile_add()
注意,第一個(gè)參數(shù)filename
應(yīng)包括實(shí)際文件擴(kuò)展名。
embfile_add(name,?buffer,?filename=None,?ufilename=None,?desc=None)
僅限PDF:嵌入一個(gè)新文件。除名稱(chēng)外,所有的字符串參數(shù)都可以是unicode(在以前的版本中,只有ASCII能正確工作)。文件內(nèi)容將被壓縮(如有好處)。
參數(shù):
name?(str) – 文件名,不能是已有文件。
buffer?(bytes,bytearray,BytesIO) –文件內(nèi)容,現(xiàn)在也支持io.BytesIO。
filename?(str) –可選的文件名。僅限于文檔,如果沒(méi)有,將被設(shè)置為名稱(chēng)。
ufilename?(str) –可選的unicode文件名。僅限文檔,如果沒(méi)有,將被設(shè)置為文件名。
desc?(str) – 可選的描述。僅限文檔,如果沒(méi)有,將被設(shè)置為名稱(chēng)。
返回類(lèi)型:int
返回:該方法現(xiàn)在返回插入的文件的XRef。此外,該文件對(duì)象現(xiàn)在將自動(dòng)獲得基于當(dāng)前日期時(shí)間的PDF鍵/CreationDate和/ModDate。
刪除頁(yè)面
要從文檔中刪除頁(yè)面
要從文檔中刪除多個(gè)頁(yè)面
頁(yè)面索引是從零開(kāi)始的,因此要?jiǎng)h除文檔的第 10 頁(yè),您可以執(zhí)行以下操作doc.delete_page(9)
。
同樣,將刪除第 10 - 15 頁(yè)(含)。doc.delete_pages(from_page=9,?to_page=14)
重新排列頁(yè)面
復(fù)制頁(yè)面
選擇頁(yè)面
使用PyMuPDF,您可以使用所有選項(xiàng)來(lái)復(fù)制、移動(dòng)、刪除或重新排列PDF的頁(yè)面。存在允許您逐頁(yè)執(zhí)行此操作的直觀方法,例如方法Document.copy_page()
。
或者,您也可以準(zhǔn)備一個(gè)完整的Python序列形式的新頁(yè)面布局,其中包含您想要的頁(yè)碼、您想要的順序以及您想要的每頁(yè)次數(shù)。以下可以說(shuō)明可以做什么Document.select()
doc.select([1, 1, 1, 5, 4, 9, 9, 9, 0, 2, 2, 2])
現(xiàn)在讓我們準(zhǔn)備一個(gè)雙面打印的 PDF(在不直接支持此功能的打印機(jī)上):
頁(yè)數(shù)由len(doc)
(等于doc.page_count
)給出。以下列表分別表示偶數(shù)頁(yè)碼和奇數(shù)頁(yè)碼:
p_even = [p in range(doc.page_count) if p % 2 == 0]
p_odd? = [p in range(doc.page_count) if p % 2 == 1]
此代碼段創(chuàng)建了相應(yīng)的子文檔,然后可用于打印文檔:
以下示例將反轉(zhuǎn)所有頁(yè)面的順序
此代碼段將 PDF 與自身復(fù)制,以便它將包含頁(yè)面0、1、...、n、0、1、...、n?(速度非常快,并且不會(huì)顯著增加文件大小?。?/p>
添加空白頁(yè)
使用它來(lái)創(chuàng)建具有另一種預(yù)定義紙張格式的頁(yè)面:
便利功能paper_size()
知道 40 多種行業(yè)標(biāo)準(zhǔn)紙張格式可供選擇。將所需的字典鍵傳遞給以paper_size()
檢索紙張尺寸。支持大小寫(xiě)。如果將“-L”附加到格式名稱(chēng),則返回橫向版本。
paper_size(s)
返回已知紙張格式代碼的寬度和高度的便捷函數(shù)。對(duì)于標(biāo)準(zhǔn)分辨率 72 像素 = 1 英寸,這些值以像素為單位給出。
當(dāng)前定義的格式包括'A0'到'A10'、'B0'到'B10'、'C0'到'C10'、'Card-4x6'、'Card-5x7'、'Commercial'、'Executive'、'Invoice '、'Ledger'、'Legal'、'Legal-13'、'Letter'、'Monarch'和'Tabloid-Extra',每個(gè)都采用縱向或橫向格式。
格式名稱(chēng)必須作為字符串提供(區(qū)分大小寫(xiě)),可以選擇使用“-L”(橫向)或“-P”(縱向)作為后綴。沒(méi)有后綴默認(rèn)為縱向。
參數(shù):
s?(?str?) – 上面的任何格式名稱(chēng),大寫(xiě)或小寫(xiě),如“A4”或“l(fā)etter-l”。
返回類(lèi)型:元組
返回:紙張格式的(寬度,高度) 。對(duì)于未知格式,返回(-1, -1) 。示例:fitz.paper_size(“A4”)返回(595, 842)和fitz.paper_size(“l(fā)etter-l”)返回(792, 612)。
插入帶有文本內(nèi)容的頁(yè)面
使用該Document.insert_page()
方法還會(huì)插入一個(gè)新頁(yè)面并接受相同的width
參數(shù)height
。但它還允許您將任意文本插入新頁(yè)面并返回插入的行數(shù)。
文本參數(shù)可以是一個(gè)(序列)字符串(假設(shè)為 UTF-8 編碼)。插入將從點(diǎn)(50, 72)開(kāi)始,該點(diǎn)位于頁(yè)面頂部下方一英寸處,距離左側(cè) 50 點(diǎn)。返回插入的文本行數(shù)。
insert_page(pno,?text=None,?fontsize=11,?width=595,?height=842,?fontname='helv',?fontfile=None,?color=None)
僅限PDF:插入一個(gè)新頁(yè)并插入一些文本。方便的函數(shù),結(jié)合了Document.new_page()和Page.insert_text()的部分。
參數(shù):
pno?(int) –要插入的頁(yè)數(shù)(基數(shù)0)。必須在(-1, doc.page_count + 1)范圍內(nèi)。特殊值-1和doc.page_count在最后一頁(yè)之后插入。
返回類(lèi)型:int
返回:Page.insert_text()的結(jié)果(成功插入的行數(shù))
拆分單個(gè)頁(yè)面
這涉及將PDF頁(yè)面分成任意部分。例如,您可能有一個(gè)包含Letter格式頁(yè)面的PDF,您想要以四倍的放大倍數(shù)打?。好總€(gè)頁(yè)面被分成 4 個(gè)部分,每個(gè)部分再次以Letter格式進(jìn)入一個(gè)單獨(dú)的PDF頁(yè)面。
示例:

合并單個(gè)頁(yè)面
連接PDF頁(yè)面以形成一個(gè)新的PDF,每個(gè)頁(yè)面包含兩個(gè)或四個(gè)原始頁(yè)面(也稱(chēng)為“2-up”、“4-up”等)。這可用于創(chuàng)建小冊(cè)子或類(lèi)似縮略圖的概覽。
示例:

PDF加密解密
從 1.16.0 版本開(kāi)始,完全支持PDF解密和加密(使用密碼)。您可以執(zhí)行以下操作:
檢查文檔是否受密碼保護(hù)/(仍)加密(
Document.needs_pass
,?Document.is_encrypted
)。獲得文檔的訪問(wèn)權(quán)限 (?
Document.authenticate()
)。Document.save()
使用或Document.write()
和設(shè)置 PDF 文件的加密細(xì)節(jié)
以下代碼片段創(chuàng)建一個(gè)新的PDF并使用單獨(dú)的用戶和所有者密碼對(duì)其進(jìn)行加密。授予打印、復(fù)制和注釋的權(quán)限,但不允許使用用戶密碼進(jìn)行身份驗(yàn)證的人進(jìn)行任何更改。