Python工具箱系列(四十六)

PDF(Portable Document Format)是一種便攜文檔格式,它基于PostScripty這種腳本語言。

??

PDF文檔操作

PDF(Portable Document Format)是一種便攜文檔格式,它基于PostScripty這種腳本語言,它是第一個獨立于設備的頁面描述語言。pdf格式是與平臺無關,獨立于底層操作系統和渲染引擎。由于PDF文檔遵循標準格式,相關生態建設完善,應用廣泛,非常值得花費時間討論使用python進行操作。


?

python中能夠操作pdf格式文檔的庫有:
?

◆PyMuPDF

◆pikepdf

◆pdfplumber

◆ReportLab

◆borb

主攻方向稍有不同,大致分類是:
?

◆pikepdf專注對已經存在的PDF的操作,例如分割、合并、旋轉等

◆pdfplumber專注PDF內容提取,例如文本(位置、字體及顏色等)和形狀(矩形、直線、曲線),此外還能夠解析表格

◆ReportLab專注PDF頁面內容(文本、圖、表等)的創建

◆PyMuPDF和borb同時支持讀、寫及PDF頁面操作,功能最為全面

◆borb是較新的庫,功能也較為完善,但經過筆者試用,對于中文的支持不好

PyMuPDF的基本功能全面,非常適應用于批處理PDF。使用python來操作PDF/WORD/EXCEL/PPT等類文檔,應該有如下的期望:

◆進行創作是非常不稱手的。為何不用Office提供的工具軟件進行編輯創作呢。因此,不能夠指望這類庫以及python提供非常全面完善的能力

◆能夠在原來文檔的基礎上,進行批量化的一些操作。例如,可以基于某個模板,批量得制作邀請函,只要簡單得修改姓名即可。或者根據數據庫中的內容,在模板的基礎上,定期形成周報、月報類固定格式的文檔

◆能夠在原來文檔的基礎上,增加、刪除以及調整圖片、文字與頁面布局

所以,下述代碼均從已經存在的內容入手進行演示:
?

01.

圖片處理

timport os
import fitzprint(fitz.__doc__)def export2png(filename,pageno):"""將pdf文件指定頁(從0開始算)導出為PNG圖片文件Args:filename (string): PDF文件名pageno (int): 頁號(從0開始)"""with fitz.open(filename) as doc:page = doc[pageno]pix = page.get_pixmap()  pix.save("page-%i.png" % pageno)def export2svg(filename,pageno):"""將pdf文件指定頁(從0開始算)導出為SVG矢量圖Args:filename (string): PDF文件名pageno (int): 頁號(從0開始)"""with fitz.open(filename) as doc:page = doc[pageno]svg = page.get_svg_image(matrix=fitz.Identity)output = open("page-%i.svg" % pageno,'w')output.write(svg)output.close()def figs2pdf(filename,startdir):"""將指定目錄下的所有圖片文件合并成為PDF文件Args:filename (string): 未來要生成的PDF文件名稱startdir (string): 圖片所在目錄"""doc = fitz.open()# 列出目錄下所有文件imglist = os.listdir(startdir) imglist.sort() for _, f in enumerate(imglist):# 遍歷并且打開每個圖片文件img = fitz.open(os.path.join(startdir, f))# 計算圖片大小rect = img[0].rectpdfbytes = img.convert_to_pdf()img.close()# 將圖片文件貼合到PDF頁上imgPDF = fitz.open("pdf", pdfbytes) page = doc.new_page(width = rect.width,height = rect.height) page.show_pdf_page(rect, imgPDF, 0)# 保存到目標PDF中doc.save(filename) def convert(inputfile,outputfile):"""對圖片格式進行轉換Args:inputfile (string): 源圖片outputfile (string): 目標圖片"""pix = fitz.Pixmap(inputfile)pix.save(outputfile)       pdfname = r'd:\test\sed.pdf'figs2pdf(r'd:\test\demo.pdf',r'D:\test\all\figures')export2png(pdfname,10)
export2svg(pdfname,10)convert(r"D:\test\all\serial1\000000.gif",r'd:\test\0.psd')
convert(r"D:\test\all\serial1\000000.jpg",r'd:\est\1.png')

