using System;
using System.Collections.Generic;
using System.Text;
using iTextSharp.text.pdf;
using PDFPatcher.Processor;
namespace PDFPatcher.Model
{
static class PdfDocumentFont
{
///
/// 删除字体名称的子集前缀。
///
/// 字体名称。
internal static string RemoveSubsetPrefix(string name) {
return name.Length > 7 && name[6] == '+' ? name.Substring(7) : name;
}
///
/// 列举指定页面所用的字体。
///
/// 页面对应的 。
/// 用于放置字体名称的集合。
internal static void EnumerateFonts(PdfDictionary page, ICollection fonts) {
var fl = page.Locate(true, PdfName.RESOURCES, PdfName.FONT);
if (fl == null) {
return;
}
foreach (var item in fl) {
var fr = item.Value as PdfIndirectReference;
if (fr == null) {
continue;
}
var f = PdfReader.GetPdfObject(fr) as PdfDictionary;
var fn = f.GetAsName(PdfName.BASEFONT);
if (fn == null) {
continue;
}
fonts.Add(RemoveSubsetPrefix(PdfHelper.GetPdfNameString(fn)));
}
}
internal static bool HasEmbeddedFont(PdfDictionary font) {
var df = font.Locate(true, PdfName.DESCENDANTFONTS);
if (df == null) {
return IsEmbeddedFont(font);
}
if (df.Type == PdfObject.ARRAY) {
foreach (var item in (df as PdfArray).ArrayList) {
if (IsEmbeddedFont(PdfReader.GetPdfObjectRelease(item) as PdfDictionary) == false) {
return false;
}
}
return true;
}
df = PdfReader.GetPdfObjectRelease(df);
return df.Type == PdfObject.DICTIONARY && IsEmbeddedFont(df as PdfDictionary);
}
private static bool IsEmbeddedFont(PdfDictionary font) {
var fd = font.Locate(true, PdfName.FONTDESCRIPTOR);
if (fd == null) {
return false;
}
return fd.Contains(PdfName.FONTFILE) || fd.Contains(PdfName.FONTFILE2) || fd.Contains(PdfName.FONTFILE3);
}
}
}