目录

前言

一、安装PyMuPDF

二、PyMuPDF的使用

1.引入库

2.读取pdf

3.提取pdf信息

总结


前言

由于工作需要提取pdf中的相关信息,查到pymupdf这个工具。官方文档中介绍说“轻量级PDF,XPS和电子书查看器”。通过使用来情况来看,该库使用起来比较方便,而且功能强大,基本能够满足目前的工作需要。


一、安装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
  • 提取表格信息:将表格转化为二维数组并保存为xlsx表格文件

这里由于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

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