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                                      

(Аналогичный ответ здесь , здесь и здесь , я постараюсь синхронизировать их.)

Другие вопросы по тегам