如何使用Python从PDF文件中提取指定的特定文本内容?
提取PDF中特定联系信息的PyPDF2解决方案
嘿,我看你已经用PyPDF2搭好基础框架了,接下来咱们直接针对你要的那段联系信息做精准提取就行。这里有两种靠谱的方法,你可以根据PDF里的文本排版情况选:
方法一:精准匹配固定文本段(适合文本连续无干扰的情况)
如果目标联系信息在PDF里是连续的一段(哪怕有换行,字符串里会保留换行符),你可以直接通过字符串切片来提取:
import PyPDF2 # 打开PDF文件 pdfFileObj = open('SPE7M518T446E.pdf', 'rb') pdfReader = PyPDF2.PdfFileReader(pdfFileObj) # 获取第0页的文本 pageObj1 = pdfReader.getPage(0) pagecontent = pageObj1.extract_text() # 定义目标文本的起始和结束标识 start_marker = "DLA LAND AND MARITIME ACTIVE DEVICES DIVISION" end_marker = "Desmond.Forshey@dla.mil" # 定位并提取目标文本 start_idx = pagecontent.find(start_marker) end_idx = pagecontent.find(end_marker) + len(end_marker) target_text = pagecontent[start_idx:end_idx] # 输出结果 print(target_text) # 关闭文件 pdfFileObj.close()
这个方法的核心是用find()找到目标文本的起始和结束位置,然后切片截取。如果PDF里的这段文本有换行,提取出来的target_text会保留换行格式,你可以用target_text.replace('\n', ' ')来统一成空格分隔。
方法二:正则表达式提取(适合排版有变化的情况)
如果PDF里的联系信息排版有零散换行(比如地址拆成多行、字段单独成行),用正则表达式匹配更灵活,能精准抓取每个字段:
import PyPDF2 import re # 打开PDF并获取页面文本 pdfFileObj = open('SPE7M518T446E.pdf', 'rb') pdfReader = PyPDF2.PdfFileReader(pdfFileObj) pageObj1 = pdfReader.getPage(0) pagecontent = pageObj1.extract_text() # 定义正则匹配规则,覆盖所有目标字段 pattern = r""" DLA LAND AND MARITIME ACTIVE DEVICES DIVISION\s+PO BOX 3990\s+COLUMBUS OH 43218-3990 USA \s+Name:\s*(.*?) \s+Buyer Code:\s*(.*?) \s+Tel:\s*(.*?) \s+Fax:\s*(.*?) \s+Email:\s*(.*?) """ # 使用re.DOTALL让.匹配换行符,re.VERBOSE忽略正则里的空格 match = re.search(pattern, pagecontent, re.DOTALL | re.VERBOSE) if match: # 提取所有字段 full_address = match.group(0).split('\n')[0] # 取地址部分 name = match.group(1).strip() buyer_code = match.group(2).strip() tel = match.group(3).strip() fax = match.group(4).strip() email = match.group(5).strip() # 整理输出 print("提取的联系信息:") print(full_address) print(f"Name: {name}") print(f"Buyer Code: {buyer_code}") print(f"Tel: {tel}") print(f"Fax: {fax}") print(f"Email: {email}") else: print("未找到目标联系信息") pdfFileObj.close()
这个方法能应对PDF文本里的换行、空格变化,还能把每个字段单独提取出来,方便后续处理。
小提示
- 如果目标文本不在第0页,你可以循环遍历所有页面(用
pdfReader.numPages获取总页数),逐个页面查找匹配。 - 如果PyPDF2提取文本效果不好(比如PDF是扫描件或加密的),可以试试
pdfplumber库,它的文本提取精度更高。
内容的提问来源于stack exchange,提问作者jone2




