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:\")