目次
序文
作業ではPDF内の関連情報を抽出する必要があるため、pymupdfツールを確認してください。公式文書では「軽量PDF、XPS、電子書籍ビューア」を紹介しています。状況の使い方から判断すると、図書館は使い勝手が良く、パワフルで、基本的に現在の仕事のニーズに応えることができます。
1つは、PyMuPDFをインストールする
pip install PyMuPDF
第二に、PyMuPDFの使用
1.ライブラリを紹介します
コードは次のとおりです(例):
import fitz
2.PDFを読む
コードは次のとおりです(例):
# 打开pdf文件
doc=fitz.open(pdf_file)
この場所は、PDFファイルを読み取るために使用されます。
3.PDF情報を抽出します
- テキスト情報の抽出:テキスト情報と場所情報
コードは次のとおりです(例):
for page in doc:
words=page.getTextWords()
for w in words:
#位置信息:fitz.Rect(w[:4])
#w[4]:文本信息
print(fitz.Rect(w[:4]),w[4])
- 画像情報の抽出:画像のnumpyデータと位置情報
コードは次のとおりです(例):
for page in doc:
img_list=page.getImageList()
for img in img_list:
#图片的位置信息
print(fitz.Rect(img[:4]))
#可以直接利用pymupdf直接保存图片
pix=fitz.Pixmap(doc,img[0])
save_name="./图片/page_{}_{}.png".format(page.number,i)
pix.writePNG(save_name)
もちろん、PDF形式の画像データを直接読み取ってnumpyに変換する場合は、ここにデフォルトでインストールされているPILライブラリを使用する必要があります。
コードは次のとおりです(例):
from PIL import Image
import cv2
def pixmap2array(pix):
'''pixmap数据转数组对象'''
#获取颜色空间
cspace = pix.colorspace
if cspace is None:
mode = "L"
elif cspace.n == 1:
mode = "L" if pix.alpha == 0 else "LA"
elif cspace.n == 3:
mode = "RGB" if pix.alpha == 0 else "RGBA"
else:
mode = "CMYK"
#将byte数据转化为PIL格式
img = Image.frombytes(mode, (pix.width, pix.height), pix.samples)
#将PIL转化为numpy格式,并将RGB颜色空间转化为BGR
img = cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)
return img
ここで、pymupdfは直接テーブルを抽出できないため、行を抽出してテーブルを再構築する必要があります。したがって、ここではpdfplumberを使用して達成します。pdfplumberライブラリのインストール:
pip install pdfplumber
コードは次のとおりです(例):
import pdfplumber
def analysis_table(pdf_file):
#打开表格
workbook = Workbook()
sheet = workbook.active
#打开pdf
with pdfplumber.open(pdf_file) as pdf:
#遍历每页pdf
for page in pdf.pages:
#提取表格信息
table=page.extract_table( table_settings = {
'vertical_strategy':"text",
"horizontal_strategy":"text"})
print(table)
# 格式化表格数据
for row in table:
print(row)
sheet.append(row)
workbook.save(filename="2.xlsx")
総括する
完全なコードは次のとおりです(例)。
import fitz
import pdfplumber
from openpyxl import Workbook
from PIL import Image
import cv2
import numpy as np
def analysis_table(pdf_file):
#打开表格
workbook = Workbook()
sheet = workbook.active
#打开pdf
with pdfplumber.open(pdf_file) as pdf:
#遍历每页pdf
for page in pdf.pages:
#提取表格信息
table=page.extract_table( table_settings = {
'vertical_strategy':"text",
"horizontal_strategy":"text"})
print(table)
# 格式化表格数据
for row in table:
print(row)
sheet.append(row)
workbook.save(filename="2.xlsx")
def pixmap2array(pix):
'''pixmap数据转数组对象'''
#获取颜色空间
cspace = pix.colorspace
if cspace is None:
mode = "L"
elif cspace.n == 1:
mode = "L" if pix.alpha == 0 else "LA"
elif cspace.n == 3:
mode = "RGB" if pix.alpha == 0 else "RGBA"
else:
mode = "CMYK"
#将byte数据转化为PIL格式
img = Image.frombytes(mode, (pix.width, pix.height), pix.samples)
#将PIL转化为numpy格式,并将RGB颜色空间转化为BGR
img = cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)
return img
def ananlysis_PDF(pdf_file):
'''解析pdf信息'''
# 判断pdf是否存在
if not os.path.exists(pdf_file):
print("pdf文件不存在")
return;
# 打开pdf文件
doc=fitz.open(pdf_file)
#遍历pdf,提取信息
for page in doc:
words=page.getTextWords()
for w in words:
print(fitz.Rect(w[:4]),w[4])
img_list=page.getImageList()
i=0
for img in img_list:
print(fitz.Rect(img[:4]))
pix=fitz.Pixmap(doc,img[0])
save_name="./图片/page_{}_{}.png".format(page.number,i)
pix.writePNG(save_name)
image=pixmap2array(pix)
i+=1