在臺灣的軟體開發環境中,處理 PDF 和 Word 檔案是很常見的需求。利用 Python 的第三方函式庫 PyPDF2 和 python-docx,可以簡化這些操作。PyPDF2 主要用於處理 PDF 檔案,例如合併、分割和旋轉頁面。python-docx 則是用於操作 Word 檔案,可以讀取和修改文字、段落、樣式、表格和圖片等元素。這兩個函式庫讓開發者能更輕鬆地自動化辦公室檔案處理流程,提升工作效率。例如,可以撰寫程式碼批次合併多個 PDF 檔案,或者從 Word 檔案中提取特定資訊並轉換成其他格式。這些功能在需要處理大量檔案時尤其有用。

合併PDF檔案

合併多個PDF檔案是一個常見的需求,尤其是在處理大量檔案時。以下是使用Python和PyPDF函式庫來合併PDF檔案的步驟。

步驟1:安裝PyPDF函式庫

首先,需要安裝PyPDF函式庫,可以使用pip命令進行安裝:

pip install pypdf

步驟2:匯入函式庫和設定變數

匯入PyPDF函式庫和設定變數:

import pypdf
import os

# 設定PDF檔案目錄
pdf_dir = '/path/to/pdf/files'

# 取得所有PDF檔名
pdf_filenames = [f for f in os.listdir(pdf_dir) if f.endswith('.pdf')]

# 對PDF檔名進行排序
pdf_filenames.sort(key=str.lower)

步驟3:建立PdfWriter物件

建立PdfWriter物件來儲存合併後的PDF頁面:

writer = pypdf.PdfWriter()

步驟4:迴圈合併PDF檔案

迴圈合併每個PDF檔案:

for pdf_filename in pdf_filenames:
    reader = pypdf.PdfReader(os.path.join(pdf_dir, pdf_filename))
    
    # 跳過第一頁
    writer.append(reader.pages[1:])

步驟5:儲存合併後的PDF檔案

儲存合併後的PDF檔案:

with open('combined.pdf', 'wb') as file:
    writer.write(file)

完整程式碼

以下是完整的程式碼:

import pypdf
import os

# 設定PDF檔案目錄
pdf_dir = '/path/to/pdf/files'

# 取得所有PDF檔名
pdf_filenames = [f for f in os.listdir(pdf_dir) if f.endswith('.pdf')]

# 對PDF檔名進行排序
pdf_filenames.sort(key=str.lower)

# 建立PdfWriter物件
writer = pypdf.PdfWriter()

# 迴圈合併PDF檔案
for pdf_filename in pdf_filenames:
    reader = pypdf.PdfReader(os.path.join(pdf_dir, pdf_filename))
    
    # 跳過第一頁
    writer.append(reader.pages[1:])

# 儲存合併後的PDF檔案
with open('combined.pdf', 'wb') as file:
    writer.write(file)

圖表翻譯:

合併PDF檔案流程圖

圖表翻譯:

此流程圖描述了合併PDF檔案的步驟,從設定PDF檔案目錄到儲存合併後的PDF檔案。每個步驟都清楚地展示了合併PDF檔案的過程。

建立和修改PDF檔案

Python可以使用PyPDF2函式庫建立和修改PDF檔案。這個函式庫允許你從其他PDF檔案中提取特定頁面,反轉或重新排序頁面,甚至根據頁面內容建立新的PDF檔案。

建立PDF檔案

要建立一個新的PDF檔案,你可以使用PdfFileWriter類別。這個類別允許你新增頁面到PDF檔案中,並且可以儲存為一個新的PDF檔案。

from PyPDF2 import PdfFileWriter, PdfFileReader

# 建立一個新的PDF檔案
pdf_writer = PdfFileWriter()

# 新增頁面到PDF檔案中
pdf_writer.add_page(PdfFileReader('example.pdf').getPage(0))

# 儲存PDF檔案
with open('new_pdf.pdf', 'wb') as f:
    pdf_writer.write(f)

修改PDF檔案

你也可以使用PyPDF2函式庫修改現有的PDF檔案。例如,你可以新增或刪除頁面,或者合併多個PDF檔案。

from PyPDF2 import PdfFileWriter, PdfFileReader

# 開啟一個現有的PDF檔案
pdf_reader = PdfFileReader('example.pdf')

# 建立一個新的PDF檔案
pdf_writer = PdfFileWriter()

