如何用Python从格式统一的多份PDF首页提取加粗作者名?
解决PDF第一页加粗作者名提取问题
PyPDF2提取的是纯文本,不会保留字体加粗这类格式信息,这就是你没法直接提取加粗作者名的核心原因。下面提供两种可行的解决方案:
方法1:用PyMuPDF(fitz)提取带格式的文本
PyMuPDF可以获取每个文本片段的字体属性,通过判断字体是否为粗体来筛选目标内容:
import fitz # 先安装依赖:pip install pymupdf def extract_bold_authors(pdf_path): doc = fitz.open(pdf_path) page = doc[0] # 取第一页 bold_texts = [] # 遍历页面内的文本块、行、文本片段 for block in page.get_text("dict")["blocks"]: if "lines" in block: for line in block["lines"]: for span in line["spans"]: # 通过字体标记或字体名判断是否为粗体 if (span["flags"] & 2) == 2 or "Bold" in span["font"]: bold_texts.append(span["text"].strip()) doc.close() # 根据你的PDF格式,筛选出作者名(比如排除加粗标题、期刊名等无关内容) return bold_texts # 调用示例 authors = extract_bold_authors("pdf_file") print(authors)
方法2:结合文本上下文与正则提取
如果你的PDF格式高度统一,加粗作者名和邮箱有固定位置关联(比如作者名在邮箱上方,或同一行的前缀部分),可以先定位邮箱,再匹配附近的文本:
import PyPDF2 import re def extract_author_from_context(pdf_path): reader = PyPDF2.PdfReader(pdf_path) page = reader.pages[0] text = page.extract_text() # 定位邮箱位置 email_pattern = r"\{([^}]+)\}" email_match = re.search(email_pattern, text) if not email_match: return None # 按行分割文本,匹配邮箱所在行的上下文 lines = text.split("\n") for idx, line in enumerate(lines): if email_match.group() in line: # 假设作者名在邮箱所在行的上一行,可根据实际排版调整 if idx > 0: return lines[idx-1].strip() else: return line.split(email_match.group())[0].strip() return None # 调用示例 author = extract_author_from_context("pdf_file") print(author)
注意事项
- 方法1需要根据PDF实际内容,对提取到的加粗文本做二次筛选,排除非作者名的加粗内容。
- 方法2依赖固定排版,若PDF格式有变动,需调整上下文匹配的逻辑。
内容的提问来源于stack exchange,提问作者merkle
相关产品推荐
相关产品推荐

