Java開發者的Python快速實戰指南:實用工具之PDF轉DOCX文檔(可視化界面)

来源:https://www.cnblogs.com/guoxiaoyu/archive/2023/12/05/17872879.html
-Advertisement-
Play Games

pdf轉docx文檔是一個非常實用的功能,我只是簡單地實現了一個可視化界面供用戶操作。我這麼做的目的之一是想更多地掌握gradio的使用方法,同時也加強對Python流行第三方包的熟悉程度,因為這些第三方包是快速開發的關鍵。我也希望你能從中有所收穫,我已經公佈了本期的源碼地址,如果你覺得還不錯,或者... ...


首先,大家對Python語法的瞭解已經基本完成,現在我們需要開始進行各種練習。我為大家準備了一些練習題目,比如之前的向量資料庫等,這些題目可以參考第三方的SDK來進行操作,文檔也是比較完善的。這個過程有點像我們之前使用Java對接第三方介面的方式,所以今天我想開發一個很實用的工具類,用於將PDF轉換為DOCX文檔。我覺得這個工具非常實用,所以通過這個項目,我想帶領那些在Python基礎上還比較薄弱的同學們從零開始,一起完成這個項目。

首先,我也剛開始接觸這個項目,所以我並不知道如何實現。我的第一反應是去搜索引擎上查找是否有其他人已經實現了類似的功能,因為現在有很多優秀的開源項目可供參考。畢竟,站在巨人的肩膀上進行開發並不可恥,而是一種聰明的做法。

幸運的是,我找到了一個名為"pdf2docx"的第三方包,它提供了非常優秀的功能。令人驚訝的是,僅僅幾行代碼就可以完成PDF轉換為DOCX的工作。而且,轉換結果也非常出色。讓我們來看一下具體的實現過程。

希望大家可以去倉庫中查看源碼,學習如何使用這個工具包,也歡迎大家在倉庫中留言,提出任何問題或建議。一起進步,共同學習!倉庫地址為:https://github.com/StudiousXiaoYu/pdf2docx_with_ui

PDF轉DOCX文檔

第三方包:pdf2docx

from pdf2docx import Converter

def convert_pdf_to_docx(pdf_path, docx_path):
    # 創建一個轉換器對象
    converter = Converter(pdf_path)

    # 將PDF轉換為DOCX
    converter.convert(docx_path, start=0, end=None)

    # 關閉轉換器
    converter.close()

# 調用函數進行轉換
pdf_path = "input.pdf"
docx_path = "output.docx"
convert_pdf_to_docx(pdf_path, docx_path)

他很容易理解,只需要你定義好文件路徑即可完成轉換操作。此外,我也不多解釋了,因為start參數用於指定轉換的起始頁碼,而end參數用於指定轉換的結束頁碼。你可以根據需要設置這兩個參數的值,如果不需要指定起始頁碼,可以將start參數設置為0;如果不需要指定結束頁碼,則可以將end參數設置為None。

官方可視化界面

代碼很簡單,但是如果是自己使用的話,每次都要寫一次路徑可能會很麻煩。不過你可以使用一個可視化交互界面來簡化這個過程,這樣會更方便一些。幸運的是,pdf2docx提供了一個簡易版的界面,你可以在控制臺中直接輸入"pdf2docx gui"來啟動。在界面中,你只需要選擇要轉換的PDF文件和一個文件夾作為保存路徑,就可以完成轉換操作了。這樣的話,你就不需要每次都手動輸入路徑了。非常方便。

image

簡易版可交互界面

但是,如果你對pdf2docx提供的界面不滿意,並且覺得界面不夠好看,那麼可以考慮使用另一個第三方界面庫,叫做gradio。我記得你之前在向量資料庫中使用過這個庫,對後端非常友好。你可以先寫一個簡單的界面,然後逐步優化它,以滿足你的需求。gradio提供了很多功能和自定義選項,你可以根據自己的喜好來設計界面的外觀和交互方式。然後慢慢優化吧。

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文件,並將其轉化為docx文件",
)

iface.launch()

image

恩恩,我看著是相當不錯的,這個小工具已經可以滿足用戶的需求了。效果圖,你可以看看:

image

優化版界面

