pdf_to_world

import os
from pdfminer.pdfparser import PDFParser,PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import *
from pdfminer.pdfinterp import PDFTextExtractionNotAllowed
import fitz
import re

"""

# 這裏layout是一個LTPage對象 裏面存放着 這個page解析出的各種對象
            # 一般包括LTTextBox, LTFigure, LTImage, LTTextBoxHorizontal 等等
            # 想要獲取文本就獲得對象的text屬性,
"""

class PDF2Word():
    def __init__(self, pdfpapth):
        self.pdfpath = pdfpapth

    def get_content_from_pdf(self):  # 解析pdf文件函數
        with open(self.pdfpath,'rb') as f:
            parser = PDFParser(f)  # 創建一個pdf文檔分析器
        pdf = PDFDocument()         # 創建一個PDF文檔

        parser.set_document(pdf)  # 將分析器和文檔進行綁定
        pdf.set_parser(parser)
        pdf.initialize()  # 對文檔進行初始化,提供初始化密碼

        if not pdf.is_extractable:  # 判斷pdf文檔是否能被轉換,不能就結束程序
            raise PDFTextExtractionNotAllowed
        else:
            return list(pdf.get_pages())  # 返回pdf文檔中的頁面內容信息

    def save_content(self,page_index=None, save_path=None):
        pages = self.get_content_from_pdf()
        num_page = 0
        pdfresourcemanager = PDFResourceManager()  # 創建資源管理器來共享資源
        laparams = LAParams()
        pdfpageAggregator = PDFPageAggregator(pdfresourcemanager, laparams=laparams) # 創建一個PDF設備對象

        interpreter = PDFPageInterpreter(pdfresourcemanager, pdfpageAggregator)# 創建一個PDF解釋器對象
        if page_index:  # 如果想提取某些頁,就把具體頁數指明出來
            pages = list(pages[i-1] for i in page_index)
        save_path = save_path if save_path else self.pdfpath.replace('pdf', 'doc')
        with open(save_path, 'w', encoding='utf-8') as f:  # 生成doc文件的文件名及路徑
            for page in pages:  # doc.get_pages() 獲取page列表
                num_page += 1  # 頁面增一
                interpreter.process_page(page)
                layout = pdfpageAggregator.get_result()  # 提取頁面的信息
                for x in layout:
                    if isinstance(x, LTTextBoxHorizontal):  # 獲取文本內容,這裏獲取的是一行
                        # 保存文本內容
                        print("232")
                        results = x.get_text()
                        f.write(results)
                        f.write('\n')

    def save_pics(self,save_path):
        checkIM = r"/Subtype(?= */Image)"   # 使用正則表達式來匹配圖片
        pdf = fitz.open(self.pdfpath)
        count = 0
        lenXREF = pdf._getXrefLength()  # 提取pdf內的對象
        for i in range(1, lenXREF):
            text = pdf._getXrefString(i)  # 定義字符串對象

            isImage = re.search(checkIM, text)  # 查看是否是圖片對象
            if not isImage:  # 如果提取的不是圖片,就跳過
                continue
            count += 1
            pixes = fitz.Pixmap(pdf, i)
            new_name = "{}.png".format(count)  # 設置保存圖片的路徑

            if pixes.n < 5:  # 如果pix.n<5,可以直接存爲PNG
                pixes.writePNG(os.path.join(save_path, new_name))
            else:  # 否則就需要先轉換爲CMYK彩色模式,然後在進行保存
                pixes = fitz.Pixmap(fitz.csRGB, pixes)
                pixes.writePNG(os.path.join(save_path, new_name))


if __name__ == '__main__':
    pdf2word = PDF2Word(r"demo.pdf")
    pdf2word.save_pics(r"c:\")

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章