当前位置:   article > 正文

python代码解析|提取多个pdf中指定文段的信息_python读取pdf特定位置文字

python读取pdf特定位置文字
with open(file_path, 'rb') as file:
  • 1

with 语句确保文件在操作完成后会被正确关闭。'rb' 模式表示以二进制方式读取文件,这对于处理二进制格式的 PDF 文件是必要的。
4. 创建 PyPDF2.PdfFileReader 对象:

pdf_reader = PyPDF2.PdfFileReader(file)
  • 1

这个对象用于读取 PDF 文件的内容。
5. 初始化一个空字符串 text 来存储提取的文本:

text = ""
  • 1
  1. 遍历 PDF 文件的每一页:
for page_num in range(pdf_reader.numPages):
  • 1

pdf_reader.numPages 属性返回 PDF 文件中的页面总数,for 循环遍历每一页。
7. 获取当前页面的文本内容:

page = pdf_reader.getPage(page_num) pdf_text = page.extract_text()
  • 1

extract_text() 方法用于提取页面的文本内容。
8. 查找起始字符串和结束字符串的索引:

start_index = pdf_text.find(start_str) end_index = pdf_text.find(end_str)
  • 1
  1. 提取两个字符串之间的文本:
if start_index != -1 and end_index != -1 and start_index < end_index: between_text = pdf_text[start_index + len(start_str):end_index] text += between_text
  • 1

如果起始字符串和结束字符串都被找到,并且起始索引位于结束索引之前,则使用切片操作提取它们之间的文本。提取的文本被追加到 text 变量中。
10. 返回累积的文本:

return text
  • 1

函数返回从每一页中提取的所有文本的组合。
11. 使用示例:

pdf_files = ['file1.pdf', 'file2.pdf'] start_str = "开始字符串" end_str = "结束字符串" for pdf_file in pdf_files: between_text = extract_text_between_substring(pdf_file, start_str, end_str) print(between_text)
  • 1

这部分代码展示了如何使用定义的函数。它定义了一个 PDF 文件列表 pdf_files,以及要查找的起始和结束字符串。然后,它遍历文件列表,对每个文件调用 extract_text_between_substring 函数,并打印提取的文本。

需要注意的是,extract_text() 方法可能不会总是返回准确的文本,特别是对于包含复杂布局或图形元素的 PDF 文件。此外,如果 PDF 文件是加密的或者文本被渲染为图像,这种方法可能不适用,需要使用 OCR 技术来提取文本。


4提取文件夹中指定的文件形成list

import os
import fnmatch

def get_files_with_pattern(directory, pattern):
    matched_files = []
    for root, dirs, files in os.walk(directory):
        for file in files:
            if fnmatch.fnmatch(file, pattern):
                matched_files.append(os.path.join(root, file))
    return matched_files

# 使用示例
directory = '/path/to/your/directory'  # 替换为您的目录路径
pattern = '*中期票据募集说明书*'  # 替换为您要匹配的模式
file_list = get_files_with_pattern(directory, pattern)

# 打印文件列表
for file in file_list:
    print(file)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

在这个示例中,get_files_with_pattern函数接受两个参数:directory是您想要搜索的目录路径,pattern是您想要匹配的文件名模式。函数使用os.walk()来遍历目录及其所有子目录,并通过fnmatch.fnmatch()来检查每个文件名是否匹配给定的模式。


错误提示1’_VirtualList’ object is not callable

for page_num in range(len(pdf_reader.pages)):
            page = pdf_reader.pages(page_num)
            pdf_text = page.extract_text()

  • 1
  • 2
  • 3
  • 4

运行结果显示错误:TypeError: ‘_VirtualList’ object is not callable

PyPDF2 库中,PdfFileReader 对象的 pages 属性是一个虚拟列表,可以通过索引来访问,但它并不是一个函数,所以不能像函数那样被调用。错误提示 TypeError: '_VirtualList' object is not callable 就是因为尝试像调用函数那样调用了 pdf_reader.pages(page_num)

正确的方式是直接使用索引来访问 pages 虚拟列表中的每一项,而不是尝试调用它。以下是修改后的代码:

for page_num in range(len(pdf_reader.pages)):
    page = pdf_reader.pages[page_num]  # 正确的访问方式
    pdf_text = page.extract_text()
    # ... 处理文本 ...
  • 1
  • 2
  • 3
  • 4

在这个修改后的代码中,我们使用 pdf_reader.pages[page_num] 来获取第 page_num 页的内容,而不是尝试调用 pdf_reader.pages(page_num)。这样就可以避免 TypeError 并正确地从 PDF 文件的每一页提取文本了。

运行结果如图:

截取的是目录部分,很显然不是我们需要的


4提取特定字符串第二次出现时的中间文本

代码如下:

import re

