pdfminer提取文献pdf图片以及图片标题

  本文章使用pdfminer库以及PyMuPDF来实现对于文献pdf的提取和图片标题提取。
  这是我大数据课的作业,在所给数据集的文献名称较为一致,所以使用for循环来读取文献名,如果文献名各有不同,可考虑遍历文件夹内的pdf文件来达成,难度应该也不大。
  在所给文献中,图片提取是比较容易的,而图片标题则是问题。我的能力有限,以图片坐标定位图片标题的做法,很容易将错误的内容(如图片左边,上方的文字)认为是标题,所以采用遍历所有文字,提取以Fig. 为起始的段落,而本方法段落的定义就是以两个换行符结尾(如果以一个换行符为结尾会导致内容不完整)。

import os
import time
from pdfminer.high_level import extract_pages
from pdfminer.layout import LAParams, LTTextContainer

def extract_paragraphs_starting_with(pdf_path, specific_char, output_folder):
    # 设置布局参数以更好地解析段落
    laparams = LAParams()

    # 确保输出文件夹存在,如果不存在则创建
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    # 提取PDF中的所有页面
    for page_layout in extract_pages(pdf_path, laparams=laparams):
        page_number = page_layout.pageid
        
        content_count = 0  # 用于跟踪每页上符合条件的内容编号

        # 遍历页面中的所有对象
        for element in page_layout:
            # 检查对象是否是文本容器
            if isinstance(element, LTTextContainer):
                # 获取文本
                text = element.get_text()
                # 将文本按段落分割(这里假设段落由两个换行符分隔)
                paragraphs = text.split('\n\n')

                # 输出以特定字符开头的段落并保存为文本文件
                for paragraph in paragraphs:
                    if paragraph.strip().startswith(specific_char):
                        content_count += 1
                        filename = f'pagenum_{page_number}_{content_count}.txt'
                        filepath = os.path.join(output_folder, filename)
                        with open(filepath, 'w', encoding='utf-8') as f:
                            f.write(paragraph.strip())
                        print(f'图片标题已保存到 {filepath}')
import fitz  # PyMuPDF
import os

def extract_images(pdf_path, output_folder):
    # 确保输出文件夹存在
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    # 打开PDF文件
    pdf_file = fitz.open(pdf_path)

    # 遍历每一页
    for page_number in range(len(pdf_file)):
        page = pdf_file[page_number]
        image_list = page.get_images(full=True)

        # 提取页面中的图片
        for img_index, img in enumerate(image_list, start=1):
            xref = img[0]
            base_image = pdf_file.extract_image(xref)
            image_bytes = base_image["image"]

            # 生成图片文件名
            image_filename = f"image_page{page_number+1}_{img_index}.png"
            image_filepath = os.path.join(pic_output_folder, image_filename)

            # 保存图片到指定文件夹
            with open(image_filepath, "wb") as image_file:
                image_file.write(image_bytes)
            print(f'图片已保存到 {image_filepath}')

    pdf_file.close()

start_time = time.time()

for i in range(1,12):
    pdf_path = 'Visualization_and_Computer_Graphics_IEEE_Transactions_on_-_Volume_27_-_Issue_'+str(i)+'.pdf'  # 这是我的PDF文件路径,请替换成自己的
    pic_output_folder ='输出/Visualization_and_Computer_Graphics_IEEE_Transactions_on_-_Volume_27_-_Issue_'+str(i)+'/文献的图片'  # 图片将被保存在这个文件夹中
    extract_images(pdf_path, pic_output_folder)


    specific_char = 'Fig.'  # 检测的特定字符
    output_folder = '输出/Visualization_and_Computer_Graphics_IEEE_Transactions_on_-_Volume_27_-_Issue_'+str(i)+'/文献的图片标题'  # 请替换为你想要保存文件的文件夹路径
    extract_paragraphs_starting_with(pdf_path, specific_char, output_folder)
end_time = time.time()

# 计算并打印程序运行的总时长
elapsed_time = end_time - start_time
print(f"程序运行总时长: {elapsed_time:.6f}秒")

 运行过程

我的笔记本是机械硬盘,仅仅只提取了四篇pdf文献,时长就达到了三分钟左右。

结果会生成输出文件夹,里面是每个文献的图片以及图片标题文件夹

图片标题会以txt的形式保存(当然也可以通过别的方式)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值