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