python - 如何根据字体计算字符数?

标签 python pdf pdfminer

对于给定 PDF 文件中的每个页面,都可以列出所使用的字体:

$ pdffonts -f 10 -l 10 file.pdf
name                                 type              encoding         emb sub uni object ID
------------------------------------ ----------------- ---------------- --- --- --- ---------
[none]                               Type 3            Custom           yes no  no      12  0
DIIDPF+ArialMT                       CID TrueType      Identity-H       yes yes yes     95  0
DIIEDH+Arial                         CID TrueType      Identity-H       yes yes no     101  0
DIIEBG+TimesNewRomanPSMT             CID TrueType      Identity-H       yes yes yes    106  0
DIIEDG+Arial                         CID TrueType      Identity-H       yes yes no     112  0
Arial                                TrueType          WinAnsi          yes no  no     121  0

我需要根据 pdffonts 输出识别可能有问题的字体,并根据其字体计算字符数。我通过实现以下代码片段实现了它:

def count_fonts_ocurrencies_by_page(pdf_filepath):
    page_layout = next(extract_pages(pdf_filepath))

    fonts = []

    for element in page_layout:
        if isinstance(element, LTTextContainer):
            for text_line in element:
                for character in text_line:
                    if isinstance(character, LTChar):
                        fonts.append(character.fontname)

    return Counter(fonts)

我期待找到一种简单的方法来执行相同的操作(或关闭,我只需要知道单个 PDF 页面上的字体使用百分比等信息),而无需迭代每个字符(如果可能的话)或者可能不使用整个模块,例如 pdfminer,一次只用于一个功能和一个 PDF 页面。如果我可以使用 pdfminer 中的最少代码(重新)做类似的事情,也会很有帮助,因为它是以模块化方式构建的。

最佳答案

您可以尝试使用 pdffonts 同一包中的 pdftohtml,然后使用 xpath 考虑样式来解析 html 文件

pdftohtml -f 1 -l 1 -c -s -i -fontfullname fonts.pdf

生成的文档

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
<head>
<title>fonts-html.html</title>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
 <br/>
<style type="text/css">
<!--
    p {margin: 0; padding: 0;}  .ft10{font-size:16px;font-family:BAAAAA+NotoSans-CondensedExtraBold;color:#000000;}
    .ft11{font-size:16px;font-family:CAAAAA+DejaVuMathTeXGyre-Regular;color:#000000;}
    .ft12{font-size:13px;font-family:DAAAAA+Baekmuk-Headline;color:#000000;}
    .ft13{font-size:13px;font-family:EAAAAA+LMMono9-Regular;color:#000000;}
    .ft14{font-size:13px;font-family:FAAAAA+CantarellRegular;color:#000000;}
    .ft15{font-size:13px;font-family:GAAAAA+Courier;color:#000000;}
-->
</style>
</head>
<body bgcolor="#A0A0A0" vlink="blue" link="blue">
<div id="page1-div" style="position:relative;width:892px;height:1263px;">
<img width="892" height="1263" src="fonts001.png" alt="background image"/>
<p style="position:absolute;top:64px;left:86px;white-space:nowrap" class="ft10"><b>Font1</b></p>
<p style="position:absolute;top:91px;left:86px;white-space:nowrap" class="ft11">font3</p>
<p style="position:absolute;top:109px;left:86px;white-space:nowrap" class="ft12">font4</p>
<p style="position:absolute;top:124px;left:86px;white-space:nowrap" class="ft13">font5</p>
<p style="position:absolute;top:144px;left:86px;white-space:nowrap" class="ft14">font6</p>
<p style="position:absolute;top:163px;left:86px;white-space:nowrap" class="ft15">font7</p>
</div>
</body>
</html>

用python解析html并按字体计数字符(类属性)

from lxml import html                      
tree = html.parse(r'/home/luis/tmp/fonts-html.html')
eleList = tree.xpath("//p[@class='ft10']")
len(eleList[0].text_content())
# text length: 5 
eleList = tree.xpath("//p[@class[contains(.,'ft')]]")
eleList[0].get('class')
# class name: 'ft10'

关于python - 如何根据字体计算字符数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68340473/

相关文章:

php - 活泼 & wkhtmltopdf : page numbering in footer

python - 在 Python 中从 PDF 中提取超链接

python - pdfminer3k 在 PDFPage 中没有名为 create_pages 的方法

Python读取pdf页面的一部分

python - Django 管理员 : Accesing the parent instance within an Inline admin

python - 使用 BeautifulSoup 提取复选框输入对象的标签值,而不是Python中的 Mechanize

pdf - safari iframe 中的“application/pdf”blob 不显示,但 blob url 在 safari 内的单独选项卡中工作

c++ - 是否可以重新初始化 pdf 文件中的图形状态?

python - 使用 pandas 基于过滤和用户输入添加三列

python - 奇怪的 Tkinter 鼠标悬停行为