import com.lowagie.text.*;
import com.lowagie.text.pdf.*;
import java.util.*;

public class DumpFontNames {
    
    static PdfReader reader;
    static TreeMap fontMap = new TreeMap();
    static final PdfName F1 = new PdfName("FontFile");
    static final PdfName F2 = new PdfName("FontFile2");
    static final PdfName F3 = new PdfName("FontFile3");
    
    public static void processResource(PdfDictionary resource) throws Exception {
        if (resource == null)
            return;
        PdfDictionary xos = (PdfDictionary)reader.getPdfObject(resource.get(PdfName.XOBJECT));
        if (xos != null) {
            for (Iterator it = xos.getKeys().iterator(); it.hasNext();) {
                PdfDictionary xo = (PdfDictionary)reader.getPdfObject(xos.get((PdfName)it.next()));
                processResource((PdfDictionary)reader.getPdfObject(xo.get(PdfName.RESOURCES)
                ));
            }
        }
        PdfDictionary fonts = (PdfDictionary)reader.getPdfObject(resource.get(PdfName.FONT));
        if (fonts == null)
            return;
        for (Iterator it = fonts.getKeys().iterator(); it.hasNext();) {
            PdfDictionary font = (PdfDictionary)reader.getPdfObject(fonts.get((PdfName)it.next()));
            String name = ((PdfName)reader.getPdfObject(font.get(PdfName.BASEFONT))).toString();
            if (name.length() > 8 && name.charAt(7) == '+') {
                name = name.substring(8) + " subset";
            }
            else {
                name = name.substring(1);
                PdfDictionary desc = (PdfDictionary)reader.getPdfObject(font.get(PdfName.FONTDESCRIPTOR));
                if (desc != null) {
                    if (desc.get(F1) != null || desc.get(F2) != null || desc.get(F3) != null)
                        name += " embedded";
                }
                else
                    name += " nofontdescriptor";
            }
            fontMap.put(name, null);
        }
    }
    
    public static void main(String[] args) {
        if (args.length < 1) {
            System.err.println("Dumps the font names and the embedded status.");
            System.err.println("The embedded status can be: 'embedded', 'subset' and 'nofontdescriptor'.");
            System.err.println("usage: java DumpFontNames pdf_file");
            return;
        }
        try {
            reader = new PdfReader(args[0]);
            for (int k = 1; k <= reader.getNumberOfPages(); ++k) {
                PdfDictionary page = reader.getPageN(k);
                processResource((PdfDictionary)reader.getPdfObject(page.get(PdfName.RESOURCES)));
            }
            for (Iterator it = fontMap.keySet().iterator(); it.hasNext();)
                System.out.println((String)it.next());
        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }
}