上述代碼演示了合并圖片與分解PDF到圖片,轉換圖片格式等功能。

?其中figs2pdf函數完成了從指定目錄的多個圖片合成一個PDF文件的常用功能。相對復雜一些。

?pymupdf也提供了逆向生成圖片的方法。

?export2png將指定PDF文件的指定頁轉換成為PNG文件,效果比截圖好

?export2svg將指定PDF文件的指定頁轉換成為svg文件,而SVG文件是矢量圖、能夠編輯,這個功能更是強大

?convert函數能夠將多種圖片格式進行轉換。代碼演示了轉換成為psd與png格式。當然這些功能是pymupdf贈送的功能,不能夠與pillow等專業庫相比

下面的代碼演示如何從pdf中提取文字,以及獲得PDF文檔中的各類鏈接。

import fitzdef showmeta(filename):"""顯示PDF的基本信息Args:filename (string): 要打開的PDF文件名稱"""print(fitz.__doc__)doc = fitz.open(filename)print(doc.page_count)print(doc.metadata)def showlinks(filename):"""顯示PDF中的所有超鏈Args:filename (string): 要打開的PDF文件名稱"""with fitz.open(filename) as doc:for page in doc:for link in page.links():# 顯示一個列表if link["kind"] == fitz.LINK_GOTO:print("Jump to page", link["page"] + 1)elif link["kind"] in (fitz.LINK_GOTOR, fitz.LINK_LAUNCH):print("Open or launch file", link["file"])elif link["kind"] == fitz.LINK_URI:print("Open URI", link["uri"])def showtext(filename, pageno, option='text'):"""顯示pdf中的文字Args:filename (string): 要打開的PDF文件名稱pageno (int): 頁號option (選項): 可能是'text','block'等Returns:list: 所有的文字列表"""with fitz.open(filename) as doc:page = doc[pageno]return page.get_text(option)def searchtext(filename, pageno, searchstr):"""在pdf中搜尋文字Args:filename (string): 要打開的PDF文件名稱pageno (int): 頁號searchstr (string): 要搜索的內容Returns:list: 匹配文字所在的區域列表。"""with fitz.open(filename) as doc:page = doc[pageno]areas = page.search_for(searchstr)return areaspdfname = r'd:\test\阿里技術地圖.pdf'print(showtext(pdfname, 9))
areas = searchtext(pdfname, 1, '數據挖掘')
for rect in areas:print(rect)
showlinks(pdfname)

以上代碼中:

?showtext需要傳遞相關的選項。pymupdf可以提取多種類型的文字。具體可以參考

?searchtext函數的返回與通常的預期不同,返回的是多個區域所形成的列表。主要用途是為了相關的工具軟件顯示用,例如可以高亮等。如果用這個函數只是期待返回具體的文字內容的話,不妨直接獲得文字,然后再使用字符串的搜索功能。

?showlinks函數直接獲得了所有頁上所有的鏈接。大部分鏈接是內部的跳轉,也有使用編輯軟件加入的外部超鏈。文字內的包含的URL使用pymupdf是找不到的,必須自己寫函數對字符串進行語議分析才能夠獲得,這個也是pymupdf不完善的地方。

除了上述對PDF本身的操作外,還有從PDF到DOCX文檔的雙向轉換需要。由DOCX文檔轉PDF文檔非常容易,直接在WORD中選擇打印或者導出即可,沒有什么可以討論的。但是反過來稍微困難些,可以考慮以下方法:

?直接用WORD打開PDF,然后另存為DOCX文檔。

?使用pdf2docx轉化

?使用python-office轉化

pdf2docx是一個輕量級的第三方庫,對中文的支持不錯,本身是基于pymupdf庫發展起來的,它的安裝過程如下。

pip install pdf2docx
# upgrade
pip install --upgrade pdf2docx

