最全總結(jié) | 聊聊 Python 辦公自動化之 PDF(上)

1. 前言

自動化辦公誓酒,非 Python 莫屬咖为!

從本篇文章開始柒凉,我們繼續(xù)聊聊自動化辦公中另外一個常用系列:PPT

2. 準(zhǔn)備一下

Python 操作 PPT 最強(qiáng)大的依賴庫是:python-pptx

所以苞笨,在開始操作之前债朵,我們需要在虛擬環(huán)境下安裝這個依賴庫

# 安裝依賴pip3install python-pptx

3. PPT 結(jié)構(gòu)

首先子眶,我們需要了解一個 PPT 文檔的頁面結(jié)構(gòu)

正在上傳... 取消

一個 PPT 文檔對應(yīng)一個 Presentation 對象

一個 Presentation 包含多個 Slide 對象,每一個 Slide 代表一個幻燈片

每一張幻燈片的內(nèi)容都是由各種形狀 Shape 組成

其次序芦,PPT 中的內(nèi)容元素都是由各種形狀構(gòu)成

比如:文字框臭杰、圖片、占位符谚中、表格渴杆、普通形狀等

通過翻看源碼,發(fā)現(xiàn)他們都定義在 MSO_SHAPE_TYPE? 類中

正在上傳... 取消

最后藏杖,我們需要了解一下 PPT 中的 版式模板

使用 Presentation 對象的 屬性方法 slide_layouts 可以獲取內(nèi)置的 11 種母版樣式

# 使用Presentation獲取PPT內(nèi)置的11種版式樣式# 版式索引從0開始slide_layout= presentation.slide_layouts[slide_style_index]

他們分別是:

Title Slide 標(biāo)題幻燈片

Title and Content? ? 標(biāo)題和內(nèi)容幻燈片

Section Header? ? 節(jié)標(biāo)題幻燈片

Two Content? ? 兩欄內(nèi)容幻燈片

Comparison? ? 比較幻燈片

Title Only? ? 僅標(biāo)題的幻燈片

Blank? ? 空白幻燈片

Content with Caption? ? 內(nèi)容和標(biāo)題的幻燈片

Picture with Caption? ? 圖片和標(biāo)題的幻燈片

Title and Vertical Text 標(biāo)題和豎排內(nèi)容

Vertical Title and Text 豎排標(biāo)題和文本

當(dāng)然,也可以在 Microsoft PPT / WPS 中查看對應(yīng)母版的樣式

這里補(bǔ)充一下脉顿,除了內(nèi)置的版式樣式蝌麸,也可以通過占位符 PlaceHolder 去自定義母版,滿足一些特定的場景需求

4. 幻燈片管理

一個 PPT 文件是由一個或多張幻燈片組成

1-1? 那如何添加一張一張幻燈片呢艾疟?

這里来吩,只需要通過下面 3 個步驟

實例化一個 Presentation 對象

通過內(nèi)置的版本樣式,新建一個版本樣式 Layout

通過版本樣式 Layout蔽莱,添加一張幻燈片

defadd_slide(presentation, slide_style_index):"""

? ? 在PPT文檔中弟疆,以內(nèi)置的版式添加幻燈片

? ? :param presentation:文檔對象

? ? :param slide_style_index:版式索引

? ? :return:

? ? """# PPT版式樣式# 內(nèi)置有11種版式樣式# 0:Title Slide 標(biāo)題幻燈片# 1:Title and Content? 標(biāo)題和內(nèi)容# 2:Section Header? 節(jié)標(biāo)題# 3:Two Content? 兩欄內(nèi)容# 4:Comparison? 比較# 5:Title Only? 僅標(biāo)題# 6:Blank? 空白# 7:Content with Caption? 內(nèi)容和標(biāo)題# 8:Picture with Caption? 圖片和標(biāo)題# 9:Title and Vertical Text? 標(biāo)題和豎排內(nèi)容# 10:Vertical Title and Text? 豎排標(biāo)題和文本slide_layout = presentation.slide_layouts[slide_style_index]# 通過樣式Layout,新增一張幻燈片slide = presentation.slides.add_slide(slide_layout)returnslide# 1.1 新增幻燈片slide1 = add_slide(self.presentation,0)slide2 = add_slide(self.presentation,1)slide3 = add_slide(self.presentation,2)slide4 = add_slide(self.presentation,3)

1-2? 獲取已有的幻燈片或某一張幻燈片盗冷?

Presentation 對象的 slides 屬性 會返回當(dāng)前 PPT 文檔中所有的幻燈片對象列表

defget_slides(presentation):"""

? ? 獲取所有的幻燈片

? ? :param presentation:

? ? :return:

? ? """# 所有幻燈片slides = presentation.slides# 幻燈片數(shù)目slide_num =len(slides)returnslides, slide_numdefget_slide(presentation, slide_index):"""

