PDF miner - извлечь размер шрифта?
Мне любопытно, можно ли использовать pdfminer для извлечения размера шрифта. Я думаю, что это будет полезно для разделения различных разделов. Я знаю, что есть обсуждение ниже, но мне любопытно, можно ли использовать pdfminer
Извлечение текста из PDF относительно форматирования (размер шрифта, тип и т. Д.)
в документации pdfminer сказано, что это возможно http://www.unixuser.org/~euske/python/pdfminer/
но когда я ввожу его в командную строку, я просто получаю текстовый документ. Я не вижу информации о шрифтах.
pdf2txt.py -o output.html samples/CentolaCV.pdf
например..
2008-13 Assistant Professor, Sloan School of Management, M.I.T.
2006-08 Robert Wood Johnson Scholar in Health Policy, Harvard University
2001-02 Visiting Scholar, The Brookings Institution
3 ответа
Попробуйте указать тип вывода файла с помощью -t
флаг:
pdf2txt.py -o output.html -t html samples/CentolaCV.pdf
Это должно вернуть HTML-файл с атрибутами стиля font-family и font-size.
РЕДАКТИРОВАТЬ: на самом деле, похоже, что окончание вывода может указать тип выходного файла без -t
флаг. Можете ли вы дать ссылку на файл PDF, из которого вы пытаетесь извлечь стиль шрифта?
Эта задача меня долго озадачила. Помимо извлечения информации о шрифтах, я также хотел запустить этот код в скрипте Python.
Хауэр, сегодня я смог это решить. Ниже я написал сценарий, который вызывает сценарий pdf2txt.py из командной строки, а затем извлекает информацию о шрифте из проанализированного PDF-файла и вновь созданного файла html.
import os
pathToScript = r'path\to\script\pdf2txt.py'
pathPDFinput = os.path.join(path\to\file, 'test.pdf')
pathHTMLoutput = os.path.join(path\to\file, 'test.html')
# call the pdf2txt.py from the command line
os.system('python {} -o {} -S {} -t html'.format(pathToScript, pathHTMLoutput, pathPDFinput))
Извлеките размер шрифта для каждого тега html:
# credits to akash karothiya:
# https://stackru.com/questions/39012739/need-to-extract-all-the-font-sizes-and-the-text-using-beautifulsoup/39015419#39015419
from bs4 import BeautifulSoup
import re
# open the html file
htmlData = open(pathHTMLoutput, 'r')
soup = BeautifulSoup(htmlData)
font_spans = [ data for data in soup.select('span') if 'font-size' in str(data) ]
output = []
for i in font_spans:
tup = ()
# extract fonts-size
fonts_size = re.search(r'(?is)(font-size:)(.*?)(px)',str(i.get('style'))).group(2)
# extract into font-family and font-style
fonts_family = re.search(r'(?is)(font-family:)(.*?)(;)',str(i.get('style'))).group(2)
# split fonts-type and fonts-style
try:
fonts_type = fonts_family.strip().split(',')[0]
fonts_style = fonts_family.strip().split(',')[1]
except IndexError:
fonts_type = fonts_family.strip()
fonts_style = None
tup = (str(i.text).strip(),fonts_size.strip(),fonts_type, fonts_style)
output.append(tup)
import pandas as pd
# create dataframe
df = pd.DataFrame(output, columns = ['text', 'fonts-size', 'fonts-type', 'fonts-style'])
Полное раскрытие, я являюсь одним из сопровождающих pdfminer.six . Это поддерживаемая сообществом версия pdfminer для Python 3.
В настоящее время pdfminer.six имеет несколько API для извлечения текста и информации из PDF. Для программного извлечения информации я бы посоветовал использовать
extract_pages()
. Это позволяет вам проверять все элементы на странице, упорядоченные в осмысленной иерархии, созданной алгоритмом макета.
Следующий пример представляет собой питонический способ отображения всех элементов в иерархии. Он использует файл simple1.pdf из каталога примеров файла pdfminer.six.
from pathlib import Path
from typing import Iterable, Any
from pdfminer.high_level import extract_pages
def show_ltitem_hierarchy(o: Any, depth=0):
"""Show location and text of LTItem and all its descendants"""
if depth == 0:
print('element fontname text')
print('------------------------------ -------------------- -----')
print(
f'{get_indented_name(o, depth):<30.30s} '
f'{get_optional_fontinfo(o):<20.20s} '
f'{get_optional_text(o)}'
)
if isinstance(o, Iterable):
for i in o:
show_ltitem_hierarchy(i, depth=depth + 1)
def get_indented_name(o: Any, depth: int) -> str:
"""Indented name of class"""
return ' ' * depth + o.__class__.__name__
def get_optional_fontinfo(o: Any) -> str:
"""Font info of LTChar if available, otherwise empty string"""
if hasattr(o, 'fontname') and hasattr(o, 'size'):
return f'{o.fontname} {round(o.size)}pt'
return ''
def get_optional_text(o: Any) -> str:
"""Text of LTItem if available, otherwise empty string"""
if hasattr(o, 'get_text'):
return o.get_text().strip()
return ''
path = Path('~/Downloads/simple1.pdf').expanduser()
pages = extract_pages(path)
show_ltitem_hierarchy(pages)
На выходе отображаются различные элементы в иерархии, имя и размер шрифта, если они доступны, а также текст, который содержит этот элемент.
element fontname text
------------------------------ -------------------- -----
generator
LTPage
LTTextBoxHorizontal Hello
LTTextLineHorizontal Hello
LTChar Helvetica 24pt H
LTChar Helvetica 24pt e
LTChar Helvetica 24pt l
LTChar Helvetica 24pt l
LTChar Helvetica 24pt o
LTChar Helvetica 24pt
LTAnno
LTTextBoxHorizontal World
LTTextLineHorizontal World
LTChar Helvetica 24pt W
LTChar Helvetica 24pt o
LTChar Helvetica 24pt r
LTChar Helvetica 24pt l
LTChar Helvetica 24pt d
LTAnno
LTTextBoxHorizontal Hello
LTTextLineHorizontal Hello
LTChar Helvetica 24pt H
LTChar Helvetica 24pt e
LTChar Helvetica 24pt l
LTChar Helvetica 24pt l
LTChar Helvetica 24pt o
LTChar Helvetica 24pt
LTAnno
LTTextBoxHorizontal World
LTTextLineHorizontal World
LTChar Helvetica 24pt W
LTChar Helvetica 24pt o
LTChar Helvetica 24pt r
LTChar Helvetica 24pt l
LTChar Helvetica 24pt d
LTAnno
LTTextBoxHorizontal H e l l o
LTTextLineHorizontal H e l l o
LTChar Helvetica 24pt H
LTAnno
LTChar Helvetica 24pt e
LTAnno
LTChar Helvetica 24pt l
LTAnno
LTChar Helvetica 24pt l
LTAnno
LTChar Helvetica 24pt o
LTAnno
LTChar Helvetica 24pt
LTAnno
LTTextBoxHorizontal W o r l d
LTTextLineHorizontal W o r l d
LTChar Helvetica 24pt W
LTAnno
LTChar Helvetica 24pt o
LTAnno
LTChar Helvetica 24pt r
LTAnno
LTChar Helvetica 24pt l
LTAnno
LTChar Helvetica 24pt d
LTAnno
LTTextBoxHorizontal H e l l o
LTTextLineHorizontal H e l l o
LTChar Helvetica 24pt H
LTAnno
LTChar Helvetica 24pt e
LTAnno
LTChar Helvetica 24pt l
LTAnno
LTChar Helvetica 24pt l
LTAnno
LTChar Helvetica 24pt o
LTAnno
LTChar Helvetica 24pt
LTAnno
LTTextBoxHorizontal W o r l d
LTTextLineHorizontal W o r l d
LTChar Helvetica 24pt W
LTAnno
LTChar Helvetica 24pt o
LTAnno
LTChar Helvetica 24pt r
LTAnno
LTChar Helvetica 24pt l
LTAnno
LTChar Helvetica 24pt d
LTAnno
(Аналогичный ответ здесь , здесь и здесь , я постараюсь синхронизировать их.)