pdfminer:根据字体大小仅提取文本
pdfminer: extract only text according to font size
我只想从我的 pdf 文件中提取字体大小为 9.800000000000068
和 10.000000000000057
的文本。
下面的代码 returns 一个 pdf 文件的每个文本块及其字符的字体大小列表。
Extract_Data=[]
for page_layout in extract_pages(path):
print(page_layout)
for element in page_layout:
if isinstance(element, LTTextContainer):
for text_line in element:
for character in text_line:
if isinstance(character, LTChar):
Font_size=character.size
Extract_Data.append([Font_size,(element.get_text())])
给我一个 Extract_Data
列表,其中包含各种字体大小
[[9.800000000000068, 'aaa\n'], [11.0, 'dffg\n'], [10.000000000000057, 'bbb\n'], [10.0, 'hs\n'], [8.0, '2\n']]
示例:字体大小10.000000000000057
Extract_Data=[]
for page_layout in extract_pages(path):
print(page_layout)
for element in page_layout:
if isinstance(element, LTTextContainer):
for text_line in element:
for character in text_line:
if isinstance(character, LTChar):
if character.size == '10.000000000000057':
element.get_text()
Extract_Data.append(element.get_text())
Data = ''.join(map(str, Extract_Data))
给了我一个包含所有文本的 Data
列表。我怎样才能让它只提取字体大小 '10.000000000000057'
个字符?
['aaa\ndffg\nbbb\nhs\n2\n']
我还想集成到一个函数中,该函数对多个文件执行此操作,从而生成一个 pandas df,每个 pdf 有一行。
期望的输出:[['aaa\n bbb\n']]
。按照 eksewhere 的建议将像素转换为点 (int(character.size) * 72 / 96
) 没有帮助。也许这与此有关? https://github.com/pdfminer/pdfminer.six/issues/202
这是后面要集成的功能:
directory = 'C:/Users/Sample/'
resource_manager = PDFResourceManager()
for file in os.listdir(directory):
if not file.endswith(".pdf"):
continue
fake_file_handle = io.StringIO()
manager = PDFResourceManager()
device = PDFPageAggregator(manager, laparams=params)
interpreter = PDFPageInterpreter(manager, device)
device = TextConverter(interpreter, fake_file_handle, laparams=LAParams())
params = LAParams(detect_vertical=True, all_texts=True)
elements = []
with open(os.path.join(directory, file), 'rb') as fh:
parser = PDFParser(fh)
document = PDFDocument(parser, '')
if not document.is_extractable:
raise PDFTextExtractionNotAllowed
for page in enumerate (PDFPage.create_pages(document)):
for element in page:
Pdfminer 是错误的工具。
使用 pdfplumber(在后台使用 pdfminer)而不是 https://github.com/jsvine/pdfplumber,因为它具有过滤对象的实用功能(例如,根据您尝试执行的字体大小),而 pdfminer 是主要用于获取所有文本。
import pdfplumber
def get_filtered_text(file_to_parse: str) -> str:
with pdfplumber.open(file_to_parse) as pdf:
text = pdf.pages[0]
clean_text = text.filter(lambda obj: not (obj["object_type"] == "char" and obj["size"] != 9))
print(clean_text.extract_text())
get_filtered_text("./my_pdf.pdf")
我上面的例子比你的简单,因为它只检查字体大小 9.0,而你有
9.800000000000068 and 10.000000000000057
所以 obj["size"] 条件在你的情况下会更复杂
obj["size"]
的数据类型为 Decimal
(from decimal import Decimal
),因此您可能必须执行类似 obj["size"].compare(Decimal(9.80000000068)) == 0
的操作
我只想从我的 pdf 文件中提取字体大小为 9.800000000000068
和 10.000000000000057
的文本。
下面的代码 returns 一个 pdf 文件的每个文本块及其字符的字体大小列表。
Extract_Data=[]
for page_layout in extract_pages(path):
print(page_layout)
for element in page_layout:
if isinstance(element, LTTextContainer):
for text_line in element:
for character in text_line:
if isinstance(character, LTChar):
Font_size=character.size
Extract_Data.append([Font_size,(element.get_text())])
给我一个 Extract_Data
列表,其中包含各种字体大小
[[9.800000000000068, 'aaa\n'], [11.0, 'dffg\n'], [10.000000000000057, 'bbb\n'], [10.0, 'hs\n'], [8.0, '2\n']]
示例:字体大小10.000000000000057
Extract_Data=[]
for page_layout in extract_pages(path):
print(page_layout)
for element in page_layout:
if isinstance(element, LTTextContainer):
for text_line in element:
for character in text_line:
if isinstance(character, LTChar):
if character.size == '10.000000000000057':
element.get_text()
Extract_Data.append(element.get_text())
Data = ''.join(map(str, Extract_Data))
给了我一个包含所有文本的 Data
列表。我怎样才能让它只提取字体大小 '10.000000000000057'
个字符?
['aaa\ndffg\nbbb\nhs\n2\n']
我还想集成到一个函数中,该函数对多个文件执行此操作,从而生成一个 pandas df,每个 pdf 有一行。
期望的输出:[['aaa\n bbb\n']]
。按照 eksewhere 的建议将像素转换为点 (int(character.size) * 72 / 96
) 没有帮助。也许这与此有关? https://github.com/pdfminer/pdfminer.six/issues/202
这是后面要集成的功能:
directory = 'C:/Users/Sample/'
resource_manager = PDFResourceManager()
for file in os.listdir(directory):
if not file.endswith(".pdf"):
continue
fake_file_handle = io.StringIO()
manager = PDFResourceManager()
device = PDFPageAggregator(manager, laparams=params)
interpreter = PDFPageInterpreter(manager, device)
device = TextConverter(interpreter, fake_file_handle, laparams=LAParams())
params = LAParams(detect_vertical=True, all_texts=True)
elements = []
with open(os.path.join(directory, file), 'rb') as fh:
parser = PDFParser(fh)
document = PDFDocument(parser, '')
if not document.is_extractable:
raise PDFTextExtractionNotAllowed
for page in enumerate (PDFPage.create_pages(document)):
for element in page:
Pdfminer 是错误的工具。
使用 pdfplumber(在后台使用 pdfminer)而不是 https://github.com/jsvine/pdfplumber,因为它具有过滤对象的实用功能(例如,根据您尝试执行的字体大小),而 pdfminer 是主要用于获取所有文本。
import pdfplumber
def get_filtered_text(file_to_parse: str) -> str:
with pdfplumber.open(file_to_parse) as pdf:
text = pdf.pages[0]
clean_text = text.filter(lambda obj: not (obj["object_type"] == "char" and obj["size"] != 9))
print(clean_text.extract_text())
get_filtered_text("./my_pdf.pdf")
我上面的例子比你的简单,因为它只检查字体大小 9.0,而你有
9.800000000000068 and 10.000000000000057
所以 obj["size"] 条件在你的情况下会更复杂
obj["size"]
的数据类型为 Decimal
(from decimal import Decimal
),因此您可能必须执行类似 obj["size"].compare(Decimal(9.80000000068)) == 0