# 新增所有頁面到新的PDF檔案中
for page in pdf_reader.pages:
    pdf_writer.add_page(page)

# 刪除第2頁
del pdf_writer.pages[1]

# 儲存修改後的PDF檔案
with open('modified_pdf.pdf', 'wb') as f:
    pdf_writer.write(f)

處理Word檔案

Python可以使用python-docx函式庫建立和修改Microsoft Word檔案(.docx檔案)。這個函式庫允許你新增、刪除和修改段落、執行(runs)和樣式。

安裝python-docx函式庫

你可以使用pip安裝python-docx函式庫:

pip install python-docx

讀取Word檔案

你可以使用docx模組讀取Word檔案。這個模組允許你存取檔案的段落、執行和樣式。

import docx

# 開啟一個Word檔案
doc = docx.Document('example.docx')

# 讀取段落
for paragraph in doc.paragraphs:
    print(paragraph.text)

寫入Word檔案

你也可以使用docx模組寫入Word檔案。這個模組允許你新增、刪除和修改段落、執行和樣式。

import docx

# 建立一個新的Word檔案
doc = docx.Document()

# 新增一個段落
paragraph = doc.add_paragraph()
paragraph.add_run('Hello, World!')

# 儲存Word檔案
doc.save('new_doc.docx')

結合PDF和Word檔案

你可以使用PyPDF2和python-docx函式庫結合PDF和Word檔案。例如,你可以從Word檔案中提取文字,並將其新增到PDF檔案中。

from PyPDF2 import PdfFileWriter, PdfFileReader
import docx

# 開啟一個Word檔案
doc = docx.Document('example.docx')

# 提取文字
text = ''
for paragraph in doc.paragraphs:
    text += paragraph.text

# 建立一個新的PDF檔案
pdf_writer = PdfFileWriter()

# 新增頁面到PDF檔案中
pdf_writer.add_page(PdfFileReader('example.pdf').getPage(0))

# 新增文字到PDF檔案中
pdf_writer.add_text(text)

# 儲存PDF檔案
with open('new_pdf.pdf', 'wb') as f:
    pdf_writer.write(f)

內容解密:

上述程式碼展示瞭如何使用PyPDF2和python-docx函式庫結合PDF和Word檔案。首先,我們開啟一個Word檔案,並提取其中的文字。然後,我們建立一個新的PDF檔案,並新增頁面和文字到其中。最後,我們儲存PDF檔案。

圖表翻譯:

下圖展示了PyPDF2和python-docx函式庫的架構: 上述圖表展示了PyPDF2和python-docx函式庫的架構。PyPDF2函式庫用於讀取和修改PDF檔案,而python-docx函式庫用於讀取和修改Word檔案。兩個函式庫可以結合使用,以實作複雜的檔案處理任務。

讀取 Word 檔案的內容

要讀取 Word 檔案(.docx)的內容,可以使用 Python 的 python-docx 函式庫。以下是如何定義一個函式 get_text() 來讀取 Word 檔案的內容:

import docx

def get_text(filename):
    doc = docx.Document(filename)
    full_text = []
    for para in doc.paragraphs:
        full_text.append(para.text)
    return '\n'.join(full_text)

這個函式開啟 Word 檔案,遍歷所有段落物件,並將每個段落的文字追加到 full_text 清單中。然後,使用 \n 連線所有文字,傳回結果。

調整輸出內容

您也可以調整 get_text() 函式來修改輸出內容。例如,要縮排每個段落,可以替換 append() 呼叫為:

full_text.append('    ' + para.text)

要在段落之間新增雙空格,可以更改 join() 呼叫為:

return '\n\n'.join(full_text)

樣式和段落物件

Word 和其他文書處理器使用樣式來保持文字的視覺呈現的一致性和易於更改。例如,您可以建立一個樣式,設定所有正文段落為 11 點、Times New Roman、左對齊、右邊不對齊的文字。然後,您可以將這個樣式賦予所有正文段落。

範例使用

您可以像匯入其他模組一樣匯入 readDocx.py 程式。現在,如果您需要只得到 Word 檔案的文字,可以輸入以下內容:

>>> import readDocx
>>> print(readDocx.get_text('demo.docx'))

這將輸出 Word 檔案的內容。

Plantuml 圖表:Word 檔案結構

圖表翻譯:

這個 Plantuml 圖表展示了 Word 檔案的結構。Word 檔案包含多個段落,每個段落包含文字。文字可以具有樣式,樣式決定了視覺呈現。

