Используйте PyPDF2 для обнаружения встроенных подмножеств шрифтов в PDF - PullRequest
0 голосов
/ 27 апреля 2020

Я изменил следующий скрипт, используя 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)

1 Ответ

1 голос
/ 27 апреля 2020

По соглашению имя PostScript для шрифта подмножества в файле PDF имеет имя, начинающееся с XXXXXX +, где «X» - любой ASCII-символ в верхнем регистре.

См. Раздел 5.3 Справочного руководства PDF (версия 1.7)

Кроме того, наличие CharSet или CIDSet в дескрипторе шрифта может использоваться для обозначения поднабора шрифта (оба из них являются необязательными).

Однако все они являются «соглашениями». ', нет никакого реального гарантированного способа убедиться, что шрифт, который не имеет какое-либо из этих соглашений, на самом деле не является шрифтом подмножества.

...