网上有很多方法,但是包括PDF2image库、PyMupdf库等。
在摸索过程中我发现pdf的解析可以分为两种:
1、标准的PDF文件
表现在字体清晰、无畸变。这类PDF文件是通过word等格式编辑好转换的,可以通过某些包直接提取其中的表格、文字等。是一种比较好处理的。
2、非标准的PDF文件
表现在字体模糊、存在畸变。我怀疑这类PDF是通过图片转换得到的。它和标准PDF文件长得很像,但如果你要提取其中的信息,通过解析PDF文本会得到一片空白!!因为它本质属于PDF一张图片,因此需要通过提取PDF中图片的方式,而不是提取文本或表格。
今天主要解决pymupdf库的问题。在pymupdf这个库上我参考了很多人的代码,但是无论如何都显示缺少文件。
其实很很可能是pymupdf版本不同。
通常使用pip install pymupdf
会下载最新的版本,我当前默认下载的版本是1.20.0。
import fitz
后
运行会报错。
我这里使用
pip install pymupdf==1.18.17 -i https://pypi.tuna.tsinghua.edu.cn/simple
下载1.18.17版本的pymupdf,使用python3.8
运行如下代码
import fitz
import re
import os
file_path = r'pdf/yourpdf.pdf' # PDF 文件路径
dir_path = r'imgs' # 存放图片的文件夹
def pdf2image1(path, pic_path):
checkIM = r"/Subtype(?= */Image)" # 正则表达式
pdf = fitz.open(path)
lenXREF = pdf.xref_length() # 最新fitz库是没有._getXrefLength()
count = 1
for i in range(1, lenXREF):
text = pdf.xref_object(i)# 最新fitz库是没有.getObjectString()
isImage = re.search(checkIM, text)
if not isImage:
continue
pix = fitz.Pixmap(pdf, i)
if pix.size < 10000: # 在这里添加一处判断一个循环
continue # 不符合阈值则跳过至下
new_name = f"img_{count}.png"
pix.writePNG(os.path.join(pic_path, new_name))
count += 1
pix = None
pdf2image1(file_path, dir_path)
可以正常提取pdf中的图片