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 文件的内容。
参考: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)