使用自定义字体从 pdf 中提取文本

问题描述 投票:0回答:1

我有一个大量的 PDF 文件,其中包含带有特定科学记数法的文本。我正在尝试使用 pdfplumber 提取文本。

首先,我注意到某些符号被提取为大写拉丁字符,而诸如“[”之类的技术符号和代码(例如,(cid:8))也存在。而且,相同的代码常常以不同的符号显示在文件中。我通过不仅收集每个符号的文本表示形式,还收集字体名称来解决这个问题。 但是,我现在想知道是否可以直接从 PDF 文件中提取编码。我的意思是获取以下格式的信息:{'symbol': 'e', 'font': 'ejdeij+4brane'} 显示为某种东西。

python pdf pdfplumber
1个回答
0
投票

听起来您在从 PDF 中提取文本时正在处理一些复杂的编码问题,尤其是符号和字体的表示方式有所不同。通过使用 pdfplumber 收集文本和字体信息,您的方向是正确的,但直接提取编码可能很棘手,因为 PDF 通常使用并不总是简单的自定义字体编码来对文本进行编码。

以下是一些可能有帮助的想法:

使用 pdfplumber 提取字体编码:虽然 pdfplumber 不直接公开字体编码信息,但您可以使用它来获取字体名称和符号。然而,仅使用 pdfplumber 无法轻松检索特定的字符编码(如 'symbol': 'e'、'font': 'ejdeij+4brane')。

使用 PyPDF2 进行更深入的分析:您可以将 pdfplumber 与 PyPDF2(另一个 PDF 操作库)结合起来,这使您可以更深入地了解 PDF 的结构和元数据。您可以解析字体对象,有时还可以获得编码映射。这是一个可能有帮助的片段:

从 PyPDF2 导入 PdfFileReader

def extract_fonts(pdf_path):
    reader = PdfFileReader(open(pdf_path, 'rb'))
    for page_num in range(reader.numPages):
        page = reader.getPage(page_num)
        if '/Font' in page['/Resources']:
            fonts = page['/Resources']['/Font']
            for font in fonts:
                font_obj = fonts[font]
                print(f"Font: {font}, Info: {font_obj}")

pdfrw 用于字体编码:另一个库 pdfrw 可以让您提取低级别的字体详细信息和编码信息。您可以解析 PDF 资源字典中的字体对象以获取编码信息。

考虑 pdfminer.6:如果您还没有尝试过,pdfminer.6 还可以从 PDF 中提取有关字体和编码的详细信息。当您需要了解哪些字符映射到哪些字形时,它效果很好:

from pdfminer.high_level import extract_pages
from pdfminer.layout import LTChar

def extract_text_with_fonts(pdf_path):
    for page_layout in extract_pages(pdf_path):
        for element in page_layout:
            if isinstance(element, LTChar):
                print(f"Character: {element.get_text()}, Font: {element.fontname}")

处理自定义编码:如果 PDF 使用自定义或子集字体(在科学论文中常见),每个字符的编码可能会有所不同,并且您需要手动将每个字形映射到 Unicode 字符。通常,此信息嵌入在字体的 /ToUnicode CMap 中,可以通过更高级的 PDF 解析技术来访问。

不幸的是,没有一种万能的解决方案,因为不同文件的 PDF 编码可能会有很大差异。您可能需要尝试组合使用这些库来提取您正在寻找的详细编码。

© www.soinside.com 2019 - 2024. All rights reserved.