本文章使用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的形式保存(当然也可以通过别的方式)

9438

被折叠的 条评论
为什么被折叠?



