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
  • 最近做項目過程中,使用到了海康相機,官方只提供了C/C++的SDK,沒有搜尋到一個合適的封裝了的C#庫,故自己動手,簡單的封裝了一下,方便大家也方便自己使用和二次開發 ...
  • 前言 MediatR 是 .NET 下的一個實現消息傳遞的庫,輕量級、簡潔高效,用於實現進程內的消息傳遞機制。它基於中介者設計模式,支持請求/響應、命令、查詢、通知和事件等多種消息傳遞模式。通過泛型支持,MediatR 可以智能地調度不同類型的消息,非常適合用於領域事件處理。 在本文中,將通過一個簡 ...
  • 前言 今天給大家推薦一個超實用的開源項目《.NET 7 + Vue 許可權管理系統 小白快速上手》,DncZeus的願景就是做一個.NET 領域小白也能上手的簡易、通用的後臺許可權管理模板系統基礎框架。 不管你是技術小白還是技術大佬或者是不懂前端Vue 的新手,這個項目可以快速上手讓我們從0到1,搭建自 ...
  • 第1章:WPF概述 本章目標 瞭解Windows圖形演化 瞭解WPF高級API 瞭解解析度無關性概念 瞭解WPF體繫結構 瞭解WPF 4.5 WPF概述 ​ 歡迎使用 Windows Presentation Foundation (WPF) 桌面指南,這是一個與解析度無關的 UI 框架,使用基於矢 ...
  • 在日常開發中,並不是所有的功能都是用戶可見的,還在一些背後默默支持的程式,這些程式通常以服務的形式出現,統稱為輔助角色服務。今天以一個簡單的小例子,簡述基於.NET開發輔助角色服務的相關內容,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 第3章:佈局 本章目標 理解佈局的原則 理解佈局的過程 理解佈局的容器 掌握各類佈局容器的運用 理解 WPF 中的佈局 WPF 佈局原則 ​ WPF 視窗只能包含單個元素。為在WPF 視窗中放置多個元素並創建更貼近實用的用戶男面,需要在視窗上放置一個容器,然後在這個容器中添加其他元素。造成這一限制的 ...
  • 前言 在平時項目開發中,定時任務調度是一項重要的功能,廣泛應用於後臺作業、計劃任務和自動化腳本等模塊。 FreeScheduler 是一款輕量級且功能強大的定時任務調度庫,它支持臨時的延時任務和重覆迴圈任務(可持久化),能夠按秒、每天/每周/每月固定時間或自定義間隔執行(CRON 表達式)。 此外 ...
  • 目錄Blazor 組件基礎路由導航參數組件參數路由參數生命周期事件狀態更改組件事件 Blazor 組件 基礎 新建一個項目命名為 MyComponents ,項目模板的交互類型選 Auto ,其它保持預設選項: 客戶端組件 (Auto/WebAssembly): 最終解決方案裡面會有兩個項目:伺服器 ...
  • 先看一下效果吧: isChecked = false 的時候的效果 isChecked = true 的時候的效果 然後我們來實現一下這個效果吧 第一步:創建一個空的wpf項目; 第二步:在項目裡面添加一個checkbox <Grid> <CheckBox HorizontalAlignment=" ...
  • 在編寫上位機軟體時,需要經常處理命令拼接與其他設備進行通信,通常對不同的命令封裝成不同的方法,擴展稍許麻煩。 本次擬以特性方式實現,以兼顧維護性與擴展性。 思想: 一種命令對應一個類,其類中的各個屬性對應各個命令段,通過特性的方式,實現其在這包數據命令中的位置、大端或小端及其轉換為對應的目標類型; ...