关于电子书(PDF格式)提取信息的处理方式
PDF的处理:需要将PDF文件放在项目文件夹下。或者也可以用绝对路径指出。
提取文字:
import PyPDF2
#功能:从一页pdf种提取文字
# 使用 'rb' 模式打开 PDF 文件,使用二进制模式
with open('zhengzhi_9up.pdf', mode='rb') as mypdf:
# 调用 PdfFileReader 函数
pdf_document = PyPDF2.PdfReader(mypdf)
# 获取 PDF 文档的页数
num_pages = len(pdf_document.pages)
print(f"PDF 文档页数: {num_pages}")
# 取得第一页的内容
first_page = pdf_document.pages[6]
# 调用 Page 对象的 extract_text() 方法,返回该页文本的字符串
text = first_page.extract_text()
print("第一页内容:")
print(text)
提取图片:最好是保证PDF文件足够清晰,效果更好,且该方法是提取大小不会很大 的标准矩形图片,对于其他形状的图片提取可以用网上资源查找类似方法
'''
功能:爬取指定页数的矩形普通图片
另外需要保证颜色不变
'''
import PyPDF2
import fitz
import re
import os
from PIL import Image
import io
# 定义最小图片尺寸过滤标准
min_size = 10000 # 文件大小阈值(单位:字节)
min_width, min_height = 50, 50 # 图片最小宽度和高度
# PDF 提取图片的函数(根据页码)
def pdf2image1(path, pic_path, start_page=0, end_page=None):
pdf = fitz.open(path) # 打开 PDF
if end_page is None:
end_page = pdf.page_count # 如果没有定义结束页,则提取到最后一页
count = 1 # 图片计数
for page_num in range(start_page, end_page): # 遍历指定范围的页码
page = pdf.load_page(page_num) # 加载当前页
image_list = page.get_images(full=True) # 获取该页的所有图片
print(f"第 {page_num + 1} 页包含 {len(image_list)} 张图片")
for img_index, img in enumerate(image_list):
xref = img[0] # 获取图片的 XREF
pix = fitz.Pixmap(pdf, xref) # 提取图片
# 过滤掉小于设定阈值的图片
if pix.size < min_size:
continue
# 检查图片颜色空间
if pix.n < 4: # 如果是 RGB 或灰度图
# 将图片数据转为字节流
image_bytes = pix.tobytes("png") # 以 PNG 格式获取图片字节流
else:
# 如果是 CMYK 或 LAB 图像,转换为 RGB
rgb_pix = fitz.Pixmap(fitz.csRGB, pix) # 转换为 RGB
image_bytes = rgb_pix.tobytes("png") # 转换为 PNG 字节流
rgb_pix = None # 释放资源
# 使用 Pillow 打开图片字节流
image = Image.open(io.BytesIO(image_bytes))
# 检查图片尺寸并过滤掉过小的图片
if image.width < min_width or image.height < min_height:
continue
# 检查颜色模式,如果是 CMYK,转换为 RGB
if image.mode == "CMYK":
image = image.convert("RGB")
# 保存图片
new_name = f"page_{page_num + 1}_img_{count}.png"
image.save(os.path.join(pic_path, new_name))
print(f"已保存图片 {new_name},尺寸:{image.width}x{image.height}")
count += 1
pdf.close() # 关闭 PDF 文件
# 主函数
def main():
# PDF 文件路径
file_path = r'zhengzhi_9up.pdf' # 替换为你的 PDF 文件路径
# 输出图片的文件夹路径
dir_path = r'extracted_images' # 替换为你的目标文件夹路径
# 开始页和结束页(注意页码是从0开始)
start_page = 7 # 开始页
end_page = 11 # 结束页(不包含此页)
# 检查输出文件夹是否存在,如果不存在则创建
if not os.path.exists(dir_path):
os.makedirs(dir_path)
# 调用 pdf2image1 函数,提取指定页面范围内的图片
pdf2image1(file_path, dir_path, start_page=start_page, end_page=end_page)
# 如果直接运行此脚本,则调用主函数
if __name__ == "__main__":
main()
我与你同行。