如何用Python检查PDF页面是否包含图片?完善现有代码逻辑
检查PDF页面是否包含图片的简洁方法
嘿,我来帮你搞定这个问题!你用的pdfreader应该是PyPDF2库的PdfReader类吧?它本身确实没有直接判断页面是否含图片的方法,但我们可以通过解析PDF页面的底层资源来实现——思路很简单:PDF里的图片一般存在页面的Resources字典的XObject中,只要检查这些XObject里有没有类型为/Image的对象就行。
第一步:实现检查图片的函数
先写一个轻量的函数,用来判断单页是否包含图片:
def has_image(page): # 获取页面的资源字典 resources = page.get('/Resources') if not resources: return False # 获取资源里的XObject(PDF的图像、表单等元素都存在这里) xobjects = resources.get('/XObject') if not xobjects: return False # 遍历所有XObject,检查是否有图片类型的对象 for obj in xobjects.values(): if obj.get('/Subtype') == '/Image': return True return False
第二步:整合到你的代码里
注意哦,PyPDF2的页码是从0开始的,你原来的currentPage = 1会跳过第一页,得调整一下。另外如果要提取图片上的文字,还需要把PDF页面转成图片再用Tesseract识别,这里可以用pdf2image库来完成页面转图片的工作:
from PyPDF2 import PdfReader import pytesseract from pdf2image import convert_from_path def has_image(page): resources = page.get('/Resources') if not resources: return False xobjects = resources.get('/XObject') if not xobjects: return False for obj in xobjects.values(): if obj.get('/Subtype') == '/Image': return True return False pdfreader = PdfReader("your_file.pdf") # 替换成你的PDF文件路径 currentPage = 0 totalPages = len(pdfreader.pages) text = '' while currentPage < totalPages: page = pdfreader.pages[currentPage] # 先提取页面上的普通文本 text += page.extract_text() or "" # 如果页面包含图片,就用Tesseract做OCR提取图片里的文字 if has_image(page): # 把当前页转成PIL Image对象 images = convert_from_path("your_file.pdf", first_page=currentPage+1, last_page=currentPage+1) for img in images: text += pytesseract.image_to_string(img) currentPage += 1 print(text)
一些需要注意的细节
- 先安装依赖库:
pip install PyPDF2 pytesseract pdf2image pillow - 要确保你的系统里安装了Tesseract OCR引擎,不然pytesseract无法正常工作
- 如果PDF里是矢量图,这个方法也能检测到,但OCR可能需要额外处理(不过大部分场景都是位图,没问题)
内容的提问来源于stack exchange,提问作者Iakovos Belonias