程式碼解說

import docx

def get_text(filename):
    # 開啟 Word 檔案
    doc = docx.Document(filename)
    
    # 建立一個清單來儲存所有段落的文字
    full_text = []
    
    # 遍歷所有段落物件
    for para in doc.paragraphs:
        # 追加每個段落的文字到清單中
        full_text.append(para.text)
    
    # 連線所有文字,傳回結果
    return '\n'.join(full_text)

內容解密:

這個程式碼定義了一個函式 get_text(),用於讀取 Word 檔案的內容。函式開啟 Word 檔案,遍歷所有段落物件,並將每個段落的文字追加到一個清單中。然後,使用 \n 連線所有文字,傳回結果。

檔案樣式及格式設定

在建立和編輯 Word 檔案時,樣式和格式設定是非常重要的。這些設定可以幫助您快速地更改檔案的外觀和結構。以下是如何使用 Python-Docx 來設定檔案樣式和格式的步驟。

樣式設定

Python-Docx 提供了多種樣式設定,包括段落樣式、字元樣式和連結樣式。您可以使用 style 屬性來設定段落或字元的樣式。

import docx

# 建立一個新的 Word 檔案
doc = docx.Document()

# 新增一個段落並設定其樣式
paragraph = doc.add_paragraph('Hello, world!', 'Title')

# 儲存檔案
doc.save('example.docx')

格式設定

除了樣式設定外,Python-Docx 還提供了多種格式設定,包括粗體、斜體、下劃線等。您可以使用 bolditalicunderline 等屬性來設定字元的格式。

import docx

# 建立一個新的 Word 檔案
doc = docx.Document()

# 新增一個段落
paragraph = doc.add_paragraph()

# 新增一個字元並設定其格式
run = paragraph.add_run('Hello, world!')
run.bold = True  # 粗體
run.italic = True  # 斜體
run.underline = True  # 下劃線

# 儲存檔案
doc.save('example.docx')

檔案結構

Python-Docx 還提供了多種方法來建立和編輯檔案結構,包括新增段落、新增字元、新增表格等。

import docx

# 建立一個新的 Word 檔案
doc = docx.Document()

# 新增一個段落
paragraph = doc.add_paragraph('Hello, world!')

# 新增一個表格
table = doc.add_table(rows=2, cols=2)

# 儲存檔案
doc.save('example.docx')

圖表和圖片

Python-Docx 還提供了多種方法來新增圖表和圖片到檔案中。

import docx

# 建立一個新的 Word 檔案
doc = docx.Document()

# 新增一個圖片
doc.add_picture('example.png')

# 儲存檔案
doc.save('example.docx')
內容解密:
  • docx.Document():建立一個新的 Word 檔案。
  • add_paragraph():新增一個段落到檔案中。
  • add_run():新增一個字元到段落中。
  • style:設定段落或字元的樣式。
  • bolditalicunderline:設定字元的格式。
  • add_table():新增一個表格到檔案中。
  • add_picture():新增一個圖片到檔案中。

圖表翻譯:

圖表說明:

  • 建立 Word 檔案:使用 docx.Document() 建立一個新的 Word 檔案。
  • 新增段落:使用 add_paragraph() 新增一個段落到檔案中。
  • 設定樣式:使用 style 屬性設定段落或字元的樣式。
  • 新增字元:使用 add_run() 新增一個字元到段落中。
  • 設定格式:使用 bolditalicunderline 等屬性設定字元的格式。
  • 新增表格:使用 add_table() 新增一個表格到檔案中。
  • 新增圖片:使用 add_picture() 新增一個圖片到檔案中。
  • 儲存檔案:使用 save() 方法儲存檔案。

檔案編輯與處理

檔案編輯與處理是電腦科學中的一個重要領域,涉及到對不同格式的檔案進行讀寫、編輯和處理。在本章中,我們將探討如何使用Python程式語言來處理Word檔案和PDF檔案。

新增標題

新增標題是Word檔案編輯的一個基本功能。使用add_heading()方法可以新增一個標題,該方法需要兩個引數:標題文字和標題級別。標題級別可以從0到4,分別對應不同的標題風格。

import docx
doc = docx.Document()
doc.add_heading('Header 0', 0)
doc.add_heading('Header 1', 1)
doc.add_heading('Header 2', 2)
doc.add_heading('Header 3', 3)
doc.add_heading('Header 4', 4)
doc.save('headings.docx')

