以下是基于本地模型的PDF翻译系统的完整设计和代码实现,支持术语表的导入,并保留PDF的原有格式。
系统设计概述
本系统的目标是将英文PDF文件翻译成中文,并保持原有的排版和格式(如字体、图片、表格等)不变,同时支持导入术语表,确保特定的术语得到精确翻译。
功能模块
-
PDF 文件解析模块:
- 负责解析PDF文件,提取文本、段落、图像、表格等信息,并保留其格式。
-
术语表管理模块:
- 支持用户上传术语表(CSV 或 Excel 格式),将特定的术语及其翻译映射存储在字典中。
-
本地翻译模型模块:
- 使用 Hugging Face 提供的 MarianMT 或 mBART 模型进行本地翻译,不依赖在线API。
-
格式重建与PDF生成模块:
- 在翻译完成后,按照原有的PDF格式生成新的PDF文件,保持翻译后的内容与原文件一致。
-
优化与扩展:
- 系统支持异步任务处理,能够高效处理大文件,并为不同行业配置不同的术语表。
代码实现
1. PDF 解析模块
使用 PyMuPDF
提取文本并保留格式。
python
import pymupdf
def extract_text_from_pdf(pdf_path):
doc = pymupdf.open(pdf_path)
pdf_content = []
for page_num in range(len(doc)):
page = doc.load_page(page_num)
text = page.get_text("text")
blocks = page.get_text("dict")["blocks"]
pdf_content.append({
"text": text,
"blocks": blocks, # 用于保留格式信息
})
return pdf_content
if __name__ == '__main__':
context=extract_text_from_pdf("pdftest.pdf")
print(context)
2. 术语表管理模块
从 CSV 或 Excel 文件导入术语表,并使用字典存储术语的映射。
python
import pandas as pd
def load_terms(terms_file):
# 假设术语表格式是英文列和中文列
terms_df = pd.read_csv(terms_file) # 可扩展为Excel
terms_dict = dict(zip(terms_df['English'], terms_df['Chinese']))
return terms_dict
def replace_terms(text, terms_dict):
# 替换文本中的术语
for eng_term, zh_term in terms_dict.items():
text = text.replace(eng_term, zh_term)
return text
3. 本地翻译模型模块
加载 MarianMT 模型,进行英文到中文的翻译。
python
from transformers import MarianMTModel, MarianTokenizer
def load_translation_model():
model_name = 'Helsinki-NLP/opus-mt-en-zh'
tokenizer = MarianTokenizer.from_pretrained(model_name)
model = MarianMTModel.from_pretrained(model_name)
return tokenizer, model
def translate_text(text, tokenizer, model):
tokenized_text = tokenizer(text, return_tensors="pt", padding=True, truncation=True)
translated_tokens = model.generate(**tokenized_text)
translated_text = tokenizer.decode(translated_tokens[0], skip_special_tokens=True)
return translated_text
4. 翻译结合术语表
在翻译文本前先用术语表替换术语,再用本地模型翻译其余文本。
python
def translate_with_terms(text, terms_dict, tokenizer, model):
# 先进行术语替换
text_with_terms = replace_terms(text, terms_dict)
# 对剩余文本进行翻译
translated_text = translate_text(text_with_terms, tokenizer, model)
return translated_text
5. 保持格式生成PDF
使用 PyMuPDF
结合翻译后的文本生成新的 PDF,保持原有排版和格式。
python
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
def generate_translated_pdf(translated_content, output_pdf_path):
c = canvas.Canvas(output_pdf_path, pagesize=letter)
# 假设每页使用相同的格式信息,重绘文本
for page in translated_content:
for block in page['blocks']:
x, y = block['bbox'][:2] # 假设使用边界框信息确定文本位置
translated_text = block['text']
c.drawString(x, y, translated_text) # 重新绘制文本
c.save()
6. 主流程
整合上述模块,形成翻译流程。
python
def main(pdf_path, terms_file, output_pdf_path):
# 步骤 1: 解析 PDF 文件
pdf_content = extract_text_from_pdf(pdf_path)
# 步骤 2: 导入术语表
terms_dict = load_terms(terms_file)
# 步骤 3: 加载本地翻译模型
tokenizer, model = load_translation_model()
# 步骤 4: 翻译内容并保留格式
translated_content = []
for page in pdf_content:
translated_page = {
"blocks": []
}
for block in page["blocks"]:
translated_text = translate_with_terms(block['text'], terms_dict, tokenizer, model)
translated_block = {
"bbox": block['bbox'], # 保留位置
"text": translated_text
}
translated_page["blocks"].append(translated_block)
translated_content.append(translated_page)
# 步骤 5: 生成翻译后的 PDF 文件
generate_translated_pdf(translated_content, output_pdf_path)
系统功能说明
-
术语表支持:通过导入用户定义的术语表,在翻译时优先处理特定词汇,确保术语翻译的准确性。
-
本地模型:使用本地的 MarianMT 模型进行高效翻译,不依赖在线API,保证隐私与数据安全。
-
格式保留:在翻译完成后,PDF的段落、字体、表格等格式保持不变,生成的PDF文件与原文件视觉效果一致。
-
可扩展性:可以扩展为支持更多翻译模型(如 mBART),并处理复杂的 PDF 元素(如图像、表格等)。
进一步优化建议
- 并行处理:对于大型PDF文件,可以对每一页的文本翻译过程并行化,以提高效率。
- 文本块优化:在提取文本时,可以对文本进行预处理(如去除多余的空格、断行符等),以提高翻译质量。
- 术语表管理:为用户提供术语表的编辑和维护界面,使得系统能针对不同行业或领域定制翻译内容。
通过这样的设计,你能够实现一套完整且高效的PDF翻译系统,并确保在不调用在线API的情况下,通过本地模型翻译英文PDF为中文,且保留原有格式。