博客 / 詳情

返回

如何用Python將PDF表格提取到文本、CSV和Excel文件中

從PDF文檔中提取表格並將其轉換為更易於處理的格式(如文本、CSV和Excel文件),是數據分析和信息管理中的常見需求。此過程可顯著簡化表格數據的處理,使數據的操作、分析和與其他數據集的集成更加便捷。無論是財務報表、研究論文,還是包含結構化信息的其他文檔,掌握這些表格準確轉換的方法對於充分發揮數據潛力至關重要。

本文將介紹如何使用簡單的Python代碼從PDF文檔中提取表格數據並將其寫入文本、CSV和Excel文件,從而輕鬆實現PDF表格的自動化提取。

  • 如何使用Python提取PDF表格數據
  • 將PDF表格數據提取為文本文件
  • 將PDF表格數據提取為CSV文件
  • 將PDF表格數據提取到Excel工作表
  • 使用Python直接將PDF轉換為Excel文件

本文所需的庫為Spire.PDF for Python。可通過PyPI安裝:pip install spire.pdf

申請免費License

用於操作的示例PDF:
Python提取PDF表格

如何使用Python提取PDF表格數據

庫中的PdfTableExtractor類用於處理PDF文檔的表格提取。可以通過PdfTableExtractor.ExtractTable(pageIndex: int)方法從PDF頁面中提取表格,並以Utilities_PdfTable對象的集合形式返回表格數據。接着,可通過遍歷表格並使用Utilities_PdfTable.GetCellText(rowIndex: int, columnIndex: int)方法獲取每個單元格中的數據。

提取PDF表格數據的一般步驟如下:

  • 創建一個PdfDocument實例並使用PdfDocument.LoadFromFile()方法加載PDF文檔。
  • 使用該文檔創建PdfTableExtractor實例。
  • 使用PdfTableExtractor.ExtractTable(pageIndex: int)方法提取文檔中每頁的表格。
  • 遍歷每個表格並使用Utilities_PdfTable.GetCellText(rowIndex: int, columnIndex: int)方法獲取單元格值。
  • 將提取的表格數據寫入其他文件。

注意:當使用提取的表格數據構建字符串時,如果單元格文本中包含換行符,最終生成的文本文件中可能會多出額外的換行符。為了避免造成混淆,應將這些換行符去除或替換為空格。

用Python將PDF表格數據提取為文本文件

提取PDF文檔中的表格數據後,可直接將每個表格的數據寫入字符串並保存到文本文件中,從而實現將PDF表格數據導出為文本文件。

具體步驟如下:

  1. 導入所需模塊:PdfDocumentPdfTableExtractor
  2. 創建PdfDocument實例並使用PdfDocument.LoadFromFile()方法加載PDF文檔。
  3. 使用該文檔創建PdfTableExtractor實例。
  4. 使用PdfTableExtractor.ExtractTable(pageIndex: int)方法提取每頁中的表格。
  5. 遍歷提取的表格:

    • 創建一個str對象以存儲表格數據。
    • 使用Utilities_PdfTable.GetCellText(rowIndex: int, columnIndex: int)方法獲取單元格值。
    • 將單元格值追加到str對象中。
    • str對象寫入文件。
  6. 釋放資源。

代碼示例

from spire.pdf import PdfDocument, PdfTableExtractor

# 創建一個 PdfDocument 對象
pdf = PdfDocument()
# 加載一個 PDF 文檔
pdf.LoadFromFile("Sample.pdf")

# 創建一個 PdfTableExtractor 對象
extractor = PdfTableExtractor(pdf)

# 遍歷所有頁面
for pageIndex in range(pdf.Pages.Count):
    # 從每個 PDF 頁面中提取表格
    tables = extractor.ExtractTable(pageIndex)
    # 如果存在多個表格,則遍歷這些表格
    if tables is not None:
        for tableIndex in range(len(tables)):
            # 獲取一個表格
            table = tables[tableIndex]
            # 創建一個字符串對象來存儲表格數據
            tableData = ""
            # 遍歷表格的行和列
            for rowIndex in range(table.GetRowCount()):
                for colIndex in range(table.GetColumnCount()):
                    # 獲取單元格文本
                    text = table.GetText(rowIndex, colIndex)
                    text = text.replace("\n", " ")
                    # 將單元格文本添加到表格數據中
                    tableData += text
                    if colIndex < table.GetColumnCount() - 1:
                        tableData += "\t"
                tableData += "\n"
            # 將表格數據寫入文本文件
            with open(f"output/Tables/Page{pageIndex+1}-Table{tableIndex+1}.txt", "w", encoding="utf-8") as f:
                f.write(tableData)

