Python读取PDF和微软docx - KelovpString

/ 0评 / 1

    之前在学习linux时尝试着将电脑系统装为双系统。而在Linux环境下像微软软件的替代品也有不少(当然特指ubuntu)而在学校机房就没有这么幸运了,Kali Linux就是一个典型的例子,但是文档的通行格式却不是docx或者doc,而是PDF( Portable Document Format,便携式文档格式 ),PDF可以让用户在不同的系统上用同样的方式查看文本文档和图片。

PDF

    目前在python2.x里有不少的PDF解析库,还没有迁移到python3.x版本,但是由于PDF本身不复杂,而且又是开源的文档格式,所以有一些给力的Python库可以读取PDF文件,而且支持Python3.x版本:即PDFMiner3K,他十分灵活可以通过命令行使用,也可以整合到代码当中,也可以处理不同语言的编码,而且对于网络文件的处理也是十分给力。(继上次没又找到在线的txt资源后又没有找到pdf。。毕竟html相较于pdf太好用了。)

    安装--下载地址:https://pypi.python.org/pypi/pdfminer3k(我就继续用pychrom偷懒了/这里我用的是2k+py2.7。)

from urllib import urlopen
from pdfminer.pdfinterp import PDFResourceManager, process_pdf
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from io import StringIO
from io import open

def readPDF(pdfFile):
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, laparams=laparams)
    process_pdf(rsrcmgr, device, pdfFile)
    device.close()
    content = retstr.getvalue()
    retstr.close()
    return content
pdfFile = urlopen("http://localhost:8080/test.pdf")
outputString = readPDF(pdfFile)
print(outputString)
pdfFile.close()

输出有点尴尬//因为有好几张小图。。然后就不太乐观就不放了

微软Word和.docx

    作为假粉丝和破解版用户,word系列可以说是用的最舒心的文档处理软件,无广告功能强大,表格文件图片随便衔接,各种统计和格式化功能让你用的很舒心(不像某wps,天天一堆广告还卡的要死)在某些网站上很流行word文档,其实在我心目而言,若是资源上纲上线,html无疑是最好的。在08(具体不知道了)以前,微软使用.doc格式,这种二进制格式很难读取,为了兼容和跟上时代,微软推出了类xml格式标准的.docx。虽然在Python当中有一个python-docx库(http://python-docx.readthedocs.org/en/ latest/)但是坦言论:一个只能读取文档大小和文件标题的库对于实际没有什么用处,若要读取正文内容,问题就又回归到了XML解析。其实稍微注意一下就会发先一个问题:word文档完全可以另存为xml,事实正式如此:

from zipfile import ZipFile
from urllib.request import urlopen
from io import BytesIO
wordFile = urlopen("http://localhost:8080/kka.docx").read()
wordFile = BytesIO(wordFile)
document = ZipFile(wordFile)
xml_content = document.read('word/document.xml')
print(xml_content.decode('utf-8'))

   这样我们暂且得到了xml。所以接下来要做的事情就是解析XML:

wordObj = BeautifulSoup(xml_content.decode('utf-8'))
textStrings = wordObj.findAll()
for textElem in textStrings:
    print(textElem.text)

虽然上面的写法写出来可能会有点格式不对,但是依旧可以输出当中的所有文字,如果要详细解析那就得进一步观察:标签存在<w:val>或者<w:p>等,所以可以利用BeautifulSoup的导航功能来解决:

textStrings = wordObj.findAll("w:t")
for textElem in textStrings:
    closeTag = ""
    try:
        style = textElem.parent.previousSibling.find("w:pstyle")
        if style is not None and style["w:val"] == "Title":
            print("<h1>")
        closeTag = "</h1>"
    except AttributeError:
        pass
    print(textElem.text)
    print(closeTag)

     当然这部分功能仅限于docx了。。其他的有些好像不可以。但是这个解析xml稳的(其实要真解析还需更详细)


    

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注