iT邦幫忙

2

透過Python處理英文 PDF 論文或大量英文文本設計的自動化翻譯工具

  • 分享至 

  • xImage
  •  

該程式利用 Python 開發,結合多個強大的文本處理與翻譯工具,為用戶提供了一個從 PDF 論文到翻譯後 Word 文檔的全自動流程。主要適用於需要快速掌握大量英文資料、文獻或技術報告的場景,特別是學術研究者、專業技術人員或需要跨語言工作的從業者。
https://ithelp.ithome.com.tw/upload/images/20250107/2016725622TVzQ11JZ.jpg


  1. 建置 Python 環境
    安裝 Python,確保已包含 pip 工具。
  2. 創建資料夾
    英文 PDF 資料夾:放入需要翻譯的 PDF 文件(例如 englishpdf 資料夾)。
    翻譯後資料夾:用於存放翻譯完成的 Word 文件(例如 cn 資料夾,預設為空)。
  3. 在 CMD 中安裝必要模組
    執行以下命令依次安裝所需的 Python 套件:
C:/Program Files/Python312/python.exe" -m pip install googletrans==4.0.0-rc1
C:/Program Files/Python312/python.exe" -m pip install opencc-python-reimplemented
C:/Program Files/Python312/python.exe" -m pip install python-docx
C:/Program Files/Python312/python.exe" -m pip install pdfplumber
  1. 修改程式內路徑(更新程式中以下路徑為你的資料夾位置)
    en_pdf_folder = r"你的英文 PDF 資料夾路徑"
    cn_word_folder = r"你的翻譯後文檔存放路徑"
  2. 執行程式
    翻譯完成後,檢查 cn 資料夾中的 Word 文件即可。

  • 運行流程
  1. 初始化環境與資料夾
    設定英文 PDF 存放資料夾和翻譯後文件的存放資料夾,如果翻譯後的資料夾不存在,程式會自動建立。
  2. 初始化翻譯工具
    使用 Google 翻譯(googletrans)進行英文到中文的翻譯。
    使用 OpenCC (opencc) 將翻譯結果由簡體轉為繁體中文。
  3. 逐檔處理 PDF
    遍歷 en_pdf_folder 資料夾內的每個 PDF 文件,為每個 PDF 設定對應的翻譯後 Word 文件的存放路徑。
  4. PDF 翻譯到 Word 的完整流程
    文本提取:利用 pdfplumber 提取 PDF 文件中的文字內容。
    分段處理:將長文本切分成不超過 3000 字元的小段,避免 Google 翻譯的限制。
    逐段翻譯:對每段文字進行翻譯,並透過 OpenCC 轉為繁體中文。
    合併結果:將翻譯後的所有段落合併為一整篇文字。
    保存為 Word 文件:將翻譯完成的文本保存為 Word 文件,並存入 cn_word_folder。
  5. 錯誤處理與重試機制
    若翻譯過程中出現問題,程式會重試最多 3 次,並在重試間隔等待 2 秒。
    若多次嘗試後仍失敗,該段文本將保留原文,程式繼續處理下一段或下一文件。
  6. 完成與輸出
    翻譯完成後,顯示已成功處理的檔案及其存放路徑。
  • 含式解釋
PDF 文字擷取
import pdfplumber
翻譯
from googletrans import Translator
from opencc import OpenCC
Word 文件處理
from docx import Document
將長字串分割成多個小段的函式。適用於將大段文字分割成較小的部分,避免一次翻譯過多字元而導致翻譯工具失敗。
def chunk_text(text, chunk_size=3000):
翻譯單段文字的函式。支援多次重試與簡繁體轉換,保證翻譯結果的準確性和穩定性。
def translate_chunk(chunk, translator, opencc, max_retry=3, wait_secs=2):
提取 PDF 文件文字內容的函式。通過 pdfplumber 從 PDF 文件的每一頁提取文字,並將其合併為一個完整的文本。
def read_pdf_text(pdf_path):
將翻譯後的文字內容保存為 Word 文件的函式。每一行文字將作為 Word 文件中的一段。
def save_translated_to_word(translated_text, output_word_path):
完整的 PDF 翻譯至 Word 文件的流程。包含提取文本、分段翻譯、簡繁轉換,以及生成翻譯後的 Word 文件。
def translate_pdf_to_word(pdf_path, output_word_path, translator, opencc):
主程式入口。設定資料夾路徑,初始化翻譯工具,並遍歷資料夾內的所有 PDF 文件,執行翻譯與保存流程。
def main():
  • 完整程式
import os
import time
import pdfplumber
from googletrans import Translator
from opencc import OpenCC
from docx import Document

def chunk_text(text, chunk_size=3000):
    chunks = []
    start = 0
    while start < len(text):
        end = start + chunk_size
        chunks.append(text[start:end])
        start = end
    return chunks

def translate_chunk(chunk, translator, opencc, max_retry=3, wait_secs=2):
    for attempt in range(max_retry):
        try:
            result = translator.translate(chunk, src='en', dest='zh-TW')
            translated_text = result.text
            translated_text = opencc.convert(translated_text)
            return translated_text
        except Exception as e:
            print(f"翻譯失敗: {e}")
            if attempt < max_retry - 1:
                print(f"稍等 {wait_secs} 秒後重試...")
                time.sleep(wait_secs)
            else:
                print("多次嘗試仍失敗,保留原文。")
                return chunk

def read_pdf_text(pdf_path):
    all_text_list = []
    with pdfplumber.open(pdf_path) as pdf:
        for page in pdf.pages:
            page_text = page.extract_text()
            if page_text:
                all_text_list.append(page_text)
    entire_text = "\n".join(all_text_list)
    return entire_text

def save_translated_to_word(translated_text, output_word_path):
    doc = Document()
    for line in translated_text.split("\n"):
        doc.add_paragraph(line)
    doc.save(output_word_path)

def translate_pdf_to_word(pdf_path, output_word_path, translator, opencc):
    entire_text = read_pdf_text(pdf_path)
    print(f"[DEBUG] 原文長度: {len(entire_text)}")
    text_chunks = chunk_text(entire_text, 3000)
    translated_results = []
    for chunk in text_chunks:
        t_chunk = translate_chunk(chunk, translator, opencc)
        translated_results.append(t_chunk)
    final_text = "\n".join(translated_results)
    print(f"[DEBUG] 翻譯後長度: {len(final_text)}")
    save_translated_to_word(final_text, output_word_path)

def main():
    en_pdf_folder = r"C:\Users\chenchen\Desktop\chenchen_code\pdf_file_translation\englishpdf"
    cn_word_folder = r"C:\Users\chenchen\Desktop\chenchen_code\pdf_file_translation\cn"

    if not os.path.exists(cn_word_folder):
        os.makedirs(cn_word_folder)

    translator = Translator()
    opencc = OpenCC('s2t')

    for filename in os.listdir(en_pdf_folder):
        if filename.endswith(".pdf"):
            pdf_path = os.path.join(en_pdf_folder, filename)
            word_filename = os.path.splitext(filename)[0] + ".docx"
            output_word_path = os.path.join(cn_word_folder, word_filename)

            print(f"正在處理: {filename}")
            try:
                translate_pdf_to_word(pdf_path, output_word_path, translator, opencc)
                print(f"翻譯完成,保存至: {output_word_path}")
            except Exception as e:
                print(f"處理失敗: {filename}, 錯誤: {e}")

if __name__ == "__main__":
    main()


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言