找回密码
 快速注册
搜索
查看: 49|回复: 2

PyMuPDF提取字体

[复制链接]

3149

主题

8386

回帖

6万

积分

$\style{scale:11;fill:#eff}꩜$

积分
65391
QQ

显示全部楼层

hbghlyj 发表于 2023-8-30 15:13 |阅读模式
本帖最后由 hbghlyj 于 2023-8-30 18:20 编辑 这个文件为例,运行pdffonts查看字体
  1. pdffonts U30000.pdf
复制代码

name                                 type              encoding         emb sub uni object ID
------------------------------------ ----------------- ---------------- --- --- --- ---------
BBEGCM+MyriadPro-Bold                Type 1C           Custom           yes yes yes      8  0
BBEGCO+MyriadPro-It                  Type 1C           Custom           yes yes yes     10  0
BBEGEA+Arial                         TrueType          WinAnsi          yes yes no      36  0
BBEGEC+UCSArialNarrow                TrueType          WinAnsi          yes yes no      37  0
BBEGED+CJKRadicals                   CID TrueType      Identity-H       yes yes yes     38  0
BBEGEE+CJKRadicals                   TrueType          WinAnsi          yes yes no      39  0
BBEGEF+UCS_G_ExtGv1                  CID TrueType      Identity-H       yes yes yes     40  0
BBEGFG+UCS_K_ExtGv1                  CID TrueType      Identity-H       yes yes yes     41  0
BBEGFH+UCS_UK_ExtGv1                 CID TrueType      Identity-H       yes yes yes     42  0
BBEGFI+UCS_USAT_ExtGv1               CID TrueType      Identity-H       yes yes yes     43  0
BBEGHJ+NomNaTong                     CID TrueType      Identity-H       yes yes yes     45  0
BBEGHK+UTCHanMedium                  CID TrueType      Identity-H       yes yes yes     46  0

要提取的字体BBEGEF+UCS_G_ExtGv1的编号为40
在PDF中找到
  1. 206 0 obj
  2. <</ProcSet[/PDF/Text]/Font<</F1 8 0 R/F3 10 0 R/TT4 36 0 R/TT6 37 0 R/TT7 38 0 R/TT8 39 0 R/TT9 40 0 R/TT10 41 0 R/TT11 42 0 R/TT12 43 0 R/TT14 45 0 R/TT15 46 0 R>>/ExtGState<</GS1 12 0 R>>>>
  3. endobj
复制代码

所以xref为40的字体的名称为/TT9

3149

主题

8386

回帖

6万

积分

$\style{scale:11;fill:#eff}꩜$

积分
65391
QQ

显示全部楼层

 楼主| hbghlyj 发表于 2023-8-30 15:28
本帖最后由 hbghlyj 于 2023-8-30 16:51 编辑 这帖的方法查CMAP table
要查的字是"\uD880\uDFC0"
  1. import fitz
  2. doc = fitz.open("U30000.pdf")
  3. page = doc[13]
  4. font = "BBEGEF+UCS_G_ExtGv1"
  5. def get_key(xref,key):
  6.     return int(doc.xref_get_key(xref,key)[1].split()[0].replace("[", ""))
  7. for font_tuple in page.get_fonts():
  8.     if font_tuple[3]==font:
  9.         for line in doc.xref_stream(get_key(font_tuple[0],'ToUnicode')).decode().splitlines():
  10.             if "D880DFC0" in line:print(line)
复制代码

输出
  1. <07d4> <07d4> [<D880DFC0>]
复制代码

extract_font提取字体
  1. import fitz
  2. doc = fitz.open("U30000.pdf")
  3. name, ext, _, content = doc.extract_font(40)
  4. ofile = open(name + "." + ext, "wb")
  5. ofile.write(content)
  6. ofile.close()
复制代码
得到BBEGEF+UCS_G_ExtGv1.ttf

3149

主题

8386

回帖

6万

积分

$\style{scale:11;fill:#eff}꩜$

积分
65391
QQ

显示全部楼层

 楼主| hbghlyj 发表于 2023-8-30 16:51
本帖最后由 hbghlyj 于 2023-8-30 17:12 编辑
  1. import fitz
  2. doc = fitz.open("U30000.pdf")
  3. for line in doc.xref_stream(205).splitlines()[1185:1188]:
  4.     print(line.decode())
复制代码
就能精确定位到PDF打出这个字的代码:
  1. /TT9 1 Tf
  2. 21 0 0 21 111.24 691.62 Tm
  3. <07d4>Tj
复制代码

/TT9是1楼找出的字体码
07d4是2楼找出的字符码

手机版|悠闲数学娱乐论坛(第3版)

GMT+8, 2025-3-4 16:00

Powered by Discuz!

× 快速回复 返回顶部 返回列表