最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python自動化辦公之編寫PDF拆分工具

 更新時間:2022年03月22日 09:25:22   作者:蘿卜大雜燴  
這篇文章主要為大家分享一個Python自動化辦公的小工具——PDF拆分工具,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起動手試一試

今天我們繼續(xù)分享真實的自動化辦公案例,希望各位 Python 愛好者能夠從中得到些許啟發(fā),在自己的工作生活中更多的應(yīng)用 Python,使得工作事半功倍!

需求

需要從 PDF 中取出幾頁并將其保存為新的 PDF,為了后期使用方便,這個工具需要做成傻瓜式的帶有 GUI 頁面的形式

選擇源 pdf 文件,再指定下生成的新的 pdf 文件名稱及保存位置,和需要拆分的 page 信息,就可以得到新的 pdf 文件了

需求解析

對于 Python GUI,我們有太多種選擇了,下面我們先來橫向的簡單對比下

從高層次上看,大的 GUI 工具有:

  • Qt
  • WxWindows
  • Tkinter
  • Customer libraries(Kivy,Toga等)
  • Web相關(guān)(HTML,F(xiàn)lask等)

不過今天,我們選擇的工具是 appJar,這是一個由一位從事教育工作的大神發(fā)明的,所以它可以提供一個更加簡單的 GUI 創(chuàng)建過程,而且是完全基于 Tkinter 的,Python 默認(rèn)支持

代碼實現(xiàn)

首先為了實現(xiàn) PDF 操作,我這里選擇了 pypdf2 庫

我們先硬編碼一個輸入輸出的示例

from?PyPDF2?import?PdfFileWriter,?PdfFileReader

infile?=?"Input.pdf"
outfile?=?"Output.pdf"

page_range?=?"1-2,6"

接下來我們實例化 PdfFileWriter 和 PdfFIleReader 對象,并創(chuàng)建實際的 Output.pdf 文件

output?=?PdfFileWriter()
input_pdf?=?PdfFileReader(open(infile,?"rb"))
output_file?=?open(outfile,?"wb")

下面一個比較復(fù)雜的點就是需要拆分 pdf,提取頁面并保存在列表中

page_ranges?=?(x.split("-")?for?x?in?page_range.split(","))
range_list?=?[i?for?r?in?page_ranges?for?i?in?range(int(r[0]),?int(r[-1])?+?1)]

最后就是從原始文件中拷貝內(nèi)容到新的文件

for?p?in?range_list:
????output.addPage(input_pdf.getPage(p?-?1))
output.write(output_file)

下面來構(gòu)建 GUI 界面

對于這個拆分 PDF 的小工具,需要具有如下功能:

  • 可以通過標(biāo)準(zhǔn)文件瀏覽器選擇 pdf 文件
  • 可以選擇輸出文件的位置及文件名稱
  • 可以自定義提取哪些頁面
  • 有一些錯誤檢查

通過 PIP 安裝好 appJar 后,我們就可以編碼了

from?appJar?import?gui
from?PyPDF2?import?PdfFileWriter,?PdfFileReader
from?pathlib?import?Path

創(chuàng)建 GUI 窗口

app?=?gui("PDF?Splitter",?useTtk=True)
app.setTtkTheme("default")
app.setSize(500,?200)

這里我使用了默認(rèn)主題,當(dāng)然也可以切換各種各樣的主題模式

下面是添加標(biāo)簽和數(shù)據(jù)輸入組件

app.addLabel("Choose?Source?PDF?File")
app.addFileEntry("Input_File")

app.addLabel("Select?Output?Directory")
app.addDirectoryEntry("Output_Directory")

app.addLabel("Output?file?name")
app.addEntry("Output_name")

app.addLabel("Page?Ranges:?1,3,4-10")
app.addEntry("Page_Ranges")

接下來添加按鈕,“處理”和“退出”,按下按鈕,調(diào)用如下函數(shù)

app.addButtons(["Process",?"Quit"],?press)

最后就是運行這個 app 啦

#?start?the?GUI
app.go()

這樣我們就完成了 GUI 的搭建,下面編寫內(nèi)部處理邏輯。程序讀取任何輸入,判斷是否為 PDF,并拆分

def?press(button):
????if?button?==?"Process":
????????src_file?=?app.getEntry("Input_File")
????????dest_dir?=?app.getEntry("Output_Directory")
????????page_range?=?app.getEntry("Page_Ranges")
????????out_file?=?app.getEntry("Output_name")
????????errors,?error_msg?=?validate_inputs(src_file,?dest_dir,?page_range,?out_file)
????????if?errors:
????????????app.errorBox("Error",?"\n".join(error_msg),?parent=None)
????????else:
????????????split_pages(src_file,?page_range,?Path(dest_dir,?out_file))
????else:
????????app.stop()

如果單擊 “處理(Process)”按鈕,則調(diào)用 app.getEntry() 檢索輸入值,每個值都會被存儲,然后通過調(diào)用 validate_inputs() 進行驗證

來看看 validate_inputs 函數(shù)

def?validate_inputs(input_file,?output_dir,?range,?file_name):
????errors?=?False
????error_msgs?=?[]

????#?Make?sure?a?PDF?is?selected
????if?Path(input_file).suffix.upper()?!=?".PDF":
????????errors?=?True
????????error_msgs.append("Please?select?a?PDF?input?file")

