PDF 文档提取并翻译成中文的 Python 代码
Python 代码实现 PDF 提取并翻译成中文
这段代码使用 Python 语言实现 PDF 文档的文本提取功能,并利用百度翻译 API 将英文文本翻译成中文,最终将翻译后的中文内容保存成 TXT 文件。
# -*- coding: gbk -*-
import sys
import io
'Created on Sun Mar 3 12:22:49 2019
@author: Ben'
import importlib
importlib.reload(sys)
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LTTextBoxHorizontal, LAParams
from pdfminer.pdfpage import PDFTextExtractionNotAllowed
#from PyPDF2.pdf import PdfFileReader, PdfFileWriter, ContentStream
import requests
import string
import time
import hashlib
import json
##初始化
api_url = 'http://api.fanyi.baidu.com/api/trans/vip/translate'
api_id = '20230626001725249' ##申请的百度翻译接口的id
cyber = 'vSBko1ueTRx8oIsB7HJh' ##申请的百度翻译接口的password
pdffile = 'white-paper-cubis-ii-compliance-e-data.pdf' ##处理的pdf
ENtextfile = 'ENmultinet.txt' ##存储提取的txt
CNtextfile = 'CNmultinet.txt' ##存储翻译的结果
isTranslate = True ##是否将提取的英文翻译为中文
## 处理PDF
## 读取PDF的内容 filename是待处理的PDF的名字
###使用PDFminer读取
def getDataUsingPyPDF(filename):
parser = PDFParser(open(pdffile, 'rb')) #以二进制打开文件 ,并创建一个pdf文档分析器
doc = PDFDocument(parser) ##创建一个pdf文档
#将文档对象和连接分析器连接起来
parser.set_document(doc)
## doc.set_parser(parser)
## doc.initialize()
parser.set_document(doc)
#判断该pdf是否支持txt转换
if doc.is_extractable:
#创建一个PDF设备对象
rsrcmgr = PDFResourceManager()
#创建一个pdf设备对象
laparamas = LAParams()
device = PDFPageAggregator(rsrcmgr, laparams=laparamas)
#创建一个PDF解释器对象
interpreter = PDFPageInterpreter(rsrcmgr, device)
contents = '' #保存读取的text
#依次读取每个page的内容
## for page in doc.get_pages():
## interpreter.process_page(page)
pages = PDFPage.create_pages(doc)
for page in pages:
interpreter.process_page(page)
layout = device.get_result() # 这里layout是一个LTPage对象 里面存放着 这个page解析出的各种对象 一般包括LTTextBox, LTFigure, LTImage, LTTextBoxHorizontal 等等 想要获取文本就获得对象的text属性,
#在windows下,新文件的默认编码是gbk编码,所以我们在写入文件的时候需要设置一个编码格式,如下:
for x in layout:
if(isinstance(x, LTTextBoxHorizontal)):
results = x.get_text()
results = results.replace('\n', '') #去掉换行符 因为排版问题 有的换行导致句子中断
contents += (results)
##为了看着舒服,每一句为一行
saveText(contents.replace('.', '.\n'), ENtextfile)
return contents
## 将读取的content以txt格式存放到本地
def saveText(content, Textfile):
with open(Textfile, 'w', encoding='utf-8') as f:
f.write(content)
## 翻译从pdf提取的content
def translate(content):
salt = str(time.time())[:10]
final_sign = str(api_id) + content + salt + cyber
final_sign = hashlib.md5(final_sign.encode('utf-8')).hexdigest()
# from to 代表翻译的语言
paramas = {
'q': content,
'from': 'en',
'to': 'zh',
'appid': '%s' % api_id,
'salt': '%s' % salt,
'sign': '%s' % final_sign
}
my_url = api_url + '?appid=' + str(api_id) + '&q=' + content + '&from=' + 'zh' + '&to=' + 'en' + '&salt=' + salt + '&sign=' + final_sign
response = requests.get(api_url, params=paramas).content
content = str(response, encoding='utf-8')
try:
json_reads = json.loads(content)
return json_reads['trans_result'][0]['dst'] + ' '
except:
print('翻译出错,跳过该句子')
return content + ' '
###
content = getDataUsingPyPDF(pdffile)
print('读取pdf成功,将其保存为txt格式')
if(isTranslate):
clist = content.split('.') #split() 通过指定.将英文分成多个句子
i = 0
chinese = ''
print('一共有' + str(clist.__len__()) + '行需要翻译')
print('开始翻译...请耐心等待')
while(i < clist.__len__()):
chinese += (translate(clist[i]).replace('\n', '。'))
#chinese += '\n'
i += 1
saveText(chinese, CNtextfile)
print('翻译结束,ok')
代码说明:
- 代码首先导入必要的库,包括用于处理 PDF 文档的
pdfminer库,用于网络请求的requests库,以及用于处理 JSON 数据的json库等。 - 代码定义了
getDataUsingPyPDF函数,用于读取 PDF 文档并提取文本内容,并将提取的文本内容保存到本地文件ENmultinet.txt中。 - 代码定义了
translate函数,用于将英文文本翻译成中文,该函数使用百度翻译 API 来完成翻译功能。 - 代码定义了
saveText函数,用于将文本内容保存到本地文件。 - 代码的主程序部分首先调用
getDataUsingPyPDF函数提取 PDF 文档的文本内容,然后根据用户的设置判断是否需要将提取的英文文本翻译成中文。如果需要翻译,则调用translate函数将每个句子翻译成中文,并将翻译后的中文文本保存到本地文件CNmultinet.txt中。
错误处理:
代码中增加了 try...except 块,用于捕获 json.loads 函数可能出现的错误。如果出现错误,则会打印错误信息,并跳过该句子的翻译,避免程序因为出现异常而中断。
注意事项:
- 代码中使用的百度翻译 API 需要申请授权,并配置相应的 API ID 和密码。
- 代码中使用了
gbk编码,如果您的系统默认编码不是gbk,则需要根据实际情况修改编码格式。 - 代码中使用了
PDFminer库来处理 PDF 文档,如果您的系统中没有安装PDFminer库,则需要先安装该库。
希望这段代码可以帮助您完成 PDF 文档的提取和翻译工作。
优化建议:
- 可以使用更强大的 PDF 文档处理库,例如
PyPDF2库,来提取 PDF 文档的文本内容。 - 可以使用其他翻译 API,例如 Google 翻译 API,来完成翻译功能。
- 可以优化代码结构,使用面向对象编程的方法,将代码组织得更加清晰、易于维护。
- 可以添加日志记录功能,以便更好地跟踪代码执行过程和调试代码。
总结:
这段代码是一个简单的示例,展示了使用 Python 语言实现 PDF 文档的提取和翻译功能。您可以根据自己的需求对代码进行改进和扩展。
原文地址: https://www.cveoy.top/t/topic/oXQk 著作权归作者所有。请勿转载和采集!