# 釋放資源
pdf.Dispose()

輸出結果
Python提取PDF表格到文本文件

用Python將PDF表格數據提取為CSV文件

同樣,可以使用類似方法從PDF文檔中提取表格數據,並利用Python標準庫中的CSV模塊將每個表格寫入CSV文件。在此過程中也需注意去除或替換換行符,以改善CSV文件的結果。具體步驟如下:

  1. 導入所需模塊:PdfDocumentPdfTableExtractorCSV
  2. 創建PdfDocument實例並使用PdfDocument.LoadFromFile()方法加載PDF文檔。
  3. 使用該文檔創建PdfTableExtractor實例。
  4. 使用PdfTableExtractor.ExtractTable(pageIndex: int)方法提取每頁中的表格。
  5. 遍歷提取的表格:

    • 創建CSV文件。
    • 遍歷表格中的行並創建列表以存儲行數據。
    • 使用Utilities_PdfTable.GetCellText(rowIndex: int, columnIndex: int)方法獲取每行的單元格值並追加到列表中。
    • 使用csv.writer().writerow()方法將每行寫入CSV文件。
  6. 釋放資源。

代碼示例

from spire.pdf import PdfDocument, PdfTableExtractor
import csv

# 創建一個 PdfDocument 對象
pdf = PdfDocument()
# 加載一個 PDF 文檔
pdf.LoadFromFile("Sample.pdf")

# 創建一個 PdfTableExtractor 對象
extractor = PdfTableExtractor(pdf)

# 遍歷所有頁面
for pageIndex in range(pdf.Pages.Count):
    # 從每個 PDF 頁面中提取表格
    tables = extractor.ExtractTable(pageIndex)
    # 如果存在多個表格,則遍歷這些表格
    if tables is not None:
        for tableIndex in range(len(tables)):
            # 獲取一個表格
            table = tables[tableIndex]
            # 創建一個 CSV 文件
            with open("output/Tables/Page" + str(pageIndex+1) + "-Table" + str(tableIndex+1) + ".csv", "w", newline='', encoding='utf-8') as csvFile:
                writer = csv.writer(csvFile)
                # 遍歷表格的行和列
                for rowIndex in range(table.GetRowCount()):
                    row = []
                    for colIndex in range(table.GetColumnCount()):
                        # 獲取單元格文本
                        text = table.GetText(rowIndex, colIndex)
                        text = text.replace('\n', ' ')
                        row.append(text)
                    writer.writerow(row)

# 釋放資源
pdf.Dispose()

輸出結果
Python提取PDF表格到CSV

用Python將PDF表格數據提取到Excel工作表

可使用另一庫Spire.XLS for Python將提取的PDF表格數據寫入Excel工作表。通過PyPI獲取Spire.PDF for Python:pip install spire.xls
具體步驟如下:

  1. 導入所需模塊:PdfDocumentPdfTableExtractorWorkbookspire.xls.FileFormat
  2. 創建PdfDocument實例並使用PdfDocument.LoadFromFile()方法加載PDF文檔。
  3. 創建Workbook實例用於存儲表格,並使用Workbook.Worksheets.Clear()方法清除默認工作表。
  4. 使用該文檔創建PdfTableExtractor實例。
  5. 使用PdfTableExtractor.ExtractTable(pageIndex: int)方法提取每頁中的表格。
  6. 遍歷提取的表格:

    • 使用Workbook.Worksheets.Add(sheetName: str)方法為每個表格添加工作表。
    • 使用Utilities_PdfTable.GetCellText(rowIndex: int, columnIndex: int)方法獲取表格的單元格值。
    • 通過Worksheet.Range[rowIndex + 1, colIndex + 1].Text屬性將單元格值寫入相應的工作表單元格。
  7. 使用Workbook.SaveToFile()方法保存工作簿。
  8. 釋放資源。

