写在前面
看paper英语不好是硬伤,比如我,每次都大段大段把pdf里的内容占到google翻译里,但是pdf直接复制出来的内容每一行会多一个换行,似的翻译出来的内容不连贯,影响翻译的质量,每次都手动删太麻烦了,就抽空写了这个小程序,来帮我自动读取本地的pdf内容,并去掉多余的换行符,保存为txt文本。
pdfminer
python2.4及以上(python3不支持)有一个可以从PDF文档中提取信息的库——pdfminer,具体的下载和安装就不赘述了,链接中有。
代码
原谅我最近比较忙,就不多说了,直接贴代码,关键部分有注释:
# -*- coding: utf-8 -*-
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfpage import PDFTextExtractionNotAllowed
from pdfminer.pdfinterp import PDFResourceManager
from pdfminer.pdfinterp import PDFPageInterpreter
from pdfminer.layout import *
from pdfminer.converter import PDFPageAggregator
import re,os
def Pdf2Txt(Path,file_txt):
#来创建一个pdf文档分析器
parser = PDFParser(Path)
#创建一个PDF文档对象存储文档结构
document = PDFDocument(parser)
# 检查文件是否允许文本提取
if not document.is_extractable:
raise PDFTextExtractionNotAllowed
else:
# 创建一个PDF资源管理器对象来存储共赏资源
rsrcmgr=PDFResourceManager()
# 设定参数进行分析
laparams=LAParams()
# 创建一个PDF设备对象
# device=PDFDevice(rsrcmgr)
device=PDFPageAggregator(rsrcmgr,laparams=laparams)
# 创建一个PDF解释器对象
interpreter=PDFPageInterpreter(rsrcmgr,device)
# 处理每一页
for page in PDFPage.create_pages(document):
interpreter.process_page(page)
# 接受该页面的LTPage对象
layout=device.get_result()
for x in layout:
if(isinstance(x,LTTextBoxHorizontal)):
with open('%s'%(file_txt),'a') as f:
# 除去多余换行(选用了不常用的字符'~'过渡)
re_result, number = re.subn('(\n\s)+', '~', x.get_text().encode('utf-8'))
result = re_result.replace('\n','').replace('~','\n') + '\n'
f.write(result)
fileIn = unicode('paper_name.pdf',"utf-8")
Path = open(fileIn, 'rb')
file_txt = fileIn.replace('.pdf','.txt')
if os.path.exists(file_txt):
os.remove(file_txt)
Pdf2Txt(Path,file_txt)
翻译的话,本来想直接在程序中调用google翻译的,正常途径需要收费,查了很多资料,除了翻墙问题,google翻译更新后ticket机制已经不允许简单的爬虫访问了,感兴趣的话可以换成百度翻译,或者可以直接将生成的txt中的内容粘贴到google翻译中,也不算太麻烦。