使用 Python 提取 PDF 文本并翻译

本代码演示了如何使用 Python 的 PDFMiner 库提取 PDF 文件中的文本内容,并使用百度翻译 API 将提取的英文内容翻译成中文。

代码:

# -*- 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('
', '')  # 去掉换行符 因为排版问题 有的换行导致句子中断
  contents += (results)
 ## 为了看着舒服,每一句为一行
 saveText(contents.replace('.', '.
'), 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')
 json_reads = json.loads(content)
 if 'trans_result' in json_reads:
  return json_reads['trans_result'][0]['dst'] + ' '
 else:
  print('翻译错误:缺少 trans_result 字段。')
  return ''
###

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('
', '。'))
 # chinese += '
'
 i += 1
 saveText(chinese, CNtextfile)
 print('翻译结束,ok')

说明:

  1. 代码中添加了错误处理代码,判断 json_reads 中是否存在 trans_result 字段。如果不存在,则输出错误信息并返回空字符串。
  2. 代码中使用了 hashlib.md5 对参数进行签名,确保请求的安全性。
  3. 代码中将提取的英文内容分句进行翻译,并使用 replace 函数将换行符替换为中文句号。

运行步骤:

  1. 确保已安装 PDFMiner 和 requests 库。
  2. 将代码保存为 .py 文件。
  3. 运行代码,程序会自动提取 PDF 文本内容并进行翻译,并将翻译结果保存到 CNmultinet.txt 文件中。

注意:

  1. 使用百度翻译 API 需要申请 API key 和 secret,并将它们填入代码中的 api_idcyber 变量中。
  2. 代码中使用的 pdffileENtextfileCNtextfile 变量需要根据实际情况修改。
  3. 百度翻译 API 有调用次数限制,请注意使用次数。

改进方向:

  1. 使用更强大的 PDF 解析库,如 PyPDF2,来处理更复杂的 PDF 文件。
  2. 使用其他翻译 API,例如 Google Translate API,来提高翻译质量。
  3. 添加更详细的错误处理代码,以便更好地定位和解决问题。
  4. 优化代码结构,使其更加易于维护和扩展。

希望本代码能帮助您快速完成 PDF 文本提取和翻译工作!


原文地址: https://www.cveoy.top/t/topic/oXP7 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录