????#?Make?sure?a?range?is?selected
????if?len(range)?<?1:
????????errors?=?True
????????error_msgs.append("Please?enter?a?valid?page?range")

????#?Check?for?a?valid?directory
????if?not(Path(output_dir)).exists():
????????errors?=?True
????????error_msgs.append("Please?Select?a?valid?output?directory")

????#?Check?for?a?file?name
????if?len(file_name)?<?1:
????????errors?=?True
????????error_msgs.append("Please?enter?a?file?name")

????return(errors,?error_msgs)

這個函數(shù)就是執(zhí)行一些檢查來確保輸入有數(shù)據(jù)并且有效

在收集驗證了所有數(shù)據(jù)后,就可以調(diào)用 split 函數(shù)來處理文件了

def?split_pages(input_file,?page_range,?out_file):
????output?=?PdfFileWriter()
????input_pdf?=?PdfFileReader(open(input_file,?"rb"))
????output_file?=?open(out_file,?"wb")

????page_ranges?=?(x.split("-")?for?x?in?page_range.split(","))
????range_list?=?[i?for?r?in?page_ranges?for?i?in?range(int(r[0]),?int(r[-1])?+?1)]

????for?p?in?range_list:
????????#?Need?to?subtract?1?because?pages?are?0?indexed
????????try:
????????????output.addPage(input_pdf.getPage(p?-?1))
????????except?IndexError:
????????????#?Alert?the?user?and?stop?adding?pages
????????????app.infoBox("Info",?"Range?exceeded?number?of?pages?in?input.\nFile?will?still?be?saved.")
????????????break
????output.write(output_file)

????if(app.questionBox("File?Save",?"Output?PDF?saved.?Do?you?want?to?quit?")):
????????app.stop()

好了,這樣我們就完成了一個簡易的 GUI 拆分 PDF 文件的工具嘍

到此這篇關(guān)于Python自動化辦公之編寫PDF拆分工具的文章就介紹到這了,更多相關(guān)Python PDF拆分內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python同時處理多個異常的方法

    Python同時處理多個異常的方法

    這篇文章主要介紹了Python同時處理多個異常的方法,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • Python實現(xiàn)文件壓縮和解壓的示例代碼

    Python實現(xiàn)文件壓縮和解壓的示例代碼

    這篇文章主要介紹了Python實現(xiàn)文件壓縮和解壓的方法,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下
    2020-08-08
  • 關(guān)于python的對象序列化介紹

    關(guān)于python的對象序列化介紹

    大家好,本篇文章主要講的是關(guān)于python的對象序列化介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • Python如何爬取實時變化的WebSocket數(shù)據(jù)的方法

    Python如何爬取實時變化的WebSocket數(shù)據(jù)的方法

    這篇文章主要介紹了Python如何爬取實時變化的WebSocket數(shù)據(jù)的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • python 正則表達(dá)式的使用

    python 正則表達(dá)式的使用

    這篇文章主要介紹了python 正則表達(dá)式的使用,Python 中正則表達(dá)式應(yīng)用非常廣泛,如數(shù)據(jù)挖掘、數(shù)據(jù)分析、網(wǎng)絡(luò)爬蟲、輸入有效性驗證等,Python 也提供了利用正則表達(dá)式實現(xiàn)文本的匹配、查找和替換等操作的 re 模塊,下面和小編一起進入文章了解具體內(nèi)容吧
    2021-10-10
  • Python3.10動態(tài)修改Windows系統(tǒng)本地IP地址

    Python3.10動態(tài)修改Windows系統(tǒng)本地IP地址

    這篇文章主要介紹了Python3.10動態(tài)修改Windows系統(tǒng)本地IP地址,需要的朋友可以參考下
    2023-05-05
  • 六個Python編程最受用的內(nèi)置函數(shù)使用詳解

    六個Python編程最受用的內(nèi)置函數(shù)使用詳解

    在日常的python編程中使用這幾個函數(shù)來簡化我們的編程工作,經(jīng)常使用能使編程效率大大地提高。本文為大家總結(jié)了六個Python編程最受用的內(nèi)置函數(shù),感興趣的可以了解一下
    2022-07-07
  • 使用python編寫一個視覺巡線程序

    使用python編寫一個視覺巡線程序

    這篇文章主要為大家詳細(xì)介紹了如何使用python編寫一個視覺巡線程序,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-01-01
  • Python3.6簡單操作Mysql數(shù)據(jù)庫

    Python3.6簡單操作Mysql數(shù)據(jù)庫

    這篇文章主要為大家詳細(xì)介紹了Python3.6簡單操作Mysql數(shù)據(jù)庫,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Python 并列和或者條件的使用說明

    Python 并列和或者條件的使用說明

    這篇文章主要介紹了Python 并列和或者條件的使用說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03

最新評論

德江县| 茶陵县| 烟台市| 巨鹿县| 根河市| 分宜县| 会泽县| 武陟县| 彰武县| 剑阁县| 商都县| 清水河县| 高淳县| 石嘴山市| 汝城县| 延边| 兖州市| 镇沅| 凤阳县| 夏津县| 湾仔区| 新乐市| 荔波县| 南溪县| 平乐县| 凤翔县| 湘乡市| 望都县| 海南省| 来宾市| 翁源县| 高安市| 阳高县| 山丹县| 成都市| 上犹县| 湟中县| 莲花县| 凤山市| 济源市| 淮安市|