一、使用pdfminer提取
import os
import re
from pdfminer.high_level import extract_text
import docx2txt
import jiebadef read_pdf(file_path):"""讀取 PDF 文件內容:param file_path: PDF 文件路徑:return: 文件內容文本"""try:text = extract_text(file_path)return textexcept Exception as e:print(f"讀取 PDF 文件 {file_path} 時出錯: {e}")return Nonedef read_docx(file_path):"""讀取 Word 文件內容:param file_path: Word 文件路徑:return: 文件內容文本"""try:text = docx2txt.process(file_path)return textexcept Exception as e:print(f"讀取 Word 文件 {file_path} 時出錯: {e}")return Nonedef clean_text(text):"""清理文本,去除無關字符和空白行:param text: 原始文本:return: 清理后的文本"""if text is None:return None# 去除特殊字符text = re.sub(r'[^\u4e00-\u9fa5a-zA-Z0-9\s]', '', text)# 去除多余的空白行text = re.sub(r'\n+', '\n', text).strip()return textdef tokenize_text(text):"""對文本進行分詞:param text: 輸入文本:return: 分詞后的字符串,以空格分隔"""if text is None:return ""return " ".join(jieba.lcut(text))def preprocess_files(folder_path, output_folder):"""對指定文件夾中的 PDF 和 Word 文件進行預處理,并保存處理后的結果:param folder_path: 包含原始文件的文件夾路徑:param output_folder: 保存處理后文件的文件夾路徑"""if not os.path.exists(output_folder):os.makedirs(output_folder)for root, dirs, files in os.walk(folder_path):for file in files:file_path = os.path.join(root, file)if file.endswith('.pdf'):text = read_pdf(file_path)elif file.endswith('.docx'):text = read_docx(file_path)else:continuecleaned_text = clean_text(text)tokenized_text = tokenize_text(cleaned_text)# 生成輸出文件名file_name, _ = os.path.splitext(file)output_file_path = os.path.join(output_folder, f"{file_name}_processed.txt")# 保存處理后的文本到文件with open(output_file_path, 'w', encoding='utf-8') as f:f.write(tokenized_text)print(f"處理并保存文件: {output_file_path}")# 示例使用
if __name__ == "__main__":input_folder = 'your_input_folder_path' # 替換為實際包含 PDF 和 Word 文件的文件夾路徑output_folder = 'your_output_folder_path' # 替換為實際保存處理后文件的文件夾路徑preprocess_files(input_folder, output_folder)
代碼解釋
-
tokenize_text
函數修改:此函數將分詞后的結果用空格連接成字符串,方便后續保存到文件。 -
preprocess_files
函數擴展:- 增加了
output_folder
參數,用于指定保存處理后文件的文件夾路徑。 - 檢查輸出文件夾是否存在,如果不存在則創建。
- 對于每個處理后的文件,生成對應的輸出文件名,格式為原文件名加上
_processed.txt
。 - 使用
with open
語句將處理后的文本寫入到對應的輸出文件中。
- 增加了
-
主程序調用:需要將
your_input_folder_path
替換為實際包含 PDF 和 Word 文件的文件夾路徑,將your_output_folder_path
替換為實際保存處理后文件的文件夾路徑。運行代碼后,處理后的文本將保存到指定的輸出文件夾中。 -
測試相對路徑:
# 打印絕對路徑#使用os.path.exists 函數檢查輸入和輸出路徑是否存在abs_input_folder = os.path.abspath(input_folder)abs_output_folder = os.path.abspath(output_folder)print(f"輸入文件夾的絕對路徑: {abs_input_folder}")print(f"輸出文件夾的絕對路徑: {abs_output_folder}")# 檢查路徑是否存在if os.path.exists(abs_input_folder):print("輸入文件夾路徑存在。")else:print("輸入文件夾路徑不存在。")preprocess_files(input_folder, output_folder)
二、其他庫和軟件
除了 pdfminer
外,還有許多其他可以提取 PDF 文本的工具:
Python 庫
1. PyPDF2
- 特點:一個純 Python 編寫的庫,用于處理 PDF 文件,功能較為基礎,能夠實現簡單的文本提取、合并、分割等操作,使用起來比較簡單。
- 示例代碼
import PyPDF2def extract_text_pypdf2(pdf_path):text = ""with open(pdf_path, 'rb') as file:pdf_reader = PyPDF2.PdfReader(file)num_pages = len(pdf_reader.pages)for page_num in range(num_pages):page = pdf_reader.pages[page_num]text += page.extract_text()return textpdf_path = 'your_pdf_file.pdf'
extracted_text = extract_text_pypdf2(pdf_path)
print(extracted_text)
2. pdfplumber
- 特點:基于
pdfminer
開發,提供了更高級、更方便的 API,能夠處理更復雜的 PDF 布局,支持表格提取、頁面分析等功能,對于具有結構化數據的 PDF 文件處理效果較好。 - 示例代碼
import pdfplumberdef extract_text_pdfplumber(pdf_path):text = ""with pdfplumber.open(pdf_path) as pdf:for page in pdf.pages:text += page.extract_text()return textpdf_path = 'your_pdf_file.pdf'
extracted_text = extract_text_pdfplumber(pdf_path)
print(extracted_text)
3. tika
- 特點:是基于 Apache Tika 的 Python 封裝,Tika 是一個強大的內容分析工具,支持多種文件格式的解析,包括 PDF。它可以處理各種復雜的 PDF 文件,并且能夠自動檢測文件類型和編碼。
- 示例代碼
from tika import parserdef extract_text_tika(pdf_path):parsed = parser.from_file(pdf_path)return parsed['content']pdf_path = 'your_pdf_file.pdf'
extracted_text = extract_text_tika(pdf_path)
print(extracted_text)
獨立軟件工具
1. Adobe Acrobat Pro DC
- 特點:Adobe 公司開發的專業 PDF 編輯軟件,功能強大,除了文本提取外,還支持 PDF 的創建、編輯、注釋、簽名等多種操作。可以通過復制粘貼或導出為其他格式(如文本、Word 等)來提取 PDF 中的文本。
- 操作步驟:打開 PDF 文件,選擇“文件” - “另存為”,在保存類型中選擇“純文本”,然后指定保存路徑和文件名即可。
2. Smallpdf
- 特點:一款在線 PDF 處理工具,提供了多種 PDF 處理功能,包括文本提取。無需安裝軟件,只需在瀏覽器中訪問其網站,上傳 PDF 文件,即可快速提取文本。支持免費使用,但對文件大小和處理次數有一定限制。
- 操作步驟:訪問 Smallpdf 網站,選擇“PDF 轉 TXT”功能,上傳 PDF 文件,等待處理完成后下載提取的文本文件。
3. Nitro Pro
- 特點:一款功能豐富的 PDF 處理軟件,支持文本提取、編輯、轉換等多種操作。具有直觀的用戶界面和高效的處理速度,適合個人和企業用戶使用。
- 操作步驟:打開 PDF 文件,選擇“轉換” - “導出為”,在導出格式中選擇“文本”,然后設置相關參數并保存文件。