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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...