《阿里的技術地圖》這個PDF可以從網上下載到,內容比較豐富,值得一看。如果想要轉換成為WORD文檔,示例代碼如下。

from pdf2docx import Converterinputfilename = r'd:\test\阿里技術地圖.pdf'
outputfilename = r'd:\test\demo.docx'cv = Converter(inputfilename)
# 將PDF全部內容轉換成為DOCX
cv.convert(outputfilename)
cv.close()cv = Converter(inputfilename)
# 將PDF部分頁轉換為DOCX
cv.convert(outputfilename,start=3,end=5)
cv.close()cv = Converter(inputfilename)
# 將PDF個別頁轉換為DOCX
cv.convert(outputfilename,pages=[10,16,8])
cv.close()

這個庫轉換速度不是太快,還提供了多進程的功能,但實際使用時會有BUG出現,不建議使用。
?


?

END

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/166206.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/166206.shtml
英文地址,請注明出處:http://en.pswp.cn/news/166206.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

清華大學提出全新加速訓練大模型方法SoT

近日,微軟研究和清華大學的研究人員共同提出了一種名為“Skeleton-of-Thought(SoT)”的全新人工智能方法,旨在解決大型語言模型(LLMs)生成速度較慢的問題。 盡管像GPT-4和LLaMA等LLMs在技術領域產生了深遠影響,但其處…

提供電商數據|帶你簡單認識天貓API接口相關參數文檔調用說明

什么是API接口 API接口(Application Programming Interface Interface)是應用程序與開發人員或其他程序互相通信的方式。它允許開發者訪問應用程序的數據和功能。 API接口,軟件的“握手”與“交流”之道,軟件世界的“好基友”。想讓軟件聊得來?想開發App卻無從下手?API來相救…

【騰訊云云上實驗室-向量數據庫】Tencent Cloud VectorDB為非結構化數據查詢插上飛翔的翅膀——以企業知識庫為例

前言 以前我曾疑惑,對于非結構化的內容,如一張圖片或一段視頻,如何實現搜索呢?圖片或視頻作為二進制文件,我們如何將其轉化為可搜索的數據并存儲起來,然后在搜索時將其還原呢? 后來我發現&…

5個高防CDN的特點

1. 支持泛解析自定義HTTPS/SSL隱藏源IP。 2. 支持緩存加速永久在線SEO優化。當網站原服務器宕機時,如果開啟了此功能,用戶仍然可以訪問網站(用戶看到的是 緩存數據),從而達到了網站永不中斷服務的效果,可以…

Minio8版本沖突問題

今天在配置minio的時候遇到了一個報錯 Error starting ApplicationContext. To display the conditions report re-run your application with debug enabled. 2023-11-24 10:31:42.897 ERROR 14312 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter : *******************…

blk_mq_init_queue函數學習記錄