好的,目前可交互的資源還相對較少。然而,如果我們能夠提前預覽解析後的文字內容,有時就能避免不必要的下載。比如,在查看PDF文件時,我們只需要複製粘貼其中的文字,而無需下載整個文件。為了實現這一功能,我們可以考慮在文件底部添加一個額外的視窗,用於顯示解析後的文字內容。通過提供複製粘貼功能,用戶可以輕鬆地獲取所需的文字信息。

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文件,並將其轉化為docx文件且在界面單獨顯示文件的文字",
)

iface.launch()

當我們完成代碼的修改後,運行一下,我發現效果與我預期的是一致的。

image

至強版界面

如果我們已經能夠顯示文字,那麼是否還需要顯示圖片呢?考慮到PDF中常常包含圖片,為了滿足用戶複製粘貼圖片的需求,我認為單獨開發一個視窗來保存圖片是合理的。然而,在這個過程中,我遇到了一些困難,幾乎是我的噩夢。我一直遇到報錯,而且這些錯誤幾乎是我之前從未遇到過的。就像當初學習Java的時候,總是需要上網搜索解決方法一樣。在使用gradio時,我創建了一個畫廊視窗,但是錯誤地以為它可以直接返回圖像的二進位內容,所以沒有進行保存,結果一直報錯。後來,我保存了圖像,問題得以解決。現在我們來修改代碼,因為有很多重覆的代碼,我就不再一直複製粘貼了。

# 此處省略部分代碼
# 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
# 此處省略部分代碼    

我將圖片保存到一個文件夾中,並返回一個包含圖片實體的列表。現在讓我們來看一下效果:可以看到圖片已經顯示出來了,但我覺得交互性還不夠,如果用戶不想要前幾頁的PDF怎麼辦呢?為瞭解決這個問題,我將再添加一個輸入框,讓用戶可以輸入相關信息。讓我們繼續優化一下。

image

inputs=["text","file"],

為了實現傳參,我們可以修改輸入參數的類型。這個過程非常簡單。除了我之前演示的簡單樣式外,Gradio還有很多其他樣式可供選擇。我只是提供了一個最簡單的示例,剩下的優化工作就交給你了。你可以根據需要選擇適合的樣式進行優化。

image

這裡我就不演示了,因為只要我們能夠獲取參數,我們就可以實現各種功能。就pdf轉docx的可視化界面而言,我已經基本完成了它,它符合我的要求並且基本上令我滿意。畢竟,我不需要去優化界面。

總結

