1. 程式人生 > 實用技巧 >pdf 轉 word

pdf 轉 word

程式設計環境:
attrs==17.4.0
lxml==4.1.1
pdfminer3k==1.3.1
pluggy==0.6.0
ply==3.11
py==1.5.2
pytest==3.4.1
python-docx==0.8.6
six==1.11.0
from pdfminer.pdfparser import PDFParser, PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.layout import LAParams
from pdfminer.converter import PDFPageAggregator
from pdfminer.pdfinterp import PDFTextExtractionNotAllowed
from docx import Document

document = Document()


def parse():
    # rb以二進位制讀模式開啟本地pdf檔案
    fn = open('./111.pdf', 'rb')
    # 建立一個pdf文件分析器
    parser = PDFParser(fn)
    # 建立一個PDF文件
    doc = PDFDocument()
    # 連線分析器 與文件物件
    parser.set_document(doc)
    doc.set_parser(parser)

    # 提供初始化密碼doc.initialize("lianxipython")
    # 如果沒有密碼 就建立一個空的字串
    doc.initialize("")
    # 檢測文件是否提供txt轉換,不提供就忽略
    if not doc.is_extractable:
        raise PDFTextExtractionNotAllowed

    else:
        # 建立PDf資源管理器
        resource = PDFResourceManager()
        # 建立一個PDF引數分析器
        laparams = LAParams()
        # 建立聚合器,用於讀取文件的物件
        device = PDFPageAggregator(resource, laparams=laparams)
        # 建立直譯器,對文件編碼,解釋成Python能夠識別的格式
        interpreter = PDFPageInterpreter(resource, device)
        # 迴圈遍歷列表,每次處理一頁的內容
        # doc.get_pages() 獲取page列表
        for page in doc.get_pages():
            # 利用直譯器的process_page()方法解析讀取單獨頁數
            interpreter.process_page(page)
            # 使用聚合器get_result()方法獲取內容
            layout = device.get_result()
            # 這裡layout是一個LTPage物件,裡面存放著這個page解析出的各種物件
            for out in layout:
                # 判斷是否含有get_text()方法,獲取我們想要的文字
                if hasattr(out, "get_text"):
                    # print(out.get_text(), type(out.get_text()))
                    content = out.get_text().replace(u'\xa0', u' ')  # 將'\xa0'替換成u' '空格,這個\xa0就是&nbps空格
                    # with open('test.txt','a') as f:
                    #     f.write(out.get_text().replace(u'\xa0', u' ')+'\n')
                    document.add_paragraph(
                        content, style='ListBullet'  # 新增段落,樣式為unordered list型別
                    )
                document.save('./111.docx')  # 儲存這個文件


if __name__ == '__main__':
    parse()