使用PyPDF2检测PDF中的嵌入子集字体

2024-04-19 21:51:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用PyPDF2修改了以下脚本,以遍历PDF并确定PDF是否包含未嵌入的字体。它用于计算PDF中所有字体的列表,以及嵌入哪些字体。但是,有些PDF中只有所用字体的子集被嵌入(请参见https://blogs.mtu.edu/gradschool/2010/04/27/how-to-determine-if-fonts-are-embedded/)-如何确定PDF中是否嵌入了字体的子集?谢谢大家!

from PyPDF2 import PdfFileReader
import sys

fontkeys = set(['/FontFile', '/FontFile2', '/FontFile3'])

def walk(obj, fnt, emb):
    if '/BaseFont' in obj:
        fnt.add(obj['/BaseFont'])

    elif '/FontName' in obj and fontkeys.intersection(set(obj)):
        emb.add(obj['/FontName'])

    for k in obj:
        if hasattr(obj[k], 'keys'):
            walk(obj[k], fnt, emb)
        if type(obj) == PyPDF2.generic.ArrayObject:  # You can also do ducktyping here
            for i in obj:
                if hasattr(i, 'keys'):
                    walk(i, all_fonts, embedded_fonts)


    return fnt, emb

if __name__ == '__main__':
    fname = sys.argv[1]
    pdf = PdfFileReader(fname)
    fonts = set()
    embedded = set()

    for page in pdf.pages:
        obj = page.getObject()
        f, e = walk(obj['/Resources'], fonts, embedded)
        fonts = fonts.union(f)
        embedded = embedded.union(e)

    unembedded = fonts - embedded
    print 'Font List'
    pprint(sorted(list(fonts)))
    if unembedded:
        print '\nUnembedded Fonts'
        pprint(unembedded)

Tags: inobjforifpdf字体fonts子集
1条回答
网友
1楼 · 发布于 2024-04-19 21:51:55

按照惯例,PDF文件中子集字体的PostScript名称以XXXXXX+开头,其中“X”是任何大写ASCII字符

参见PDF参考手册(1.7版)第5.3节

此外,字体描述符中的字符集或CIDSet可用于指示子集字体(两者都是可选的)

然而,所有这些都是“约定”,没有实际的保证方法来确保没有这些约定的字体实际上不是子集字体

相关问题 更多 >