代碼示例

from spire.pdf import PdfDocument, PdfTableExtractor
from spire.xls import Workbook, FileFormat, HorizontalAlignType

# 創建一個 PdfDocument 對象
pdf = PdfDocument()
# 加載一個 PDF 文檔
pdf.LoadFromFile("Sample.pdf")

# 創建一個 Workbook 對象
workbook = Workbook()
# 清除默認的工作表
workbook.Worksheets.Clear()

# 創建一個 PdfTableExtractor 對象
extractor = PdfTableExtractor(pdf)

# 從每個 PDF 頁面中提取表格
for pageIndex in range(pdf.Pages.Count):
    tables = extractor.ExtractTable(pageIndex)
    # 如果存在多個表格,則遍歷這些表格
    if tables is not None:
        for tableIndex in range(len(tables)):
            # 獲取一個表格
            table = tables[tableIndex]
            # 為表格創建一個工作表
            sheet = workbook.Worksheets.Add(f"Page{pageIndex + 1}-Table{tableIndex + 1}")
            # 遍歷表格的行和列
            for rowIndex in range(table.GetRowCount()):
                for colIndex in range(table.GetColumnCount()):
                    # 獲取單元格值
                    text = table.GetText(rowIndex, colIndex)
                    cellText = text.replace("\n", "")
                    # 將單元格值寫入工作表的相應單元格
                    sheet.Range[rowIndex + 1, colIndex + 1].Text = cellText

            # 可選:自定義表格的外觀
            # 設置標題行樣式
            sheet.Rows.get_Item(0).Style.Font.FontName = "Yu Gothic UI"
            sheet.Rows.get_Item(0).Style.Font.Size = 12
            sheet.Rows.get_Item(0).Style.Font.IsBold = True
            sheet.Rows.get_Item(0).Style.HorizontalAlignment = HorizontalAlignType.Center
            # 設置數據行樣式
            for i in range(1, sheet.Rows.Count):
                sheet.Rows.get_Item(i).Style.Font.FontName = "Yu Gothic UI"
                sheet.Rows.get_Item(i).Style.Font.Size = 12
                sheet.Rows.get_Item(i).Style.HorizontalAlignment = HorizontalAlignType.Left
            # 自動調整列寬
            for j in range(1, sheet.Columns.Count):
                sheet.AutoFitColumn(j)

# 保存工作簿
workbook.SaveToFile("output/PDFTableToExcel.xlsx", FileFormat.Version2016)
# 釋放資源
workbook.Dispose()
pdf.Close()

輸出結果
Python提取PDF表格到Excel工作表

使用Python直接將PDF轉換為Excel文件

還可以使用PdfDocument.SaveToFile(fileName: str, FileFormat.XLSX)方法將PDF文檔直接轉換為Excel文件。此方法適用於以表格為主的PDF文檔,有助於儘可能保留表格的原始外觀。
為減少轉換後Excel表格中的空白,可以在轉換前去除PDF文檔的邊距。參考以下文章:
Python刪除PDF文檔的頁邊距

直接將PDF文檔轉換為Excel文件的具體步驟如下:

  1. 導入所需模塊:PdfDocumentFileFormat
  2. 創建一個PdfDocument實例。
  3. 使用PdfDocument.LoadFromFile()方法加載PDF文檔。
  4. 將文檔轉換為Excel文件並使用PdfDocument.SaveToFile(fileName: str, FileFormat.XLSX)方法保存。
  5. 釋放資源。

代碼示例

from spire.pdf import PdfDocument, FileFormat

# 創建一個 PdfDocument 實例
pdf = PdfDocument()

# 加載一個 PDF 文檔
pdf.LoadFromFile("Sample.pdf")

# 將 PDF 文檔轉換為 Excel 文件
pdf.SaveToFile("output/PDFToExcel.xlsx", FileFormat.XLSX)

# 關閉 PDF 文檔
pdf.Close()

輸出結果
Python轉換PDF為Excel

本文展示瞭如何用Python將PDF表格提取到文本、CSV和Excel文件,以及將PDF文檔轉換為Excel工作簿。

user avatar zxsoft 頭像
1 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.