? ? 根據(jù)索引怠苔,獲取某一個幻燈片

? ? :param presentation:

? ? :param slide_index:頁面索引,從0開始

? ? :return:

? ? """slides, slide_num = get_slides(presentation=presentation)returnslides[slide_index]# 1.2.1 獲取所幻燈片slides, slide_num = get_slides(self.presentation)print('現(xiàn)有幻燈片:', slides)print('幻燈片數(shù)目:', slide_num)# 1.2.2 獲取某一個幻燈片slide = get_slide(self.presentation,1)print(slide.shapes)

1-3? 如果需要刪除某一張幻燈片仪糖,如何破柑司?

這個也簡單,只需要先獲取目前幻燈片對象锅劝,然后使用下面方法移除即可

defdel_slide(presentation, slide_index=0):"""

? ? 刪除某一張幻燈片

? ? :param presentation:

? ? :param slide_index: 索引

? ? :return:

? ? """# 所有幻燈片的列表slides =list(presentation.slides._sldIdLst)# 根據(jù)索引攒驰,刪除某一張幻燈片presentation.slides._sldIdLst.remove(slides[slide_index])# 1.3 根據(jù)索引,刪除PPT文檔中某一張幻燈片# 比如:刪除第4張幻燈片del_slide(self.presentation,3)

5. 文字及段落

我們首先需要指定一個幻燈片對象 Slide故爵,它可以是已有的幻燈片玻粪,也可以是新建的一張幻燈片

接著,使用幻燈片對象的 slide.shapes 屬性诬垂,獲取當(dāng)前幻燈片中的所有形狀 Shape 組成的隊列

最后利用形狀隊列的下面這個函數(shù)添加一個文本框劲室,函數(shù)返回值為一個:文本框?qū)ο?/p>

add_textbox( left , top , width , height )

該函數(shù)參數(shù)分別為:

left? 左邊距

top? 上邊距

width? 文字框?qū)挾?/p>

height? 文字框高度

這里需要引出另外一個概念:文字形狀

PS:文字形狀便于在文字框中添加段落和設(shè)置樣式,通過「文本框?qū)ο蟆沟膶傩院瘮?shù) text_frame 獲取

definsert_textbox(slide, left, top, width, height, unit=Inches):"""

? ? 幻燈片中添加文本框

? ? :param unit: 單元结窘,默認(rèn)設(shè)置為Inches

? ? :param slide: 幻燈片對象

? ? :param left: 左邊距

? ? :param top:? 上邊距

? ? :param width: 寬度

? ? :param height: 高度

? ? :return:

? ? """# 文本框textbox = slide.shapes.add_textbox(left=unit(left),? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? top=unit(top),? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? width=unit(width),? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? height=unit(height))# 文本框形狀tf = textbox.text_framereturntextbox, tf

為了便于使用痹籍,我對幻燈片中插入文字框這一動作進(jìn)行了一次封裝

長度單位默認(rèn)設(shè)置為:Inches,也可以自定義為厘米等單位

接下來晦鞋,我們來操作文字框及段落的常見操作

1-1? 插入文本框蹲缠,并設(shè)置默認(rèn)段落內(nèi)容

插入文本框的同時棺克,文本框形狀對象會自帶一個段落,可以對這個段落設(shè)置內(nèi)容

# 2线定、往幻燈片中插入一個文本框娜谊,返回一個文本框?qū)ο蠛鸵粋€文本框形狀對象textbox, tf = insert_textbox(slide,8,2,10,4, unit=Cm)# 2.1 默認(rèn)的段落paragraph_default= tf.paragraphs[0]paragraph_default.text ="設(shè)置段落默認(rèn)的內(nèi)容"

1-2? 文本框中新增一個段落

查看源碼發(fā)現(xiàn),文本框形狀對象是 TextFrame 的子類斤讥,因此可以使用 TextFrame 類中的 add_paragraph() 函數(shù)添加一個新的段落

# 2.2 添加一個新的段落paragraph_new= tf.add_paragraph()# 2.3 給段落設(shè)置內(nèi)容paragraph_new.text="歡迎關(guān)注公眾號:AirPython\n每周分享 Python 原創(chuàng)技術(shù)干貨纱皆!"

1-3? 設(shè)置段落及文字樣式

和 Word 一樣,使用 python-pptx 同樣可以設(shè)置 PPT 文檔的段落樣式

其中

對齊方式:對齊方式是針對段落的芭商,只需要指定段落對象的 alignment 的屬性值即可

defset_parg_font_style(paragraph, font_name=None, font_color=None, font_size=-1, font_bold=False, font_italic=False,? ? ? ? ? ? ? ? ? ? ? ? paragraph_alignment=PP_ALIGN.CENTER):"""

