Python,fitz这个库的常用方法理解和总结。
1、python中,fitz这个库主要是用来做什么的?
fitz
是 PyMuPDF
的另一个名字,这是一个 Python 库,用于处理 PDF 和其他文档格式(例如 XPS、OpenXPS、CBZ、FB2、EPUB 和其他)。
fitz
提供了一组强大的工具,用于从这些文档中提取文本、图像、注释等内容,还可以进行文档的修改和重新构建。主要功能包括:
- 读取和写入 PDF 文件:可以打开现有的 PDF 文件,读取其内容,并保存修改后的文件。
- 提取文本:从 PDF 页面中提取纯文本内容。
- 提取图像:从 PDF 页面中提取图像,并保存为各种图像格式。
- 搜索和高亮:在 PDF 页面中搜索文本,并高亮搜索结果。
- 创建和修改 PDF:创建新的 PDF 文件,添加文本、图像、图形等内容,或者修改现有的 PDF 文件。
- 处理注释:读取、添加、修改和删除 PDF 文件中的注释。
以下是一个简单的示例代码,演示如何使用 fitz
提取 PDF 文档的文本:
import fitz # PyMuPDF # 打开一个 PDF 文件 pdf_document = fitz.open("example.pdf") # 遍历每一页,提取文本 for page_num in range(len(pdf_document)): page = pdf_document.load_page(page_num) text = page.get_text() print(f"Page {page_num + 1}:\n{text}") # 关闭文档 pdf_document.close()
2、这个元组每个返回的结果是什么意思?
import fitz doc = fitz.open('./filesCompare/应聘人员登记表.pdf') print(doc) for page_num in range(len(doc)): page_content = doc[page_num] words = page_content.get_text('words') for word in words: print(word)
Document('./filesCompare/应聘人员登记表.pdf') (255.0, 101.90042114257812, 374.1679992675781, 117.40432739257812, '编号:___________', 1, 1, 0) (170.49600219726562, 188.33349609375, 423.3240051269531, 224.33349609375, '应聘人员登记表', 2, 0, 0) (262.0, 512.1057739257812, 276.0, 526.1057739257812, '姓', 3, 0, 0) (297.0, 512.1057739257812, 332.0, 526.1057739257812, '名:1', 3, 0, 1) (258.5, 540.1057739257812, 335.5, 554.1057739257812, '应聘职位:1', 4, 0, 0) (258.5, 568.1057739257812, 335.5, 582.1057739257812, '应聘日期:1', 5, 0, 0)
在使用 fitz
库从 PDF 文档中提取文本时,get_text('words')
方法返回一个包含元组的列表,每个元组代表 PDF 页面上的一个词。
元组中的每个元素都有特定的含义。以下是每个元组元素的解释:
(255.0, 101.90042114257812, 374.1679992675781, 117.40432739257812, '编号:___________', 1, 1, 0)
- 第一个元素 (255.0):表示词语框的左上角的 x 坐标。
- 第二个元素 (101.90042114257812):表示词语框的左上角的 y 坐标。
- 第三个元素 (374.1679992675781):表示词语框的右下角的 x 坐标。
- 第四个元素 (117.40432739257812):表示词语框的右下角的 y 坐标。
- 第五个元素 ('编号:___________'):实际的词语或文本内容。
- 第六个元素 (1):表示页面编号,从 1 开始。
- 第七个元素 (1):表示词语所在的块编号(文本块的编号)。
- 第八个元素 (0):表示词语在块中的行编号。
综上所述,这些元组提供了每个词在页面上的位置和一些结构信息,便于进一步处理和分析。
你可以使用这些信息来定位和操作 PDF 文档中的特定文本。例如,知道每个词的位置可以帮助你在特定区域内查找文本或在特定位置添加注释。
3、这个代码的'rect': fitz.Rect(word[:4]) 是什么意思?
import fitz from pprint import pprint doc = fitz.open('./filesCompare/应聘人员登记表.pdf') print(doc) text_with_positions = [] for page_num in range(len(doc)): page_content = doc[page_num] words = page_content.get_text('words') for word in words: text_with_positions.append({ 'text': word[4], 'page': page_num, 'rect': fitz.Rect(word[:4]) })
在你的代码中,'rect': fitz.Rect(word[:4])
的作用是将 word
元组的前四个元素(代表文本位置的坐标)转换成一个 fitz.Rect
对象。
fitz.Rect
对象是 PyMuPDF
库中表示矩形区域的类。这个矩形区域可以用来表示文本在页面上的位置。
具体来说:
word[:4]
:表示从word
元组中提取前四个元素,这四个元素分别是(x0, y0, x1, y1)
,它们代表文本框的左上角和右下角的坐标。fitz.Rect(word[:4])
:使用这些坐标创建一个fitz.Rect
对象。
这段代码的目的是将每个词的位置信息转换成一个矩形区域对象,方便后续处理。fitz.Rect
对象可以用来执行各种操作,比如测量面积、检查是否包含某个点或矩形、与其他矩形求交集等。
以下是一个更详细的解释:
-
word[:4]
提取前四个元素:- 例如,假设
word
是(255.0, 101.9, 374.168, 117.404, '编号:___________', 1, 1, 0)
,则word[:4]
会提取出(255.0, 101.9, 374.168, 117.404)
。
- 例如,假设
-
创建
fitz.Rect
对象:fitz.Rect((255.0, 101.9, 374.168, 117.404))
创建一个矩形对象,其左上角坐标为(255.0, 101.9)
,右下角坐标为(374.168, 117.404)
。
这个矩形对象表示文本在 PDF 页面上的位置,便于进行位置相关的处理。
完整代码示例:
import fitz from pprint import pprint # 打开 PDF 文档 doc = fitz.open('./filesCompare/应聘人员登记表.pdf') print(doc) # 提取文本及其位置信息 text_with_positions = [] for page_num in range(len(doc)): page_content = doc[page_num] words = page_content.get_text('words') for word in words: text_with_positions.append({ 'text': word[4], 'page': page_num, 'rect': fitz.Rect(word[:4]) # 将位置信息转换为 fitz.Rect 对象 }) # 打印提取的文本及其位置信息 pprint(text_with_positions)
4、这个函数请详细解释,举例说明,尤其是关于SequenceMatcher
def compare_texts(text1, text2): matcher = SequenceMatcher(None, text1, text2) return matcher.get_opcodes()
SequenceMatcher
是 Python 标准库 difflib
中的一个类,用于比较两个序列(例如字符串)之间的相似性。
它实现了一种高效的算法来找出两个序列之间的最长匹配子序列,从而可以帮助识别插入、删除和替换等变化。
以下是 compare_texts
函数的详细解释和例子:
解释
-
SequenceMatcher(None, text1, text2)
:- 创建一个
SequenceMatcher
对象,用于比较text1
和text2
。 None
表示不使用自定义的相等函数,而是使用默认的比较方法。
- 创建一个
-
matcher.get_opcodes()
:- 该方法返回一个描述如何将
text1
转换为text2
的操作代码列表。 - 每个操作代码都是一个元组,包含以下信息:
- 操作类型(
'replace'
,'delete'
,'insert'
,'equal'
) text1
中相关部分的起始和结束索引text2
中相关部分的起始和结束索引
- 操作类型(
- 该方法返回一个描述如何将
操作代码示例
'replace'
:text1
中的一个片段被text2
中的另一个片段替换。'delete'
:text1
中的一个片段在text2
中不存在。'insert'
:text2
中的一个片段在text1
中不存在。'equal'
:text1
和text2
中的片段是相同的。
举例说明
from difflib import SequenceMatcher def compare_texts(text1, text2): matcher = SequenceMatcher(None, text1, text2) return matcher.get_opcodes() text1 = "应聘人员登记表" text2 = "应聘人员登记表格" opcodes = compare_texts(text1, text2) for opcode in opcodes: print(opcode)
输出
('equal', 0, 7, 0, 7) ('insert', 7, 7, 7, 9)
解释
('equal', 0, 7, 0, 7)
: 表示text1
和text2
在索引 0 到 7 处是相同的(即"应聘人员登记表"
)。('insert', 7, 7, 7, 9)
: 表示在text1
的索引 7 处插入了text2
的索引 7 到 9 的部分(即"格"
)。
这表明在 text2
中,“登记表”后面插入了“格”。
更复杂的例子
text1 = "The quick brown fox" text2 = "The quick brown dog" opcodes = compare_texts(text1, text2) for opcode in opcodes: print(opcode)
输出
('equal', 0, 16, 0, 16) ('replace', 16, 19, 16, 19)
解释
('equal', 0, 16, 0, 16)
: 表示text1
和text2
在索引 0 到 16 处是相同的(即"The quick brown "
)。('replace', 16, 19, 16, 19)
: 表示text1
的索引 16 到 19 处的部分被text2
的索引 16 到 19 处的部分替换(即"fox"
被替换为"dog"
)。
通过这些操作代码,你可以理解和追踪两个文本之间的具体差异。这对于文本比较、版本控制和合并差异等任务非常有用。