新增換行和頁面換行

新增換行和頁面換行是Word檔案編輯的一個重要功能。使用add_break()方法可以新增一個換行,該方法需要一個引數:換行型別。使用docx.enum.text.WD_BREAK.PAGE可以新增一個頁面換行。

doc = docx.Document()
doc.add_paragraph('This is on the first page!')
doc.paragraphs[0].runs[0].add_break(docx.enum.text.WD_BREAK.PAGE)
doc.add_paragraph('This is on the second page!')
doc.save('twoPage.docx')

新增圖片

新增圖片是Word檔案編輯的一個重要功能。使用add_picture()方法可以新增一個圖片,該方法需要兩個引數:圖片檔名和圖片寬度和高度。

doc = docx.Document()
doc.add_picture('zophie.png', width=docx.shared.Inches(1), height=docx.shared.Cm(4))
doc.save('picture.docx')

練習題

  1. PdfWriter物件的File物件需要以什麼模式開啟才能儲存PDF檔案?
  2. 如何從PdfReader或PdfWriter物件中獲得第5頁的Page物件?
  3. 如果PdfReader物件的PDF檔案使用密碼swordfish加密,如何在獲得Page物件之前進行解密?
  4. 如果rotate()方法順時針旋轉頁面,如何逆時針旋轉頁面?
  5. 如何獲得一個名為demo.docx的檔案的Document物件?
  6. Paragraph物件和Run物件之間有什麼區別?

圖表翻譯:

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Python高效合併與處理PDF和Word檔案

package "Python 應用架構" {
    package "應用層" {
        component [主程式] as main
        component [模組/套件] as modules
        component [設定檔] as config
    }

    package "框架層" {
        component [Web 框架] as web
        component [ORM] as orm
        component [非同步處理] as async
    }

    package "資料層" {
        database [資料庫] as db
        component [快取] as cache
        component [檔案系統] as fs
    }
}

main --> modules : 匯入模組
main --> config : 載入設定
modules --> web : HTTP 處理
web --> orm : 資料操作
orm --> db : 持久化
web --> cache : 快取查詢
web --> async : 背景任務
async --> fs : 檔案處理

note right of web
  Flask / FastAPI / Django
end note

@enduml

內容解密:

上述程式碼示範瞭如何使用python-docx函式庫來編輯Word檔案。首先,建立一個Document物件,然後使用add_heading()方法新增標題,使用add_break()方法新增換行和頁面換行,使用add_picture()方法新增圖片。最後,使用save()方法儲存檔案。這些方法提供了許多功能,可以用來編輯和處理Word檔案。

7. 如何為儲存在變數 doc 中的 Document 物件獲得 Paragraph 物件列表?

您可以使用 doc.paragraphs 屬性來獲得 Paragraph 物件列表。

8. 什麼型別的物件具有粗體、下劃線、斜體、刪除線和輪廓變數?

Run 物件具有這些屬性。

9. 將粗體變數設定為 True、False 或 None 之間的區別是什麼?

設定為 True 時,文字將以粗體顯示;設定為 False 時,文字將以正常字型顯示;設定為 None 時,文字將繼承其父級的粗體設定。

10. 如何為新的 Word 檔案建立 Document 物件?

您可以使用 python-docx 函式庫的 Document() 函式來建立新的 Document 物件。

從技術架構視角來看,Python 提供了強大的函式庫,例如 PyPDF2 和 python-docx,讓開發者能有效率地操作 PDF 和 Word 檔案。深入剖析這些函式庫的核心功能,可以發現它們提供了豐富的 API,涵蓋了檔案建立、合併、修改、樣式設定等方面,大大簡化了檔案處理的流程。然而,這些函式庫也存在一些限制,例如 PyPDF2 在處理複雜的 PDF 檔案(例如包含多媒體或互動元素)時可能遇到困難,而 python-docx 在處理舊版 Word 檔案(.doc)時需要額外依賴其他函式庫。技術團隊應著重於理解這些限制,並根據實際需求選擇合適的解決方案,例如使用其他專門的函式庫或工具來處理特定型別的檔案。對於重視自動化辦公和檔案處理的企業,善用這些 Python 函式庫將能有效提升工作效率,並降低人力成本。玄貓認為,隨著這些函式庫的持續發展和社群的積極貢獻,Python 在檔案處理領域的應用將更加廣泛和深入。