Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PDFminer:使用字体信息提取文本_Python_Text Extraction_Pdfminer - Fatal编程技术网

Python PDFminer:使用字体信息提取文本

Python PDFminer:使用字体信息提取文本,python,text-extraction,pdfminer,Python,Text Extraction,Pdfminer,我找到了,但它使用命令行,我不想在命令行中使用子进程调用Python脚本并解析HTML文件来获取字体信息 #!/usr/bin/env python from pdfminer.pdfparser import PDFParser from pdfminer.pdfdocument import PDFDocument from pdfminer.pdfpage import PDFPage from pdfminer.pdfinterp import PDFResourceManager fr

我找到了,但它使用命令行,我不想在命令行中使用子进程调用Python脚本并解析HTML文件来获取字体信息

#!/usr/bin/env python
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfinterp import PDFResourceManager
from pdfminer.pdfinterp import PDFPageInterpreter
from pdfminer.layout import LAParams
from pdfminer.converter import PDFPageAggregator
import pdfminer


def createPDFDoc(fpath):
    fp = open(fpath, 'rb')
    parser = PDFParser(fp)
    document = PDFDocument(parser, password='')
    # Check if the document allows text extraction. If not, abort.
    if not document.is_extractable:
        raise "Not extractable"
    else:
        return document


def createDeviceInterpreter():
    rsrcmgr = PDFResourceManager()
    laparams = LAParams()
    device = PDFPageAggregator(rsrcmgr, laparams=laparams)
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    return device, interpreter


def parse_obj(objs):
    for obj in objs:
        if isinstance(obj, pdfminer.layout.LTTextBox):
            for o in obj._objs:
                if isinstance(o,pdfminer.layout.LTTextLine):
                    text=o.get_text()
                    if text.strip():
                        for c in  o._objs:
                            if isinstance(c, pdfminer.layout.LTChar):
                                print "fontname %s"%c.fontname
        # if it's a container, recurse
        elif isinstance(obj, pdfminer.layout.LTFigure):
            parse_obj(obj._objs)
        else:
            pass


document=createPDFDoc("/tmp/simple.pdf")
device,interpreter=createDeviceInterpreter()
pages=PDFPage.create_pages(document)
interpreter.process_page(pages.next())
layout = device.get_result()


parse_obj(layout._objs)

我想把PDFminer用作一个库,我发现,但它们都是关于提取纯文本的,没有其他信息,如字体名称、字体大小等,它可以根据您的需要提取字体信息,并且有一个Python库,您可以在脚本中导入并使用它。

这种方法不使用PDFMiner,但可以做到这一点

首先,将PDF文档转换为docx。然后可以使用检索字体信息。下面是一个获取所有粗体文本的示例

from docx import *

document = Document('/path/to/file.docx')

for para in document.paragraphs:
    for run in para.runs:
        if run.bold:
            print run.text

如果你真的想使用PDFMiner,你可以试试。传递'-t'会将PDF转换为HTML,并包含所有字体信息。

一些信息位于较低级别的LTChar类中。这似乎合乎逻辑,因为字体大小、斜体、粗体等可以应用于单个字符

#!/usr/bin/env python
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfinterp import PDFResourceManager
from pdfminer.pdfinterp import PDFPageInterpreter
from pdfminer.layout import LAParams
from pdfminer.converter import PDFPageAggregator
import pdfminer


def createPDFDoc(fpath):
    fp = open(fpath, 'rb')
    parser = PDFParser(fp)
    document = PDFDocument(parser, password='')
    # Check if the document allows text extraction. If not, abort.
    if not document.is_extractable:
        raise "Not extractable"
    else:
        return document


def createDeviceInterpreter():
    rsrcmgr = PDFResourceManager()
    laparams = LAParams()
    device = PDFPageAggregator(rsrcmgr, laparams=laparams)
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    return device, interpreter


def parse_obj(objs):
    for obj in objs:
        if isinstance(obj, pdfminer.layout.LTTextBox):
            for o in obj._objs:
                if isinstance(o,pdfminer.layout.LTTextLine):
                    text=o.get_text()
                    if text.strip():
                        for c in  o._objs:
                            if isinstance(c, pdfminer.layout.LTChar):
                                print "fontname %s"%c.fontname
        # if it's a container, recurse
        elif isinstance(obj, pdfminer.layout.LTFigure):
            parse_obj(obj._objs)
        else:
            pass


document=createPDFDoc("/tmp/simple.pdf")
device,interpreter=createDeviceInterpreter()
pages=PDFPage.create_pages(document)
interpreter.process_page(pages.next())
layout = device.get_result()


parse_obj(layout._objs)
更多信息请点击此处:


但是我仍然对本类中没有的字体颜色感到困惑

如果您想使用PDF miner库从PDF文件中获取字体大小或字体名称,您必须解释整个PDF页面。您应该决定要获取哪个单词、短语的字体大小和字体名称(在一个页面上,您可以有多个不同字体大小的单词)。页面使用PDF miner的结构: PDFPageInterpreter->LTTextBox->LTChar 找到要获取字体大小的单词后,请调用: 字号的大小方法(实际上是高度),字体的字体名称。 代码应该如下所示,您传递pdf文件路径、要获取其字体大小的单词和页码(搜索的单词在哪一页):


您可以检查LTChar类支持哪些其他属性

我希望这可以帮助您:)

获取字体系列:

if isinstance(c, pdfminer.layout.LTChar):
    print (c.fontname)
获取字体大小:

if isinstance(c, pdfminer.layout.LTChar):
    print (c.size)
获取字体位置:

if isinstance(c, pdfminer.layout.LTChar):
    print (c.bbox)
获取图像的信息:

if isinstance(obj, pdfminer.layout.LTImage):
outputImg = "<Image>\n"
outputImg += ("name: %s, " % obj.name)
outputImg += ("x: %f, " % obj.bbox[0])
outputImg += ("y: %f\n" % obj.bbox[1])
outputImg += ("width1: %f, " % obj.width)
outputImg += ("height1: %f, " % obj.height)
outputImg += ("width2: %f, " % obj.stream.attrs['Width'])
outputImg += ("height2: %f\n" % obj.stream.attrs['Height'])
print (outputImg)
如果存在(对象、pdfminer.layout.LTImage):
outputImg=“\n”
outputImg+=(“名称:%s,”%obj.name)
outputImg+=(“x:%f,%obj.bbox[0])
outputImg+=(“y:%f\n”%obj.bbox[1])
outputImg+=(“宽度1:%f,”%obj.width)
outputImg+=(“高度1:%f,”%obj.height)
outputImg+=(“宽度2:%f,“%obj.stream.attrs['Width']))
outputImg+=(“高度2:%f\n”%obj.stream.attrs['Height'])
打印(输出)

但是,在将PDF转换为docx时,可能会丢失相关信息?是否有可靠的库可用于将PDF转换为docx?这可用于获取字体名称,但不能获取字体大小或其他属性(斜体、粗体等)@Agargara您是否找到了从pdf获取
字体大小
以及其他属性的方法?@Pramesbajracharya我最终编辑了pdfminer源代码以获取字体大小。请参阅:但是,请注意,由于上标等原因,该值可能仍然不是实际的字体大小。非常有趣的问题,您是否已经解决了这个问题?您能否帮助我了解您是如何得出计算实际字体大小的公式的?