? ? 設(shè)置段落中文本的樣式派草,包含:字體名稱、顏色铛楣、大小近迁、是否加粗、是否斜體

? ? :param paragraph_alignment: 段落對齊方式

? ? :param paragraph:

? ? :param font_name:

? ? :param font_color:

? ? :param font_size:

? ? :param font_bold:

? ? :param font_italic:

? ? :return:

? ? """# 對齊方式# 注意:對齊方式是針對段落的paragraph.alignment = paragraph_alignment# 獲取段落中字體對象font = paragraph.font# 設(shè)置字體樣式set_font_style(font, font_name, font_color, font_size, font_bold, font_italic)returnfont

段落文字屬性:使用段落對象的 font 屬性獲取字體對象簸州,接著設(shè)置字體名稱鉴竭、大小、顏色岸浑、是否斜體搏存、加粗

defset_font_style(font, font_name=None, font_color=None, font_size=-1, font_bold=False, font_italic=False):"""

? ? 設(shè)置字體樣式

? ? :param font:

? ? :param font_name:

? ? :param font_color:

? ? :param font_size:

? ? :param font_bold:

? ? :param font_italic:

? ? :return:

? ? """# 字體名稱iffont_name:? ? ? ? font.name = font_name# 字體顏色iffont_colorandlen(font_color) ==3:? ? ? ? font.color.rgb = RGBColor(font_color[0], font_color[1], font_color[2])# 字體大小iffont_size !=-1:? ? ? ? font.size = Pt(font_size)# 是否加粗,默認(rèn)不加粗font.bold = font_bold# 是否傾斜矢洲,默認(rèn)不傾斜font.italic = font_italic

1-4? 設(shè)置文字框的背景顏色

設(shè)置文字框背景顏色只需要 2 步

將形狀的填充類型設(shè)置為純色

設(shè)置文字框的背景顏色

defset_widget_bg(widget, bg_rgb_color=None):"""

? ? 設(shè)置【文本框textbox/單元格/形狀】的背景顏色

? ? :param widget:文本框textbox璧眠、單元格、形狀

? ? :param bg_rgb_color:背景顏色值

? ? :return:

? ? """ifbg_rgb_colorandlen(bg_rgb_color) ==3:# 1读虏、將形狀填充類型設(shè)置為純色widget.fill.solid()# 2蛆橡、設(shè)置文本框的背景顏色widget.fill.fore_color.rgb = RGBColor(bg_rgb_color[0], bg_rgb_color[1], bg_rgb_color[2])# 4、設(shè)置文字框的背景顏色set_widget_bg(textbox, [0,255,0])

需要指出的是掘譬,該方法同樣適用于設(shè)置表格單元格泰演、普通形狀的背景顏色

1-5 文本框的自動對齊

一旦文本框設(shè)置一段很長的文字,單行可能顯示不完全

這時候葱轩,我們只需要設(shè)置文字形狀的 word_wrap 值為 True睦焕,則可以讓文本框的文字自動換行顯示

# 5、設(shè)置文本框的文字自動對齊tf.word_wrap=True

龍華大道1號 http://www.kinghill.cn/Dynamics/2106.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末靴拱,一起剝皮案震驚了整個濱河市垃喊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌袜炕,老刑警劉巖本谜,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異偎窘,居然都是意外死亡乌助,警方通過查閱死者的電腦和手機(jī)溜在,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來他托,“玉大人掖肋,你說我怎么就攤上這事∩筒危” “怎么了志笼?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長把篓。 經(jīng)常有香客問我纫溃,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮赎瞎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘郎楼。我一直安慰自己万伤,他們只是感情好窒悔,可當(dāng)我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著敌买,像睡著了一般简珠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上虹钮,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天聋庵,我揣著相機(jī)與錄音,去河邊找鬼芙粱。 笑死祭玉,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的春畔。 我是一名探鬼主播脱货,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼律姨!你這毒婦竟也來了振峻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤择份,失蹤者是張志新(化名)和其女友劉穎扣孟,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體荣赶,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡凤价,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年鸽斟,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片料仗。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡湾盗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出立轧,到底是詐尸還是另有隱情格粪,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布氛改,位于F島的核電站帐萎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏胜卤。R本人自食惡果不足惜疆导,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望葛躏。 院中可真熱鬧澈段,春花似錦、人聲如沸舰攒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽摩窃。三九已至兽叮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間猾愿,已是汗流浹背鹦聪。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留蒂秘,地道東北人泽本。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像姻僧,于是被迫代替她去往敵國和親规丽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容