fitz 将pdf裁剪成左中右三部分,并提取内容保存为excel

fitz介绍

fitz官网
fitz 是 PyMuPDF 库的一个封装,它是一个用于处理 PDF 文件的 Python 库。PyMuPDF 是一个强大而灵活的 PDF 处理库,而 fitz 则是对其进行了精简和封装,使得使用起来更加方便。

fitz 提供了许多功能,包括打开、创建、编辑和保存 PDF 文件。下面是 fitz 的一些主要特点:

打开和读取 PDF 文件:使用 fitz.open 方法可以打开一个 PDF 文件,并返回一个 fitz.Document 对象。你可以通过这个对象访问和操作 PDF 的页面、书签、元数据等信息。

页面操作:通过 fitz.Document 对象可以获取 PDF 的页面数量,并可以根据索引或页码获取单个页面。你可以对页面进行裁剪、旋转、缩放和提取等操作。

文本提取:使用 get_text 方法可以提取页面中的文本内容。你还可以按照坐标提取指定区域内的文本。

图像提取:使用 get_pixmap 方法可以获取页面上的图像,你可以将图像保存为文件或进行进一步的处理。

创建和编辑 PDF:fitz 允许你创建新的空白 PDF,向其中添加页面、书签和注释,并且可以对现有的 PDF 进行编辑和修改,如删除、替换、合并页面等操作。

高级功能:fitz 还提供了一些高级功能,如搜索文本、添加标注和链接、提取嵌入的字体信息等。

总体而言,fitz 是一个功能强大的 PDF 处理库,可以帮助你在 Python 中对 PDF 进行各种操作。你可以根据自己的需求使用 fitz 来读取、创建、编辑和提取 PDF 文件的内容。

fitz与pdfplumber 区别

参考:chatgpt
fitz 和 pdfplumber 都是常用的用于提取 PDF 内容的 Python 库,它们在使用方式和功能上有一些区别。

适用库:fitz 是 PyMuPDF 库的封装,而 pdfplumber 是基于 PyPDF2 和 pdftotext 的库。

功能丰富度:fitz 提供了更多高级功能,比如支持页面裁剪、渲染、文本搜索和标注等。它还可以处理图像和矢量对象。pdfplumber 则更专注于提取文本内容,提供了一些辅助功能,比如可以获取页面的大小和位置信息。

文本提取准确性:由于 PDF 文件的复杂性,不同的库可能对于某些特殊情况下的文本提取准确性有所不同。在一般情况下,fitz 和 pdfplumber 在文本提取方面的准确性都比较高。

库的易用性:pdfplumber 的 API 设计更加简洁明了,上手较为容易。fitz 则是 PyMuPDF 库的封装,相较而言,它的使用可能稍微复杂一些。

综上所述,如果你的主要需求是提取文本内容,pdfplumber 可能会更适合你。如果你需要更多高级功能或对 PDF 进行更复杂的处理,例如页面裁剪或图像处理,那么 fitz 更适合你。根据实际需求选择适合的库可以更好地满足你的需求。

代码

注意pdf权限问题,并且pdf排版是一行一行,而不是分块的,这样格式比较规整

 import fitz
 import pandas as pd
 
def clip_pdf(filepath):
    # 打开原始 PDF 文件
    total_df = pd.DataFrame([],columns=['info','page','table_index','index'])
    src = fitz.open(filepath)
    src.select(list(range(6, 515)))
    doc = fitz.open()
    text_list = []

   
    for spage in src:

        print('spage')# for each page in input
        r = spage.rect  # input page rectangle
        pdf_width = 700
        rx = fitz.Rect(r[2] * 40 /pdf_width, r[2] * 85 /pdf_width, r[2] * 240 /pdf_width, r[3] ) 
        page = doc.new_page(-1, width=r[2] * 200 /pdf_width, height=r[3])  # 创建新页面
        page.show_pdf_page(page.rect, src, spage.number, clip=rx)  # 插入裁剪后的部分
        text  = page.get_text()


        rx = fitz.Rect(r[2] * 240 /pdf_width, r[2] * 85 /pdf_width, r[2] * 440 /pdf_width, r[3] )
        page = doc.new_page(-1, width=r[2] * 200 /pdf_width, height=r[3])  # 创建新页面
        page.show_pdf_page(page.rect, src, spage.number, clip=rx)  # 插入裁剪后的部分
        text2 = page.get_text()

        rx = fitz.Rect(r[2] * 440 /pdf_width, r[2] * 85 /pdf_width, r[2] * 640 /pdf_width, r[3] )
        page = doc.new_page(-1, width=r[2] * 200 /pdf_width, height=r[3])  # 创建新页面
        page.show_pdf_page(page.rect, src, spage.number, clip=rx)  # 插入裁剪后的部分
        text3 = page.get_text()

        df = pd.DataFrame(text.split('\n') [:-2],columns=['info'])
        df['table_index'] = 0
        df['index'] = df.index
        df2 = pd.DataFrame(text2.split('\n')[1:-1],columns=['info'])
        df2['table_index'] = 1
        df2['index'] = df2.index
        df3 = pd.DataFrame(text3.split('\n')[:-2] ,columns=['info'])
        df3['table_index'] = 2
        df3['index'] = df3.index
        page_df = pd.concat([df,df2] )
        page_df = pd.concat([page_df,df3])
        page_df['page'] = spage.number
        if total_df.empty:
            total_df = page_df
        else:
			total_df = pd.concat([total_df, page_df], axis=0)
# 保存输出文件
total_df.to_excel('output.xlsx')
doc.save("output.pdf", garbage=3, deflate=True)

猜你喜欢

转载自blog.csdn.net/weixin_38235865/article/details/131401065