Java开发者的Python快速实战指南:实用工具之PDF转DOCX文档(可视化界面)
首先,大家對(duì)Python語(yǔ)法的了解已經(jīng)基本完成,現(xiàn)在我們需要開(kāi)始進(jìn)行各種練習(xí)。我為大家準(zhǔn)備了一些練習(xí)題目,比如之前的向量數(shù)據(jù)庫(kù)等,這些題目可以參考第三方的SDK來(lái)進(jìn)行操作,文檔也是比較完善的。這個(gè)過(guò)程有點(diǎn)像我們之前使用Java對(duì)接第三方接口的方式,所以今天我想開(kāi)發(fā)一個(gè)很實(shí)用的工具類,用于將PDF轉(zhuǎn)換為DOCX文檔。我覺(jué)得這個(gè)工具非常實(shí)用,所以通過(guò)這個(gè)項(xiàng)目,我想帶領(lǐng)那些在Python基礎(chǔ)上還比較薄弱的同學(xué)們從零開(kāi)始,一起完成這個(gè)項(xiàng)目。
首先,我也剛開(kāi)始接觸這個(gè)項(xiàng)目,所以我并不知道如何實(shí)現(xiàn)。我的第一反應(yīng)是去搜索引擎上查找是否有其他人已經(jīng)實(shí)現(xiàn)了類似的功能,因?yàn)楝F(xiàn)在有很多優(yōu)秀的開(kāi)源項(xiàng)目可供參考。畢竟,站在巨人的肩膀上進(jìn)行開(kāi)發(fā)并不可恥,而是一種聰明的做法。
幸運(yùn)的是,我找到了一個(gè)名為"pdf2docx"的第三方包,它提供了非常優(yōu)秀的功能。令人驚訝的是,僅僅幾行代碼就可以完成PDF轉(zhuǎn)換為DOCX的工作。而且,轉(zhuǎn)換結(jié)果也非常出色。讓我們來(lái)看一下具體的實(shí)現(xiàn)過(guò)程。
希望大家可以去倉(cāng)庫(kù)中查看源碼,學(xué)習(xí)如何使用這個(gè)工具包,也歡迎大家在倉(cāng)庫(kù)中留言,提出任何問(wèn)題或建議。一起進(jìn)步,共同學(xué)習(xí)!倉(cāng)庫(kù)地址為:https://github.com/StudiousXiaoYu/pdf2docx_with_ui
PDF轉(zhuǎn)DOCX文檔
第三方包:pdf2docx
from pdf2docx import Converter
def convert_pdf_to_docx(pdf_path, docx_path):
# 創(chuàng)建一個(gè)轉(zhuǎn)換器對(duì)象
converter = Converter(pdf_path)
# 將PDF轉(zhuǎn)換為DOCX
converter.convert(docx_path, start=0, end=None)
# 關(guān)閉轉(zhuǎn)換器
converter.close()
# 調(diào)用函數(shù)進(jìn)行轉(zhuǎn)換
pdf_path = "input.pdf"
docx_path = "output.docx"
convert_pdf_to_docx(pdf_path, docx_path)
他很容易理解,只需要你定義好文件路徑即可完成轉(zhuǎn)換操作。此外,我也不多解釋了,因?yàn)閟tart參數(shù)用于指定轉(zhuǎn)換的起始頁(yè)碼,而end參數(shù)用于指定轉(zhuǎn)換的結(jié)束頁(yè)碼。你可以根據(jù)需要設(shè)置這兩個(gè)參數(shù)的值,如果不需要指定起始頁(yè)碼,可以將start參數(shù)設(shè)置為0;如果不需要指定結(jié)束頁(yè)碼,則可以將end參數(shù)設(shè)置為None。
官方可視化界面
代碼很簡(jiǎn)單,但是如果是自己使用的話,每次都要寫一次路徑可能會(huì)很麻煩。不過(guò)你可以使用一個(gè)可視化交互界面來(lái)簡(jiǎn)化這個(gè)過(guò)程,這樣會(huì)更方便一些。幸運(yùn)的是,pdf2docx提供了一個(gè)簡(jiǎn)易版的界面,你可以在控制臺(tái)中直接輸入"pdf2docx gui"來(lái)啟動(dòng)。在界面中,你只需要選擇要轉(zhuǎn)換的PDF文件和一個(gè)文件夾作為保存路徑,就可以完成轉(zhuǎn)換操作了。這樣的話,你就不需要每次都手動(dòng)輸入路徑了。非常方便。
簡(jiǎn)易版可交互界面
但是,如果你對(duì)pdf2docx提供的界面不滿意,并且覺(jué)得界面不夠好看,那么可以考慮使用另一個(gè)第三方界面庫(kù),叫做gradio。我記得你之前在向量數(shù)據(jù)庫(kù)中使用過(guò)這個(gè)庫(kù),對(duì)后端非常友好。你可以先寫一個(gè)簡(jiǎn)單的界面,然后逐步優(yōu)化它,以滿足你的需求。gradio提供了很多功能和自定義選項(xiàng),你可以根據(jù)自己的喜好來(lái)設(shè)計(jì)界面的外觀和交互方式。然后慢慢優(yōu)化吧。
import gradio as gr
from pdf2docx import Converter
def convert_pdf_to_docx_with_display(pdf_file):
tmp_file = "./output.docx"
# Convert PDF to DOCX
cv = Converter(pdf_file)
cv.convert(tmp_file)
cv.close()
return tmp_file
def convert_and_display_pdf_to_docx(pdf_file):
docx_file = convert_pdf_to_docx_with_display(pdf_file)
return docx_file
iface = gr.Interface(
fn=convert_and_display_pdf_to_docx,
inputs=["file"],
outputs=["file"],
title="[努力的小雨] PDF to DOCX Converter",
description="上傳pdf文件,并將其轉(zhuǎn)化為docx文件",
)
iface.launch()
恩恩,我看著是相當(dāng)不錯(cuò)的,這個(gè)小工具已經(jīng)可以滿足用戶的需求了。效果圖,你可以看看:
優(yōu)化版界面
好的,目前可交互的資源還相對(duì)較少。然而,如果我們能夠提前預(yù)覽解析后的文字內(nèi)容,有時(shí)就能避免不必要的下載。比如,在查看PDF文件時(shí),我們只需要復(fù)制粘貼其中的文字,而無(wú)需下載整個(gè)文件。為了實(shí)現(xiàn)這一功能,我們可以考慮在文件底部添加一個(gè)額外的窗口,用于顯示解析后的文字內(nèi)容。通過(guò)提供復(fù)制粘貼功能,用戶可以輕松地獲取所需的文字信息。
import gradio as gr
from pdf2docx import Converter
import docx2txt
def convert_pdf_to_docx_with_display(pdf_file):
tmp_file = "./output.docx"
# Convert PDF to DOCX
cv = Converter(pdf_file)
cv.convert(tmp_file)
cv.close()
# Extract text from DOCX
docx_text = docx2txt.process(tmp_file)
return tmp_file, docx_text
def convert_and_display_pdf_to_docx(pdf_file):
docx_file, docx_text = convert_pdf_to_docx_with_display(pdf_file)
return docx_file, docx_text
iface = gr.Interface(
fn=convert_and_display_pdf_to_docx,
inputs=["file"],
outputs=["file", "text"],
title="[努力的小雨] PDF to DOCX Converter",
description="上傳pdf文件,并將其轉(zhuǎn)化為docx文件且在界面單獨(dú)顯示文件的文字",
)
iface.launch()
當(dāng)我們完成代碼的修改后,運(yùn)行一下,我發(fā)現(xiàn)效果與我預(yù)期的是一致的。
至強(qiáng)版界面
如果我們已經(jīng)能夠顯示文字,那么是否還需要顯示圖片呢?考慮到PDF中常常包含圖片,為了滿足用戶復(fù)制粘貼圖片的需求,我認(rèn)為單獨(dú)開(kāi)發(fā)一個(gè)窗口來(lái)保存圖片是合理的。然而,在這個(gè)過(guò)程中,我遇到了一些困難,幾乎是我的噩夢(mèng)。我一直遇到報(bào)錯(cuò),而且這些錯(cuò)誤幾乎是我之前從未遇到過(guò)的。就像當(dāng)初學(xué)習(xí)Java的時(shí)候,總是需要上網(wǎng)搜索解決方法一樣。在使用gradio時(shí),我創(chuàng)建了一個(gè)畫廊窗口,但是錯(cuò)誤地以為它可以直接返回圖像的二進(jìn)制內(nèi)容,所以沒(méi)有進(jìn)行保存,結(jié)果一直報(bào)錯(cuò)。后來(lái),我保存了圖像,問(wèn)題得以解決。現(xiàn)在我們來(lái)修改代碼,因?yàn)橛泻芏嘀貜?fù)的代碼,我就不再一直復(fù)制粘貼了。
# 此處省略部分代碼
# Extract images from DOCX
images = []
image_dir = os.path.join(tmp_dir, "images")
os.makedirs(image_dir, exist_ok=True)
for embed, related_part in document.part.related_parts.items():
if isinstance(related_part, ImagePart):
image_path = os.path.join(image_dir, f'image_{embed}.png')
with open(image_path, 'wb') as f:
f.write(related_part.image.blob)
images.append(image_path)
return tmp_file, docx_text, images
# 此處省略部分代碼
我將圖片保存到一個(gè)文件夾中,并返回一個(gè)包含圖片實(shí)體的列表。現(xiàn)在讓我們來(lái)看一下效果:可以看到圖片已經(jīng)顯示出來(lái)了,但我覺(jué)得交互性還不夠,如果用戶不想要前幾頁(yè)的PDF怎么辦呢?為了解決這個(gè)問(wèn)題,我將再添加一個(gè)輸入框,讓用戶可以輸入相關(guān)信息。讓我們繼續(xù)優(yōu)化一下。
inputs=["text","file"],
為了實(shí)現(xiàn)傳參,我們可以修改輸入?yún)?shù)的類型。這個(gè)過(guò)程非常簡(jiǎn)單。除了我之前演示的簡(jiǎn)單樣式外,Gradio還有很多其他樣式可供選擇。我只是提供了一個(gè)最簡(jiǎn)單的示例,剩下的優(yōu)化工作就交給你了。你可以根據(jù)需要選擇適合的樣式進(jìn)行優(yōu)化。
這里我就不演示了,因?yàn)橹灰覀兡軌颢@取參數(shù),我們就可以實(shí)現(xiàn)各種功能。就pdf轉(zhuǎn)docx的可視化界面而言,我已經(jīng)基本完成了它,它符合我的要求并且基本上令我滿意。畢竟,我不需要去優(yōu)化界面。
總結(jié)
pdf轉(zhuǎn)docx文檔是一個(gè)非常實(shí)用的功能,我只是簡(jiǎn)單地實(shí)現(xiàn)了一個(gè)可視化界面供用戶操作。我這么做的目的之一是想更多地掌握gradio的使用方法,同時(shí)也加強(qiáng)對(duì)Python流行第三方包的熟悉程度,因?yàn)檫@些第三方包是快速開(kāi)發(fā)的關(guān)鍵。我也希望你能從中有所收獲,我已經(jīng)公布了本期的源碼地址,如果你覺(jué)得還不錯(cuò),或者在自己編寫的過(guò)程中遇到問(wèn)題,可以簡(jiǎn)單地參考一下。不過(guò),我仍然希望你能自己解決bug問(wèn)題,這樣一旦熟悉了,就知道如何處理,不用總是上網(wǎng)尋找解決方案。
總結(jié)
以上是生活随笔為你收集整理的Java开发者的Python快速实战指南:实用工具之PDF转DOCX文档(可视化界面)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: NestJs系列之使用Vite搭建项目
- 下一篇: websocket python爬虫_p