blk-mq編程,主要要調用兩個函數進行初始化工作,blk_mq_init_queue這是第二個。該函數先是申請了struct request_queue結構,這個請求隊列后面用于賦值給磁盤那個結構體的相應成員。 struct request_queue *blk_mq_init_queue(struct blk_mq_t…

python3到文件的讀取以及輸出

excel表格的讀取和輸入輸出 python中txt的讀取和輸入輸出 txt輸出報錯👇 UnicodeEncodeError: ascii codec cant encode characters in position 154-157: ordinal not in range(128)解決方法

Tomcat 配置

1: 打開 2:選擇版本號,我這邊是 1.7 3:添加 web 4: 添加jar包 5:添加 6:添加 Tomcat

【每日一題】1410. HTML實體解析器-2023.11.23

題目: 1410. HTML 實體解析器 「HTML 實體解析器」 是一種特殊的解析器,它將 HTML 代碼作為輸入,并用字符本身替換掉所有這些特殊的字符實體。 HTML 里這些特殊字符和它們對應的字符實體包括: 雙引號:字符實體為 &…

vim翻頁快捷鍵

Vim翻頁 整頁 Ctrlf向下翻頁,下一頁,相當于Page DownCtrlb向上翻頁,上一頁,相當于Page Up 半頁 Ctrld向下半頁,下一半頁,光標下移Ctrlu向上半頁,上衣半頁,光標上移 按行 Ctrle…

vue2【組件的構成】

目錄 1:什么是組件化開發 2:vue中的組件化開發 3:vue組件的三個組成部分 4:組件中定義方法,監聽器,過濾器,計算屬性節點。 5:template中只允許唯一根節點,style默認…

OpenMLDB SQL 開發調試神器 - OpenMLDB SQL Emulator

今天為大家介紹一款來自 OpenMLDB 社區的優秀獨立工具 - OpenMLDB SQL Simulator(https://github.com/vagetablechicken/OpenMLDBSQLEmulator) ,可以讓你更加高效方便的開發、調試 OpenMLDB SQL。 為了高效的實現時序特征計算,Op…

高質量短效SOCKS5代理IP是什么意思?作為技術你了解嗎

小張是一位網絡安全技術測試員,最近他接到了一個頭疼的任務,那就是評估公司系統的安全性,因此他前來咨詢,在得知SOCKS5代理IP可以幫他之后,他不禁產生疑問,這是什么原理?其實和小張一樣的朋友不…

命令查詢職責分離 (CQRS)

CQRS 的最初需求 多年來,傳統的 CRUD(創建、讀取、更新、刪除)模式一直是系統架構的支柱。在 CRUD 中,讀取和寫入操作通常由相同的數據模型和相同的數據庫模式處理。雖然這種方法簡單直觀,但隨著系統規模的擴大和需求…

第99步 深度學習圖像目標檢測:SSDlite建模

基于WIN10的64位系統演示 一、寫在前面 本期,我們繼續學習深度學習圖像目標檢測系列,SSD(Single Shot MultiBox Detector)模型的后續版本,SSDlite模型。 二、SSDlite簡介 SSDLite 是 SSD 模型的一個變種&#xff0c…

竹云參編《公共數據授權運營平臺技術要求》團體標準正式發布

2023年11月23日,第二屆全球數字貿易博覽會“數據要素治理與市場化論壇”于杭州成功召開,國家數據局黨組書記、局長劉烈宏,浙江省委常委、常務副省長徐文光出席會議并致辭。會上,國家工業信息安全發展研究中心發布并解讀了我國首部…

[Linux] 馮諾依曼體系結構 與 操作系統

文章目錄 1、馮諾依曼體系結構2、操作系統 1、馮諾依曼體系結構 馮諾依曼結構也稱普林斯頓結構,是一種將程序指令存儲器和數據存儲器合并在一起的存儲器結構。程序指令存儲地址和數據存儲地址指向同一個存儲器的不同物理位置,因此程序指令和數據的寬度相…

【鴻蒙應用ArkTS開發系列】- 云開發入門實戰二 實現省市地區三級聯動地址選擇器組件(下)

文章目錄 概述端云調用流程端側集成AGC SDK端側省市地區聯動的地址選擇器組件開發創建省市數據模型創建省市地區視圖UI子組件創建頁面UI視圖Page文件 打包測試總結 概述 我們在前面的課程,對云開發的入門做了介紹,以及使用一個省市地區聯動的地址選擇器…

三次輸錯密碼后,系統是怎么做到不讓我繼續嘗試的?

1故事背景 忘記密碼這件事,相信絕大多數人都遇到過,輸一次錯一次,錯到幾次以上,就不允許你繼續嘗試了。 但當你嘗試重置密碼,又發現新密碼不能和原密碼重復: 圖片 相信此刻心情只能用一張圖形容&#xf…

Mobaxterm 使用lrzsz傳輸文件(rz/sz)

Mobaxterm 使用lrzsz傳輸文件報錯 1. 現象 最近從xshell切換到Mobaxterm其他一切正常,就是使用rz傳輸文件時會出現錯誤,比較苦惱. 會出現以下錯誤 [rootcentos7 rpmbuild]# rz ?CCCCCCCCCCC23be50ive.**B0100000023be502. 解決方法 去官網(https://mobaxterm.mobatek.net…