做一个英文PDF转化为中文PDF的系统

server/2024/10/22 12:39:35/

以下是基于本地模型的PDF翻译系统的完整设计和代码实现,支持术语表的导入,并保留PDF的原有格式。

系统设计概述

本系统的目标是将英文PDF文件翻译成中文,并保持原有的排版和格式(如字体、图片、表格等)不变,同时支持导入术语表,确保特定的术语得到精确翻译。

功能模块
  1. PDF 文件解析模块

    • 负责解析PDF文件,提取文本、段落、图像、表格等信息,并保留其格式。
  2. 术语表管理模块

    • 支持用户上传术语表(CSV 或 Excel 格式),将特定的术语及其翻译映射存储在字典中。
  3. 本地翻译模型模块

    • 使用 Hugging Face 提供的 MarianMT 或 mBART 模型进行本地翻译,不依赖在线API。
  4. 格式重建与PDF生成模块

    • 在翻译完成后,按照原有的PDF格式生成新的PDF文件,保持翻译后的内容与原文件一致。
  5. 优化与扩展

    • 系统支持异步任务处理,能够高效处理大文件,并为不同行业配置不同的术语表。

代码实现

1. PDF 解析模块

使用 PyMuPDF 提取文本并保留格式。


import pymupdfdef 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_contentif __name__ == '__main__':context=extract_text_from_pdf("pdftest.pdf")print(context)
2. 术语表管理模块

从 CSV 或 Excel 文件导入术语表,并使用字典存储术语的映射。

import pandas as pddef load_terms(terms_file):# 假设术语表格式是英文列和中文列terms_df = pd.read_csv(terms_file)  # 可扩展为Excelterms_dict = dict(zip(terms_df['English'], terms_df['Chinese']))return terms_dictdef 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 模型,进行英文到中文的翻译。

from transformers import MarianMTModel, MarianTokenizerdef 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, modeldef 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. 翻译结合术语表

在翻译文本前先用术语表替换术语,再用本地模型翻译其余文本。

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,保持原有排版和格式。

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letterdef 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. 主流程

整合上述模块,形成翻译流程。

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)

系统功能说明

  1. 术语表支持:通过导入用户定义的术语表,在翻译时优先处理特定词汇,确保术语翻译的准确性。

  2. 本地模型:使用本地的 MarianMT 模型进行高效翻译,不依赖在线API,保证隐私与数据安全。

  3. 格式保留:在翻译完成后,PDF的段落、字体、表格等格式保持不变,生成的PDF文件与原文件视觉效果一致。

  4. 可扩展性:可以扩展为支持更多翻译模型(如 mBART),并处理复杂的 PDF 元素(如图像、表格等)。


进一步优化建议

  • 并行处理:对于大型PDF文件,可以对每一页的文本翻译过程并行化,以提高效率。
  • 文本块优化:在提取文本时,可以对文本进行预处理(如去除多余的空格、断行符等),以提高翻译质量。
  • 术语表管理:为用户提供术语表的编辑和维护界面,使得系统能针对不同行业或领域定制翻译内容。

通过这样的设计,你能够实现一套完整且高效的PDF翻译系统,并确保在不调用在线API的情况下,通过本地模型翻译英文PDF为中文,且保留原有格式。


http://www.ppmy.cn/server/133896.html

相关文章

【Flutter】Dart:异步

在现代应用开发中,异步编程是不可或缺的部分,尤其是在开发用户界面、网络请求、文件操作等涉及长时间执行的操作时,异步能避免阻塞主线程,从而提升应用的响应速度和用户体验。在 Dart 中,异步编程主要依靠 Future 和 S…

RocketMQ | 源码分析 | 消息刷盘

一、前言 在上篇文章中,我们分析了消息是如何从 Broker 最终存储到MappedFile 内存缓冲区中的,但是此时消息存储的任务并没有完成,因为消息还没有刷盘,即存储到文件中,本篇我们就来看看RocketMQ是如何进行消息刷盘的。…

Blender快捷键alt+A对齐没有反应/无效的解决方案(备忘录03)

目录 MACHIN3下载地址: 如果altA无效,那么有几个情况 没有正确安装MACHIN3,或者安装的版本与Blender版本冲突。 AltA快捷键与其他软件的快捷键冲突。 (本人最终解决方案)没有打开对齐饼菜单 测试结果 AltA快捷键…

在 gRPC 中,客户端和服务端的 Protocol Buffers(Protobuf)生成的文件必须保持一致性,以确保通信正常。

在 gRPC 中,客户端和服务端的 Protocol Buffers(Protobuf)生成的文件必须保持一致性,以确保通信正常。 关键点 相同的 .proto 文件: 客户端和服务端应该使用相同的 .proto 文件定义服务和消息结构。这确保了双方对数据…

数据库相关操作

1. 创建数据库 首先,使用 CREATE DATABASE 语句来创建一个新的数据库。 CREATE DATABASE my_database; 2. 使用数据库 创建数据库后,使用 USE 语句切换到这个数据库。 USE my_database; 3. 创建表 接下来,在数据库中创建一张表。表中…

python画图| 对齐图名和标签

【1】引言 学习了很多python画图教程之后,我们会发现:一些最基本的设置往往对图形的表达具有至关重要的影响。 因此,我们暂时回过头来,对一些基础知识进行加强。 今天,就一起学习如何对齐图名和标签。 【2】官网教…

解锁Claude五大能力,带你使用更加强大的Claude

很多人都听说过这样一句话:"想要AI生成更好的答案,你必须提供清晰、有效的提示。" 这句话现在可谓是家喻户晓。 然而,即便知道这个道理,很多人仍然不知道该如何写出好的提示词。他们常常面对空白的输入框,…

大厂面试真题-说一下推和拉的模式以及常见的使用

Pull(拉)模式和Push(推)模式是消息传递中的两种基本机制,它们在消息中间件和注册中心中的应用广泛而多样。 Pull(拉)模式 Pull模式是一种消息消费模式,其中客户端主动从服务端拉取…