def extract_text_between_second_occurrences(file_path, start_str, end_str, middle_str):
    # 读取文件内容
    with open(file_path, 'r', encoding='utf-8') as file:
        text = file.read()

    # 找到目标字符串的所有出现位置
    matches = re.finditer(re.escape(start_str) + '.*?' + re.escape(middle_str) + '.*?' + re.escape(end_str), text)

    # 如果找到匹配,并且至少有两次出现,则提取第二次出现的文本
    for i, match in enumerate(matches):
        if i == 1:  # 第二次出现
            start_index = match.end(len(start_str))
            end_index = match.start(len(start_str) + len(middle_str))
            between_text = text[start_index:end_index]
            return between_text

    return "没有找到第二次出现的模式。"

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
start_str = "第二章"
end_str = "第三章"
middle_str = "利率风险" 

for pdf_file in pdf_list:
    between_text = extract_text_between_second_occurrences(pdf_file, start_str, end_str, middle_str)
    print(between_text)
    

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

错误提示2:‘utf-8’ codec can’t decode byte 0xe2 in position 10: invalid continuation byte

是编码选择错误

发现是ANSI格式,更改代码

with open(file_path, 'r', encoding='ANSI') as file:
    text = file.read()
  • 1
  • 2

错误提示3:‘mbcs’ codec can’t decode bytes in position 0–1: No mapping for the Unicode character exists in the target code page.

表示在尝试使用 MBCS(多字节字符集)编码读取文件时,遇到了无法映射到目标代码页的字节序列。

修改代码

# 检测文件编码
with open(file_path, 'rb') as file:
    content = file.read()
    result = chardet.detect(content)
    encoding = result['encoding']

# 使用检测到的编码读取文件
with open(file_path, 'r', encoding=encoding) as file:
    text = file.read()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

仍然报错,只能选择忽略

# 用替代字符替换无法解码的字节
with open('file_path', 'r', encoding='gbk', errors='replace') as file:
    content = file.read()
  • 1
  • 2
  • 3

可是最终结果仍然是失败,可能因为re正则表达式无法匹配编码格式

5换用pypdf2处理

import PyPDF2

def extract_text_between_second_occurrence(pdf_path, start_str, middle_str, end_str):
    # 初始化文本内容和出现位置列表
    full_text = ""
    occurrence_positions = []
    
    # 打开PDF文件
    with open(pdf_path, 'rb') as pdf_file:
        pdf_reader = PyPDF2.PdfReader(pdf_file)
        
        # 遍历PDF的每一页并提取文本
        for page_num in range(len(pdf_reader.pages)):
            page = pdf_reader.pages[page_num]
            text = page.extract_text()
            full_text += text  # 添加到完整文本内容
            position = full_text.find(start_str)  # 查找起始字符串的位置
            if position != -1:
                occurrence_positions.append(position)  # 添加到出现位置列表

    # 检查起始字符串是否至少出现了两次
    if len(occurrence_positions) < 2:
        return "起始字符串出现次数不足两次。"

    # 找到第二次出现的起始位置和结束位置
    second_start = occurrence_positions[1]
    first_end = occurrence_positions[0] + len(start_str)
    
    # 提取两次出现之间的文本
    between_text = full_text[first_end:second_start]
    
    return between_text
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

运行结果为空集。可能还是编码问题

6用pdfminer.six 库提取PDF文本

from pdfminer.high_level import extract_text

def extract_text_between_second_occurrence_with_pdfminer(pdf_path, start_str, end_str):
    text = extract_text(pdf_path)
    start_positions = [m.start() for m in re.finditer(start_str, text)]
    end_positions = [m.start() for m in re.finditer(end_str, text)]
    
    if len(start_positions) < 2 or len(end_positions) < 2:
        return "起始字符串或结束字符串出现次数不足两次。"
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

[外链图片转存中...(img-argxgFbF-1712510594929)]

 

[外链图片转存中...(img-rZTOr2Kl-1712510594930)]

![img](https://img-blog.csdnimg.cn/img_convert/46506ae54be168b93cf63939786134ca.png)

![img](https://img-blog.csdnimg.cn/img_convert/252731a671c1fb70aad5355a2c5eeff0.png)

![img](https://img-blog.csdnimg.cn/img_convert/6c361282296f86381401c05e862fe4e9.png)

![img](https://img-blog.csdnimg.cn/img_convert/9f49b566129f47b8a67243c1008edf79.png)

 

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!**

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

**如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)**

_convert/6c361282296f86381401c05e862fe4e9.png)

![img](https://img-blog.csdnimg.cn/img_convert/9f49b566129f47b8a67243c1008edf79.png)

 

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!**

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

**如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)**

<img src="https://img-community.csdnimg.cn/images/fd6ebf0d450a4dbea7428752dc7ffd34.jpg" alt="img" style="zoom:50%;" />
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/975461
推荐阅读
相关标签
  

闽ICP备14008679号