pdf轉docx文檔是一個非常實用的功能,我只是簡單地實現了一個可視化界面供用戶操作。我這麼做的目的之一是想更多地掌握gradio的使用方法,同時也加強對Python流行第三方包的熟悉程度,因為這些第三方包是快速開發的關鍵。我也希望你能從中有所收穫,我已經公佈了本期的源碼地址,如果你覺得還不錯,或者在自己編寫的過程中遇到問題,可以簡單地參考一下。不過,我仍然希望你能自己解決bug問題,這樣一旦熟悉了,就知道如何處理,不用總是上網尋找解決方案。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • unittest庫提供了很多實用方法來檢測程式運行的結果和預期。包括三種類型的方法,每一種都覆蓋了典型的類型,比如: 檢查相等值、邏輯比較、異常 如果給定的Assertion通過了,那麼測試會執行下一行代碼。如果給定的assertion沒有通過,測試會暫停並且生成錯誤信息。unittest庫提供所有 ...
  • Quartz是一個作業調度框架,它可以與J2EE和J2SE應用相結合,也可以單獨使用。它能夠創建多個甚至數萬個jobs這樣複雜的程式,jobs可以做成標準的java組件或EJBS。Quartz很容易上手,創建一個任務僅需實現Job介面,該介面只有一個方法void execute(JobExecuti... ...
  • SSM框架中各層次作用及其關係(一) 平常學習生活中看見許多框架中的層次,都會有點懵,不知其意,抑或是看了又忘,所以這就是這篇短文的目的 總體辨析 JAVASSM(Java Web Application with Spring, Spring MVC, and MyBatis)是一種基於Java技 ...
  • 9 Docker 在 Docker 鏡像層內預覽文件 現在可以在 Services(服務)工具視窗中輕鬆訪問和預覽 Docker 鏡像層的內容。 從列表選擇鏡像,選擇 Show layers(顯示層),然後點擊 Analyze image for more information(分析鏡像以獲得更多 ...
  • 原文: https://openaigptguide.com/chatgpt-similar%20software/ ChatGPT是一款由美國OpenAI公司開發的人工智慧語言模型,類似的軟體有: 火山寫作(Volcano Writing):它是一款用戶友好的寫作軟體,可以自動生成具有創造性和連貫 ...
  • 前言 我python開發的GUI界面(圖形用戶界面)一直是tkinter,打包exe一直是Pyinstaller。但是打包出來的exe圖標、狀態欄圖標、窗體左上角圖標一直是預設的羽毛,我想自定義。 效果 最後使用base64創建臨時ico解決了該問題 步驟 創建icoToBase64.py,內容如下 ...
  • 在Java 21中,除了推出很多新特性之外,一些Bug修複,也需要註意一下。因為這些改變可能在升級的時候,造成影響。 Double.toString()和Float.toString()的精度問題修複 比如:對於Double.String(1e23): 在Java 19後,輸出內容為:1.0E23 ...
  • webjars類型的前端jar包 我們可以將公用的js,css,html,vue,shtml打包成一個jar,然後在其他項目中引用,這樣就不用每個項目都去引用一遍了,這樣就可以實現前端的公用了。 1.創建一個maven項目,添加依賴和插件 <dependencies> <!-- 依賴webjars- ...
一周排行
    -Advertisement-
    Play Games
  • 下麵是一個標準的IDistributedCache用例: public class SomeService(IDistributedCache cache) { public async Task<SomeInformation> GetSomeInformationAsync (string na ...
  • 這個庫提供了在啟動期間實例化已註冊的單例,而不是在首次使用它時實例化。 單例通常在首次使用時創建,這可能會導致響應傳入請求的延遲高於平時。在註冊時創建實例有助於防止第一次Request請求的SLA 以往我們要在註冊的時候實例單例可能會這樣寫: //註冊: services.AddSingleton< ...
  • 最近公司的很多項目都要改單點登錄了,不過大部分都還沒敲定,目前立刻要做的就只有一個比較老的項目 先改一個試試手,主要目標就是最短最快實現功能 首先因為要保留原登錄方式,所以頁面上的改動就是在原來登錄頁面下加一個SSO登錄入口 用超鏈接寫的入口,頁面改造後如下圖: 其中超鏈接的 href="Staff ...
  • Like運算符很好用,特別是它所提供的其中*、?這兩種通配符,在Windows文件系統和各類項目中運用非常廣泛。 但Like運算符僅在VB中支持,在C#中,如何實現呢? 以下是關於LikeString的四種實現方式,其中第四種為Regex正則表達式實現,且在.NET Standard 2.0及以上平... ...
  • 一:背景 1. 講故事 前些天有位朋友找到我,說他們的程式記憶體會偶發性暴漲,自己分析了下是非托管記憶體問題,讓我幫忙看下怎麼回事?哈哈,看到這個dump我還是非常有興趣的,居然還有這種游戲幣自助機類型的程式,下次去大玩家看看他們出幣的機器後端是不是C#寫的?由於dump是linux上的程式,剛好win ...
  • 前言 大家好,我是老馬。很高興遇到你。 我們為 java 開發者實現了 java 版本的 nginx https://github.com/houbb/nginx4j 如果你想知道 servlet 如何處理的,可以參考我的另一個項目: 手寫從零實現簡易版 tomcat minicat 手寫 ngin ...
  • 上一次的介紹,主要圍繞如何統一去捕獲異常,以及為每一種異常添加自己的Mapper實現,並且我們知道,當在ExceptionMapper中返回非200的Response,不支持application/json的響應類型,而是寫死的text/plain類型。 Filter為二方包異常手動捕獲 參考:ht ...
  • 大家好,我是R哥。 今天分享一個爽飛了的面試輔導 case: 這個杭州兄弟空窗期 1 個月+,面試了 6 家公司 0 Offer,不知道問題出在哪,難道是杭州的 IT 崩盤了麽? 報名面試輔導後,經過一個多月的輔導打磨,現在成功入職某上市公司,漲薪 30%+,955 工作制,不咋加班,還不捲。 其他 ...
  • 引入依賴 <!--Freemarker wls--> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.30</version> </dependency> ...
  • 你應如何運行程式 互動式命令模式 開始一個互動式會話 一般是在操作系統命令行下輸入python,且不帶任何參數 系統路徑 如果沒有設置系統的PATH環境變數來包括Python的安裝路徑,可能需要機器上Python可執行文件的完整路徑來代替python 運行的位置:代碼位置 不要輸入的內容:提示符和註 ...