【问题标题】:PDF miner - extract font size?PDF miner - 提取字体大小?
【发布时间】:2014-04-15 06:54:59
【问题描述】:

我很好奇是否可以使用 pdfminer 来提取字体大小。我认为这将有助于分离不同的部分。我知道下面有讨论,但我很好奇是否可以使用 pdfminer

Extract text from PDF in respect to formatting (font size, type etc)

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

【问题讨论】:

    标签: python pdf fonts


    【解决方案1】:

    这个任务让我困惑了很长时间。除了提取字体信息之外,我还想在 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://stackoverflow.com/questions/39012739/need-to-extract-all-the-font-sizes-and-the-text-using-beautifulsoup/39015419#39015419
    
    import re
    import pandas as pd
    from bs4 import BeautifulSoup
    
    # open the html file
    html = open(pathHTMLoutput, 'r')
    soup = BeautifulSoup(html)
    
    font_spans = [data for data in soup.select('span') if 'font-size' in str(data)]
    output = []
    for span in font_spans:
        fonts_size = re.search(r'(?is)(font-size:)(.*?)(px)', str(span.get('style'))).group(2)
        fonts_family = re.search(r'(?is)(font-family:)(.*?)(;)', str(span.get('style'))).group(2)
    
        # split fonts_family into 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
    
        output.append(
            (str(i.text).strip(), fonts_size.strip(), fonts_type, fonts_style)
        )
    
    # create dataframe
    df = pd.DataFrame(output, columns = ['text', 'fonts-size', 'fonts-type', 'fonts-style'])
    

    【讨论】:

      【解决方案2】:

      完全披露,我是pdfminer.six 的维护者之一。它是用于 python 3 的 pdfminer 的社区维护版本。

      现在,pdfminer.six 有多个 API 可以从 PDF 中提取文本和信息。对于以编程方式提取信息,我建议使用extract_pages()。这允许您检查页面上的所有元素,这些元素按布局算法创建的有意义的层次结构排序。

      以下示例是显示层次结构中所有元素的 Python 方式。它使用 pdfminer.six 的示例目录中的simple1.pdf

      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                                      
      

      (类似的答案 here, herehere ,我会尽量让它们保持同步。)

      【讨论】:

        【解决方案3】:

        尝试使用-t 标志指定文件输出类型:

        pdf2txt.py -o output.html -t html samples/CentolaCV.pdf

        这应该返回一个带有样式属性 font-family 和 font-size 的 html 文件。

        编辑:实际上,看起来输出结尾可以指定不带-t 标志的输出文件类型。您可以链接到您尝试从中提取字体样式的 pdf 文件吗?

        【讨论】:

        • 是否也可以获取字体粗细?我需要粗体字。
        猜你喜欢
        • 2018-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-31
        • 2023-03-05
        • 1970-01-01
        • 2019-03-22
        • 1970-01-01
        相关资源
        最近更新 更多