【发布时间】:2020-07-07 14:35:33
【问题描述】:
我希望有人可以帮助我编写一个 Python 函数来检测文件中未嵌入文件中的任何字体。我尝试使用链接here 的脚本,它可以检测文档字体,但它不检测嵌入的字体。为方便起见,我粘贴了下面的脚本:
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)
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)
例如,我从 Google Docs 下载了带有 Arial 字体的 PDF(键入一些内容,另存为 PDF),并且 Adobe Reader 已确认该字体已嵌入。但是,该脚本将 ['/ArialMT'] 作为字体返回,并为嵌入字体返回一个空集。此外,看起来任何递归对象都没有键 {'/FontFile', '/FontFile2', '/FontFile3'}。我已经在其他 PDF 上尝试过它并且它可以工作,所以 Google Docs PDF 一定很奇怪。让我知道我可以为此 PDF 文件提供哪些其他调试信息。
我想到的一件事是,Google Docs 可能只嵌入了 14 种标准 PDF 字体中没有的字体。但是,我尝试使用一种奇怪的字体(pacifico),并且脚本还指出该字体没有嵌入,而 Adobe 声称它是。
我用this PDF试了一下,脚本正确地指出嵌入了这14种字体。
【问题讨论】:
标签: python pdf fonts google-docs pypdf2