关于电子书(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()
posted @ 2024-10-20 11:33  Akimizuss101  阅读(10)  评论(0编辑  收藏  举报